Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
351 commits
Select commit Hold shift + click to select a range
6415b55
fix(linux-structure): open one review at a time for a structure tab
datlechin Oct 14, 2026
509353c
fix(linux): stop a close's saves at the first declined review
datlechin Oct 14, 2026
6289b00
fix(linux-structure): refuse a save whose draft changed during review
datlechin Oct 14, 2026
485f005
refactor(linux): lay out a review's SQL as the plan preview does
datlechin Oct 14, 2026
334802b
Merge branch 'g2/sqlitefiles' into refactor/linux-group2
datlechin Oct 14, 2026
ae3ec59
style(linux): sort test support modules
datlechin Oct 14, 2026
b3edcc2
test(linux): store the read-only entry the location test opens
datlechin Oct 14, 2026
5d65e35
Merge branch 'g2/review' into refactor/linux-group2
datlechin Oct 14, 2026
a1f4f66
Merge branch 'g2/keyboard' into refactor/linux-group2
datlechin Oct 14, 2026
aabcf51
Merge branch 'g2/restore' into refactor/linux-group2
datlechin Oct 14, 2026
b06739a
fix(linux): restore the last sessions before opening handed-over files
datlechin Oct 14, 2026
0ef716d
fix(linux-grid): let go of the focus in a row the list removes
datlechin Oct 14, 2026
cbd92a2
fix(linux): close each dialog only once
datlechin Oct 14, 2026
4d65d32
refactor(linux-grid): draw cells from borrowed text in data-table rows
datlechin Oct 14, 2026
f842907
test(linux): run the open_files test, which the harness skipped
datlechin Oct 14, 2026
dfc918d
docs(linux): document the application, windows and sessions
datlechin Oct 14, 2026
99fa3a7
feat(linux): classify SQL that carries credentials for history
datlechin Oct 14, 2026
5b77af1
feat(linux-storage): add the save-query-history setting
datlechin Oct 14, 2026
46b0b61
feat(linux): turn off query history and skip credential statements
datlechin Oct 14, 2026
3ad7fbc
perf(linux-grid): own each browse page once and load it in one splice
datlechin Oct 14, 2026
bf8dc7a
fix(linux): hand over a credential prompt's Connect, not a cancel
datlechin Oct 14, 2026
a58a4eb
test(linux): answer test alerts by clicking their button
datlechin Oct 14, 2026
af488c2
docs(linux): say what a second launch forwards and when closed fires
datlechin Oct 14, 2026
fadd32c
ci(linux): check the paths and types the app docs name
datlechin Oct 14, 2026
e4d4a2e
fix(linux): read routine strings, /*! comments and OPENROWSET calls
datlechin Oct 14, 2026
2463114
fix(linux): add the credential carriers each engine was missing
datlechin Oct 14, 2026
2d98eb5
fix(linux-editor): judge a run's history entry by its own engine
datlechin Oct 14, 2026
c39ac16
Merge branch 'g2/grid' into refactor/linux-group2
datlechin Oct 14, 2026
44c0813
Merge branch 'g2/history' into refactor/linux-group2
datlechin Oct 14, 2026
f8b4bbd
Merge branch 'g2/docs' into refactor/linux-group2
datlechin Oct 14, 2026
2e8719e
feat(linux): build the About dialog from the app metainfo
datlechin Oct 14, 2026
ec7b085
test(linux): pass the settings and askpass tests in one test process
datlechin Oct 14, 2026
96e7765
feat(linux-core): add streaming CSV, TSV, JSON and Markdown encoders
datlechin Oct 14, 2026
b9bfa1e
fix(linux-grid): refresh browse tabs in place and keep the last good …
datlechin Oct 14, 2026
bad15f2
fix(linux-grid): fail browse tabs on unreadable columns, refetch on r…
datlechin Oct 14, 2026
9aec693
build(linux): ship third-party license notices
datlechin Oct 14, 2026
a1287c3
fix(linux): keep loaded structure on screen when a structure read fails
datlechin Oct 14, 2026
c1ab8a9
Merge commit 'ec7b08570' into refactor/linux-group3
datlechin Oct 14, 2026
b5d7f18
Merge origin/linux (#3413 squash, same tree as ec7b08570) into refact…
datlechin Oct 14, 2026
d2ad801
feat(linux): stream exports to disk off the GTK thread with progress
datlechin Oct 14, 2026
493b5d2
feat(linux-grid): show row count estimates and count exact totals on …
datlechin Oct 14, 2026
275c6d1
Merge remote-tracking branch 'origin/linux' into refactor/linux-group3
datlechin Oct 14, 2026
bcc2ab6
chore(linux): skip license text in the banned-words diff check
datlechin Oct 14, 2026
38f83cd
feat(linux-grid): copy rows as typed clipboard data off the GTK thread
datlechin Oct 14, 2026
769d669
test(linux): run the history preference test on the GTK thread
datlechin Oct 14, 2026
ddc895d
fix(linux): give license notices each crate's own copyright lines
datlechin Oct 14, 2026
2ea1200
build(linux): embed the translated metainfo Meson installs
datlechin Oct 14, 2026
e38c717
refactor(linux): drop the section count add_legal_sections returned
datlechin Oct 14, 2026
a35f9ac
refactor(linux): route every shortcut through one accelerator table
datlechin Oct 14, 2026
396f7db
test(linux): press real keys through XTEST in the shortcut tests
datlechin Oct 14, 2026
23285b2
fix(linux-grid): keep rows behind a browse error page out of reach
datlechin Oct 14, 2026
a8a99ef
fix(linux-grid): run a row count only when the estimate or user asks
datlechin Oct 14, 2026
3046cd8
fix(linux-grid): move to the new last page when a save empties a page
datlechin Oct 14, 2026
9205d7d
fix(linux-grid): give each browse column read its own page recheck
datlechin Oct 14, 2026
da116d4
fix(linux): ask for Retry when a structure edit waits on a failed read
datlechin Oct 14, 2026
e5b2d52
chore(linux): say why the number format cache is no window state
datlechin Oct 14, 2026
65a067a
fix(linux-grid): drop a copy that lands after a later one
datlechin Oct 14, 2026
569ff86
fix(linux): clean up the file when an export's close fails
datlechin Oct 14, 2026
5b676b0
perf(linux-core): keep one CSV writer per encoder, not one per row
datlechin Oct 14, 2026
5ff7060
docs(linux): say what ReplaceFileWriter keeps and drop a false fix
datlechin Oct 14, 2026
f6f6f76
Merge remote-tracking branch 'origin/linux' into refactor/linux-group3
datlechin Oct 14, 2026
3d0446b
fix(linux): announce the keys of the browse tab buttons
datlechin Oct 14, 2026
9eab9b5
fix(linux): turn off the selection keys when a new page drops the rows
datlechin Oct 14, 2026
324a3e0
fix(linux): refuse a new row in a read-only table tab from any sender
datlechin Oct 14, 2026
587ad43
docs(linux): correct notes the tab-local shortcuts made stale
datlechin Oct 14, 2026
e6cfa62
Merge branch 'g3/browse' into refactor/linux-group3
datlechin Oct 14, 2026
0ea8c38
Merge branch 'g3/export' into refactor/linux-group3
datlechin Oct 14, 2026
eace9da
Merge branch 'g3/shell' into refactor/linux-group3
datlechin Oct 14, 2026
d5927f1
Merge branch 'g3/about' into refactor/linux-group3
datlechin Oct 14, 2026
3bcdf3e
build(linux): add the icu crates to the license notices
datlechin Oct 14, 2026
2acafae
refactor(linux): split header bars per pane, tab overview at the root
datlechin Oct 14, 2026
ab7ece5
feat(linux-session): add an export operation kind with no deadline
datlechin Oct 14, 2026
cbd0ba7
feat(linux): export whole tables and complete query results
datlechin Oct 14, 2026
0faff15
feat(linux-history): search by substring and page results in a list view
datlechin Oct 14, 2026
eaaa78e
fix(linux-history): list connections that have history and undo deletes
datlechin Oct 14, 2026
3b97603
feat(linux): show editor result row limits with a banner and Export All
datlechin Oct 14, 2026
6f6154c
refactor(linux-history): filter with drop-downs and a toggle group
datlechin Oct 14, 2026
9895e74
fix(linux): select the history database in Files instead of its folder
datlechin Oct 14, 2026
ef30ef2
test(linux-history): cover the Menu key on a focused history row
datlechin Oct 14, 2026
2a59897
feat(linux-grid): sort editor result grids by column header
datlechin Oct 14, 2026
ecc943e
feat(linux-editor): find and replace backed by GtkSourceSearchContext
datlechin Oct 14, 2026
18e6eaf
test(linux): reach the driver before cancelling in the window floor test
datlechin Oct 14, 2026
4352de0
fix(linux): resolve tab titles in one place, mark unsaved tabs by icon
datlechin Oct 14, 2026
b67ea0d
fix(linux-storage): read exported history entries in chunks of ids
datlechin Oct 14, 2026
0599886
fix(linux-history): read the next page right after a search or a delete
datlechin Oct 14, 2026
6b6ee32
fix(linux-history): toggle rows on click and pin without reloading
datlechin Oct 14, 2026
5de80e1
fix(linux): fail an export when a read ends Ok after its sink stopped
datlechin Oct 14, 2026
7215952
perf(linux): stream HTML, XML and SQL exports a row at a time
datlechin Oct 14, 2026
33e2f2b
fix(linux): say Export All runs without the editor's USE or SET
datlechin Oct 14, 2026
8439b04
fix(linux): refuse Excel for a table with more rows than a sheet holds
datlechin Oct 14, 2026
a067b78
refactor(linux-grid): sort every column that can hold text the same way
datlechin Oct 14, 2026
fa2e79b
fix(linux-grid): sort intervals by length, as PostgreSQL compares them
datlechin Oct 14, 2026
451325d
perf(linux-grid): compare decimals by reference when sorting
datlechin Oct 14, 2026
ffecffa
Merge branch 'g3/export2' into refactor/linux-group3
datlechin Oct 14, 2026
96b8795
Merge branch 'g3/history' into refactor/linux-group3
datlechin Oct 14, 2026
e3a997e
Merge branch 'g3/shell2' into refactor/linux-group3
datlechin Oct 14, 2026
37278c8
docs(linux): document editor runs, history search and structure review
datlechin Oct 14, 2026
5262098
ci(linux): check storage.md for names the tree no longer has
datlechin Oct 14, 2026
3b48680
docs(linux): correct storage errors, script batches and test notes
datlechin Oct 14, 2026
32b8511
feat(linux-sidebar): list every schema's tables in a recycling list
datlechin Oct 14, 2026
b1a100c
feat(linux-grid): show pending changes without colour, name NULL cells
datlechin Oct 14, 2026
dc7c552
feat(linux): label icon-only buttons for screen readers
datlechin Oct 14, 2026
8becb8f
fix(linux-picker): show connection changes in every window's picker
datlechin Oct 14, 2026
55a7c11
fix(linux-grid): redraw the row a newer error flash replaced
datlechin Oct 14, 2026
34a1bb6
refactor(linux-grid): share one row revision watch between factories
datlechin Oct 14, 2026
9aecd2f
docs(linux-grid): say data_columns follows the cells only as built
datlechin Oct 14, 2026
e471b9a
test(linux): drop signal handlers from templates in the label walk
datlechin Oct 14, 2026
2e66419
docs(linux): fold the accessibility entries into the existing ones
datlechin Oct 14, 2026
a065493
fix(linux-sidebar): open the focused row's menu from the keyboard
datlechin Oct 14, 2026
9674eda
fix(linux-sidebar): open the pressed table and say what each row is
datlechin Oct 14, 2026
dccccac
fix(linux-sidebar): name schemas after a reconnect and in the drop pr…
datlechin Oct 14, 2026
ea8f370
fix(linux-picker): keep unchanged rows and group underscores
datlechin Oct 14, 2026
2ee31e6
Merge branch 'g3/sidebar' into refactor/linux-group3
datlechin Oct 14, 2026
c7a5cf0
Merge branch 'g3/pending' into refactor/linux-group3
datlechin Oct 14, 2026
5261b82
Merge branch 'g3/docs' into refactor/linux-group3
datlechin Oct 14, 2026
402b444
test(linux): walk the picker's template for icon labels too
datlechin Oct 14, 2026
f029ac7
docs(linux): say SQL Server batches go whole in the script runner
datlechin Oct 14, 2026
eed3e96
build(linux): accept the rsa advisory only under sqlx-mysql
datlechin Oct 14, 2026
f43418d
fix(linux-export): remove only the file a stopped export made
datlechin Oct 14, 2026
687dd36
test(linux): wait for the row total before exporting the page
datlechin Oct 14, 2026
bc01059
fix(linux-grid): keep the way back open after a failed page turn
datlechin Oct 14, 2026
3c50a30
feat(linux): edit, rename, duplicate and group saved connections
datlechin Oct 14, 2026
42b7f77
fix(linux-grid): let a copy still rendering give way to a later one
datlechin Oct 14, 2026
9ed7e28
fix(linux-editor): count a run stopped before it began as stopped
datlechin Oct 14, 2026
81043f9
test(linux-picker): check the copy's focus within its own window
datlechin Oct 14, 2026
3a42ca2
feat(linux): announce connecting and failed pages, edit and retry
datlechin Oct 14, 2026
72e657b
ci(linux): keep the Meson test log when a suite fails
datlechin Oct 14, 2026
d9e0abe
feat(linux): notify when a query, save or export ends in another tab
datlechin Oct 14, 2026
227bc19
fix(linux-grid): write an IN clause copy in the server's literals
datlechin Oct 14, 2026
946a777
refactor(linux): build each preferences page in its own module
datlechin Oct 14, 2026
82dc5dd
refactor(linux): turn the filter strip into a subclass with rule rows
datlechin Oct 14, 2026
a58d125
fix(linux): show every toast as plain text
datlechin Oct 14, 2026
b90e5d7
fix(linux-export): create export files readable by their owner only
datlechin Oct 14, 2026
3e1e715
fix(linux): escape names in status page descriptions
datlechin Oct 14, 2026
cd1dc92
fix(linux-structure): offer no Drop on a read-only connection
datlechin Oct 14, 2026
305269a
fix(linux-grid): neutralise formulas in tab-separated copies
datlechin Oct 14, 2026
9d06b85
fix(linux-storage): keep history export comments on one line
datlechin Oct 14, 2026
d429678
test(linux-grid): expect the case-blind order the string sorter gives
datlechin Oct 14, 2026
5040d00
fix(linux): keep a rename when New Connection reaches the same entry
datlechin Oct 14, 2026
16678bf
fix(linux): test an edit with the password typed, whatever Remember says
datlechin Oct 14, 2026
9aa5253
fix(linux): put an edit's secrets back when its entry is not saved
datlechin Oct 14, 2026
d7bc415
fix(linux): translate a saved connection failure as one sentence
datlechin Oct 14, 2026
bd411d9
fix(linux-picker): order groups in one place and match names in any case
datlechin Oct 14, 2026
415ea13
test(linux): check the edit retry, drop a password claim it cannot test
datlechin Oct 14, 2026
8d2045d
fix(linux-export): write Excel exports a batch of rows at a time
datlechin Oct 14, 2026
6d38f69
Merge branch 'g3/fix' into refactor/linux-group3
datlechin Oct 14, 2026
2ec297f
fix(linux): leave saves a close prompt waits on out of notifications
datlechin Oct 14, 2026
e90ace0
fix(linux): give each open editor tab its own Query number
datlechin Oct 14, 2026
177c617
refactor(linux): take the exporting tab as a plain Uuid
datlechin Oct 14, 2026
156a1f5
docs(linux-editor): say a stopped run also leaves statements not run
datlechin Oct 14, 2026
5965d6a
Merge branch 'g4/conn' into refactor/linux-group4
datlechin Oct 14, 2026
fa0967c
Merge branch 'g4/notify' into refactor/linux-group4
datlechin Oct 14, 2026
03672ee
Merge branch 'g4/ssh' into refactor/linux-group4
datlechin Oct 14, 2026
981a21d
Merge branch 'g4/prefs' into refactor/linux-group4
datlechin Oct 14, 2026
d4626be
build(linux): update rustls to 0.23.46 for RUSTSEC-2026-0346 to 0349
datlechin Oct 14, 2026
1ec2c9d
test(linux-grid): wait for the first page with a failed count
datlechin Oct 14, 2026
6cb4def
Merge branch 'refactor/linux-group3' into refactor/linux-group4
datlechin Oct 14, 2026
fb5189b
Merge branch 'refactor/linux-group3' into refactor/linux-group4
datlechin Oct 14, 2026
5bb543e
fix(linux-grid): take the focus off a cell widget a page removes
datlechin Oct 14, 2026
cd5b97f
fix(linux): use GNOME header capitalisation for UI controls and titles
datlechin Oct 14, 2026
b4e2ee7
ci(linux): fail the fast job on an em dash in user-facing text
datlechin Oct 14, 2026
80197bd
test(linux-export): wait for a dropped writer's claim, not just its file
datlechin Oct 14, 2026
19aee23
fix(linux-session): read waiting signals before judging a lost link
datlechin Oct 14, 2026
8405c5b
refactor(linux-browse): split the browse tab into per-domain handlers
datlechin Oct 14, 2026
bb3dfb7
Merge origin/linux (#3420 squash, same tree as refactor/linux-group3)…
datlechin Oct 14, 2026
29cb0e8
refactor(linux-structure): split the structure tab by input domain
datlechin Oct 14, 2026
1bd74cd
docs(linux): describe inputs grouped by the state they change
datlechin Oct 14, 2026
265c07f
fix(linux-grid): keep a cell edit open while another window has focus
datlechin Oct 14, 2026
223c5a6
feat(linux): add Flathub screenshots and pin metainfo project links
datlechin Oct 14, 2026
c218acb
build(linux-flatpak): finalize sandbox permissions and lint exceptions
datlechin Oct 14, 2026
51142cb
docs(linux): list FocusThief among the app test helpers
datlechin Oct 14, 2026
be3107d
Merge branch 'g4/stabilize' into refactor/linux-group4
datlechin Oct 14, 2026
d31f231
build(linux): add a cargo_config option for vendored builds
datlechin Oct 14, 2026
dfb30f9
build(linux): install a tablepro(1) manual page
datlechin Oct 14, 2026
92d942b
Merge remote-tracking branch 'origin/linux' into refactor/linux-group4
datlechin Oct 15, 2026
c8beeb8
build(linux): package .deb for Ubuntu 26.04 and .rpm for Fedora 44
datlechin Oct 14, 2026
38b8360
ci(linux): build and install the packages, release them on linux-v tags
datlechin Oct 14, 2026
46abcd6
docs(linux): record the distribution channels in ADR 0017
datlechin Oct 14, 2026
b1df1e3
build(linux): run release-profile test suites without LTO
datlechin Oct 15, 2026
717206c
Merge branch 'g4/split' into refactor/linux-group4
datlechin Oct 15, 2026
42c0fc5
Merge branch 'g4/caps' into refactor/linux-group4
datlechin Oct 15, 2026
e61d2c1
Merge branch 'g4/flatpak' into refactor/linux-group4
datlechin Oct 15, 2026
80735d5
test(linux-browse): send the filter through PagingInput after the split
datlechin Oct 15, 2026
841a78d
docs(linux): name controls by their header-case labels in comments
datlechin Oct 15, 2026
b4831f3
test(linux): use the First Page label in the icon button fixture
datlechin Oct 15, 2026
8304703
ci(linux): fail the em-dash check when git grep cannot search
datlechin Oct 15, 2026
f634839
build(linux): keep the Meson test log when a package build fails
datlechin Oct 15, 2026
79e95ff
docs(linux): name the browse tab's pager and pending-changes bar
datlechin Oct 15, 2026
28100b1
docs(linux): open removable-drive files at their real path in Flatpak
datlechin Oct 15, 2026
214b53f
docs(linux): note the Flatpak Kerberos realm and KEYRING limits
datlechin Oct 15, 2026
3fb91db
build(linux-flatpak): skip flatpak_app in the Devel manifest source
datlechin Oct 15, 2026
0e872b1
refactor(linux-browse): hand the bars the tab's page and save actions
datlechin Oct 15, 2026
a90ce8d
test(linux-browse): keep only the tab's wiring in its stop saving test
datlechin Oct 15, 2026
cd1dc9a
test(linux-structure): assert the duplicate column error in the preview
datlechin Oct 15, 2026
bd2c361
docs(linux): drop doc comments that only restate the tab layout code
datlechin Oct 15, 2026
fe2dd39
fix(linux): read the newest metainfo release in any attribute order
datlechin Oct 15, 2026
ccb4e2f
test(linux): check that screenshot URLs name data/screenshots
datlechin Oct 15, 2026
2ec0d14
build(linux): test that the newest metainfo release is the project's
datlechin Oct 15, 2026
ac21b0a
docs(linux): retake the structure and connect screenshots
datlechin Oct 15, 2026
7899862
fix(linux-a11y): name the search, find and replace fields
datlechin Oct 15, 2026
246fdf8
fix(linux-a11y): drop the search bar close button GTK leaves unnamed
datlechin Oct 15, 2026
e38a08b
test(linux-a11y): audit labels on every session window page and dialog
datlechin Oct 15, 2026
6788040
Merge branch 'g4/a11y' into refactor/linux-group4
datlechin Oct 15, 2026
5fd156f
fix(linux-sqlite): say a file is not a database on SQLite 3.51 too
datlechin Oct 15, 2026
73a18f6
fix(linux-sqlite): probe a busy pool without waiting for a file lock
datlechin Oct 15, 2026
f42a806
fix(linux-grid): take the focus out of a removed row with no edit open
datlechin Oct 15, 2026
dedf05c
build(linux): say in the spec why it links the system SQLite
datlechin Oct 15, 2026
331bad3
Merge branch 'g4/pkg' into g4/ci
datlechin Oct 15, 2026
f781042
test(linux): hold the save until the close guard's waiting dialog shows
datlechin Oct 15, 2026
ef70f6b
build(linux): let the app and session tests use the container fixtures
datlechin Oct 15, 2026
49a0eef
build(linux): keep rustls a dev-dependency of the PostgreSQL driver
datlechin Oct 15, 2026
4b5ade6
docs(linux): drop a link to an audit file the repository never had
datlechin Oct 15, 2026
730700e
build(linux): regenerate tablepro.pot and leave line numbers out
datlechin Oct 15, 2026
296bc52
fix(linux-ui): show a combo row's whole value beside a long subtitle
datlechin Oct 15, 2026
ea423ea
fix(linux-grid): align editor result numbers as the table grid does
datlechin Oct 15, 2026
e2019d1
fix(linux-grid): widen number columns to their longest number
datlechin Oct 15, 2026
9dde22a
ci(linux): gate on supply chain, POT drift, doc links and Flatpak builds
datlechin Oct 15, 2026
867cfa2
docs(linux): retake the editor and connect screenshots
datlechin Oct 15, 2026
c43dd95
Merge branch 'g4/uifix' into refactor/linux-group4
datlechin Oct 15, 2026
b8d5615
docs(linux): describe the CI jobs and the Flathub cargo config
datlechin Oct 15, 2026
2d6c053
build(linux): cap the rpm's cargo jobs at one per 4 GB of memory
datlechin Oct 15, 2026
6f73375
Merge branch 'g4/pkg' into g4/size
datlechin Oct 15, 2026
7565646
build(linux): build the rpm with line-table debuginfo, as the deb does
datlechin Oct 15, 2026
aaf5772
test(linux-grid): page forward through PagingInput after the merge
datlechin Oct 15, 2026
cb709a4
Merge branch 'g4/ci' into refactor/linux-group4
datlechin Oct 15, 2026
2875a9a
test(linux-core): split the type, TLS and write ledger table tests
datlechin Oct 15, 2026
a203cef
refactor(linux-ssh): split the master connect into plan and supervisor
datlechin Oct 15, 2026
95d51be
refactor(linux-postgres): split the column alter plan and catalog test
datlechin Oct 15, 2026
b577d3f
refactor(linux-mssql): plan rebound defaults and altered columns apart
datlechin Oct 15, 2026
acd2902
refactor(linux-clickhouse): split the editor run's wait and query setup
datlechin Oct 15, 2026
fbc7fba
test(linux): split the DDL conformance case into its steps
datlechin Oct 15, 2026
0b4df4c
refactor(linux-grid): build cell actions, menus and columns in parts
datlechin Oct 15, 2026
2889f6f
refactor(linux-structure): build column rows and the key form in parts
datlechin Oct 15, 2026
62135d7
refactor(linux-export): split the export dialog into its parts
datlechin Oct 15, 2026
c86e0b8
refactor(linux-session): connect each source kind in its own function
datlechin Oct 15, 2026
88700a5
refactor(linux): split Workspace::new into its tabs, exports and watches
datlechin Oct 15, 2026
31c173a
build(linux): deny clippy too_many_lines
datlechin Oct 15, 2026
68b0801
test(linux): name the critical-finding guards after their finding
datlechin Oct 15, 2026
c24f6dc
test(linux): map every critical finding to its guards by test name
datlechin Oct 15, 2026
b00a38d
docs(linux): rewrite the roadmap from the code
datlechin Oct 15, 2026
e3ecc69
docs(linux): index every guide in docs/README.md
datlechin Oct 15, 2026
c82d167
fix(linux): write the rpm's vendor manifest from the source root
datlechin Oct 15, 2026
2c286e0
Merge branch 'g4/size' into refactor/linux-group4
datlechin Oct 15, 2026
bb41bb5
test(linux-session): wait for the torn-down workspace to be released
datlechin Oct 15, 2026
a245f76
fix(linux): keep the spec rpmlint reads out of rpmbuild's SPECS
datlechin Oct 15, 2026
710cd7b
Merge branch 'g4/docs' into refactor/linux-group4
datlechin Oct 15, 2026
1342e1a
docs(linux): reconcile README and contributing guide, add ADR 0014
datlechin Oct 15, 2026
065bd75
test(linux): wait for the frame that frees a torn-down workspace
datlechin Oct 15, 2026
d4c61e1
build(linux): mark the rpm's installed license files instead of a copy
datlechin Oct 15, 2026
1ae11ab
Merge branch 'g4/pkg' into refactor/linux-group4
datlechin Oct 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
387 changes: 329 additions & 58 deletions .github/workflows/build-linux.yml

Large diffs are not rendered by default.

181 changes: 181 additions & 0 deletions .github/workflows/linux-packages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
name: Linux packages

# Builds the .deb and the .rpm from the release source tarballs, each in a
# fresh container that installs only the build dependencies the package
# declares, then installs each package in another fresh container with only
# its runtime dependencies and starts it. release-linux.yml calls this
# workflow and publishes what it builds.

on:
pull_request:
paths:
- "linux/build-aux/debian/**"
- "linux/build-aux/rpm/**"
- "linux/build-aux/packaging/**"
- "linux/meson.build"
- "linux/meson_options.txt"
- "linux/crates/app/meson.build"
- "linux/data/meson.build"
- "linux/po/meson.build"
- "linux/rust-toolchain.toml"
- ".github/workflows/linux-packages.yml"
push:
branches: [linux]
paths:
- "linux/build-aux/debian/**"
- "linux/build-aux/rpm/**"
- "linux/build-aux/packaging/**"
- "linux/meson.build"
- "linux/meson_options.txt"
- "linux/crates/app/meson.build"
- "linux/data/meson.build"
- "linux/po/meson.build"
- "linux/rust-toolchain.toml"
- ".github/workflows/linux-packages.yml"
workflow_dispatch:
workflow_call:
inputs:
deb-runners:
description: JSON list of runners; one .deb is built per runner architecture.
type: string
default: '["ubuntu-24.04"]'

permissions:
contents: read

jobs:
sources:
name: Source tarballs
runs-on: ubuntu-24.04
timeout-minutes: 30
container:
image: ubuntu:26.04
steps:
# Before the checkout: without git, actions/checkout downloads a
# tarball, which leaves no .git for meson dist to archive.
- name: Install git
run: |
apt-get update
apt-get install -y --no-install-recommends ca-certificates git
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Make the source and vendor tarballs
run: linux/build-aux/packaging/make-sources.sh --install-deps _packages/sources
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: linux-sources
path: _packages/sources
if-no-files-found: error

deb:
name: Debian package (${{ matrix.runner }})
needs: sources
strategy:
fail-fast: false
matrix:
runner: ${{ fromJSON(inputs.deb-runners || '["ubuntu-24.04"]') }}
runs-on: ${{ matrix.runner }}
timeout-minutes: 300
container:
image: ubuntu:26.04
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: linux-sources
path: _packages/sources
- name: Build, test and lint the package
run: |
dist="$(find _packages/sources -name 'tablepro-*.tar.xz' ! -name '*-vendor.tar.xz')"
vendor="$(find _packages/sources -name 'tablepro-*-vendor.tar.xz')"
linux/build-aux/packaging/build-deb.sh "$dist" "$vendor" _packages/deb
- name: Keep the Meson test log
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: linux-deb-testlog-${{ runner.arch }}
path: _packages/deb/testlog.txt
if-no-files-found: ignore
retention-days: 7
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: linux-deb-${{ runner.arch }}
path: _packages/deb
if-no-files-found: error

deb-install:
name: Install the Debian package (${{ matrix.runner }})
needs: deb
strategy:
fail-fast: false
matrix:
runner: ${{ fromJSON(inputs.deb-runners || '["ubuntu-24.04"]') }}
runs-on: ${{ matrix.runner }}
timeout-minutes: 20
container:
image: ubuntu:26.04
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: linux-deb-${{ runner.arch }}
path: _packages/deb
- name: Install, start and validate
run: linux/build-aux/packaging/smoke-test.sh "$(find _packages/deb -name 'tablepro_*.deb')"

rpm:
name: RPM package
needs: sources
runs-on: ubuntu-24.04
timeout-minutes: 300
container:
image: fedora:44
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: linux-sources
path: _packages/sources
- name: Build, test and lint the package
run: |
dist="$(find _packages/sources -name 'tablepro-*.tar.xz' ! -name '*-vendor.tar.xz')"
vendor="$(find _packages/sources -name 'tablepro-*-vendor.tar.xz')"
linux/build-aux/packaging/build-rpm.sh "$dist" "$vendor" _packages/rpm
- name: Keep the Meson test log
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: linux-rpm-testlog
path: _packages/rpm/testlog.txt
if-no-files-found: ignore
retention-days: 7
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: linux-rpm
path: _packages/rpm
if-no-files-found: error

rpm-install:
name: Install the RPM package
needs: rpm
runs-on: ubuntu-24.04
timeout-minutes: 20
container:
image: fedora:44
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: linux-rpm
path: _packages/rpm
- name: Install, start and validate
run: linux/build-aux/packaging/smoke-test.sh "$(find _packages/rpm -name 'tablepro-[0-9]*.rpm' ! -name '*.src.rpm')"
111 changes: 111 additions & 0 deletions .github/workflows/release-linux.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
name: Release Linux

# A linux-vX.Y.Z tag publishes the Linux release: the source and vendor
# tarballs and the .deb for Ubuntu 26.04 on GitHub Releases, and the .rpm
# for Fedora 44 through COPR. Flathub's own repository picks the new source
# tarball up from the release.
#
# Secret COPR_CONFIG: the API token file copr-cli reads (~/.config/copr).
# Variable LINUX_COPR_PROJECT: the COPR project, as owner/project.

on:
push:
tags: ["linux-v*"]

permissions:
contents: read

concurrency:
group: release-linux-${{ github.ref }}
cancel-in-progress: false

jobs:
verify:
name: Tag, version and release notes
runs-on: ubuntu-24.04
timeout-minutes: 10
container:
image: ubuntu:26.04
steps:
- name: Install git and meson
run: |
apt-get update
apt-get install -y --no-install-recommends ca-certificates git meson python3
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: The tag, metainfo, spec and changelog name one version
working-directory: linux
env:
TAG: ${{ github.ref_name }}
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
version="$(meson introspect --projectinfo meson.build \
| python3 -c 'import json, sys; print(json.load(sys.stdin)["version"])')"
tag_date="$(TZ=UTC git log -1 --date=format-local:%Y-%m-%d --format=%cd)"
python3 build-aux/packaging/check_packaging.py --source-root . \
--version "$version" --tag "$TAG" --tag-date "$tag_date"

packages:
name: Packages
needs: verify
uses: ./.github/workflows/linux-packages.yml
with:
deb-runners: '["ubuntu-24.04", "ubuntu-24.04-arm"]'

copr:
name: COPR build for Fedora 44
needs: packages
runs-on: ubuntu-24.04
timeout-minutes: 300
container:
image: fedora:44
steps:
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: linux-rpm
path: rpm
- name: Build the source RPM in COPR
env:
COPR_CONFIG: ${{ secrets.COPR_CONFIG }}
COPR_PROJECT: ${{ vars.LINUX_COPR_PROJECT }}
run: |
if [ -z "$COPR_CONFIG" ] || [ -z "$COPR_PROJECT" ]; then
echo "::error::Set the COPR_CONFIG secret and the LINUX_COPR_PROJECT variable to publish the RPM"
exit 1
fi
dnf install -y --setopt=install_weak_deps=False copr-cli
mkdir -p "$HOME/.config"
printf '%s\n' "$COPR_CONFIG" > "$HOME/.config/copr"
copr-cli build "$COPR_PROJECT" "$(find rpm -name '*.src.rpm')" \
--chroot fedora-44-x86_64 --chroot fedora-44-aarch64

github-release:
name: GitHub release
needs: packages
runs-on: ubuntu-24.04
timeout-minutes: 15
permissions:
contents: write
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: linux-*
path: artifacts
- name: Publish the release
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ github.ref_name }}
run: |
version="${TAG#linux-v}"
mkdir release
find artifacts -type f \( -name '*.tar.xz' -o -name 'tablepro_*.deb' -o -name 'tablepro-dbgsym_*.ddeb' \) \
-exec cp {} release/ \;
(cd release && sha256sum -- * > SHA256SUMS)
python3 linux/build-aux/packaging/check_packaging.py --source-root linux \
--version "$version" --tag "$TAG" --notes notes.md
gh release create "$TAG" release/* --repo "$GITHUB_REPOSITORY" --verify-tag \
--title "TablePro for Linux $version" --notes-file notes.md
1 change: 1 addition & 0 deletions linux/.gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
target/
_packages/
*.swp
.DS_Store

Expand Down
12 changes: 9 additions & 3 deletions linux/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,14 @@ From the repository root, through the verification wrapper, which keeps the full

`.github/workflows/build-linux.yml` runs on a pull request that touches `linux/`:

- **Fast checks**: format, both clippy runs, build, every Meson suite, the Secret Service tests, `meson dist`.
- **Translations**: the POT template, with gettext 0.24.
- **Third-party licenses**: reruns `build-aux/update-third-party-licenses.sh` and fails when `data/licenses` differs from what it writes, or when a crate has no license file cargo-about can read.
- **Fast checks**: format, both clippy runs, build, every Meson suite, the Secret Service tests, `meson dist`, then the release-shaped Flatpak manifest rendered from the dist tarball.
- **Supply chain**: `cargo deny check` against `deny.toml`, `cargo shear`, and `build-aux/update-third-party-licenses.sh`, failing when `data/licenses`, `build-aux/debian/copyright` or the spec's `License` tag differ from what it writes; then zizmor over the Linux workflows.
- **Translations**: in `fedora:44` (gettext 0.26), `po/POTFILES.in` and `po/tablepro.pot` must match what the tree generates. A change to a user-facing string regenerates the template in the same commit.
- **Documentation links**: lychee, offline, over the Markdown under `linux/`.
- **Flatpak Devel** (x86_64 and aarch64) and **Flatpak release shape**: the Devel manifest with every Meson suite in the sandbox, and the shape Flathub builds, offline from the dist tarball, linted with `build-aux/flatpak/lint-exceptions.json`.
- **Docker tests** (`integration`): one matrix job per package on the host runner, for the PostgreSQL, MySQL, SQL Server and ClickHouse drivers, `tablepro-ssh` and `tablepro-test-fixtures`.
- **Docker tests (tablepro-session)** (`integration-session`) and **Docker tests (tablepro)** (`integration-app`): in the fast job's `ubuntu:26.04` image with the host's Docker socket, because the session crate links GLib 2.88 and the app GTK 4.22, which the host runner lacks. The app job runs only its named test targets, since the `startup` test needs Meson.

`docs/testing.md` describes each job. Every action is pinned by commit SHA; a new one is too.

`.github/workflows/linux-packages.yml` runs on a pull request that touches the packaging (`build-aux/debian`, `build-aux/rpm`, `build-aux/packaging`, the Meson files): it builds the source and vendor tarballs, the .deb in `ubuntu:26.04` and the .rpm in `fedora:44`, each with lintian or rpmlint, then installs and starts each in a fresh container. `release-linux.yml` calls it on a `linux-v*` tag and publishes the result (ADR 0017).
Loading
Loading