Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
132 commits
Select commit Hold shift + click to select a range
004f3ac
fix(linux-grid): remove discarded drafts and act on the menu's row set
datlechin Oct 14, 2026
c0f2e4f
fix(linux-postgres): keep storage and compression across a type change
datlechin Oct 14, 2026
c4ad884
fix(linux-grid): move or cancel a waiting bulk delete when the key ch…
datlechin Oct 14, 2026
2b0fac6
fix(linux-grid): log a failed table read by its category, not its text
datlechin Oct 14, 2026
60e9d3b
fix(linux-storage): remove the tab file older builds wrote editor SQL…
datlechin Oct 14, 2026
b2aee4e
fix(linux-ssh): ask for a jump host's key when its config would not
datlechin Oct 14, 2026
400f8d5
fix(linux): drop late input to a closed component instead of panicking
datlechin Oct 14, 2026
a2deb1b
feat(linux-grid): set a cell to NULL with Ctrl+Backspace
datlechin Oct 14, 2026
8e39de1
fix(linux-grid): edit cells from lossless edit text with exact editors
datlechin Oct 14, 2026
80dee6e
feat(linux): run as TableProApplication with New Window and app quit
datlechin Oct 14, 2026
35be64a
feat(linux-sqlite): rebuild tables for changes ALTER TABLE cannot make
datlechin Oct 14, 2026
ee61e95
test(linux): check DDL conformance changes keep rows and indexes
datlechin Oct 14, 2026
700f007
fix(linux-ssh): copy the system ssh_config into a jump host's pin file
datlechin Oct 14, 2026
53df700
fix(linux-postgres): drop storage on a change to any type kept inline
datlechin Oct 14, 2026
abd5bde
refactor(linux-grid): let the ticket drop every stale bulk delete answer
datlechin Oct 14, 2026
bd27e34
fix(linux-grid): duplicate a draft as it is, in one undo step
datlechin Oct 14, 2026
9952a0f
fix(linux-grid): commit a calendar pick of the day already selected
datlechin Oct 14, 2026
5211d46
fix(linux-grid): open no editor on a boolean cell
datlechin Oct 14, 2026
514d742
fix(linux-grid): show text with a NUL character and refuse to edit it
datlechin Oct 14, 2026
360c521
fix(linux-grid): say in the delete prompt that unsaved rows go now
datlechin Oct 14, 2026
4e071c5
refactor(linux-grid): drop narrating comments and log a stray preset
datlechin Oct 14, 2026
c1002de
fix(linux-sqlite): refuse a rebuild of a table changed since it was read
datlechin Oct 14, 2026
2977134
fix(linux-sqlite): keep rows, rowids and comments through a rebuild
datlechin Oct 14, 2026
0a8508e
fix(linux-sqlite): refuse numbering changes the rowid column cannot take
datlechin Oct 14, 2026
c2db84e
fix(linux-sqlite): blame the right object when a rebuild refuses
datlechin Oct 14, 2026
2749a50
fix(linux-sqlite): offer no key edits on a table a rebuild cannot read
datlechin Oct 14, 2026
45857f4
fix(linux-sqlite): name inbound keys only from the child's full key list
datlechin Oct 14, 2026
489a6db
docs(linux): describe the checks around a SQLite table rebuild
datlechin Oct 14, 2026
b4eb8b7
Merge branch 'g2/sqlite' into refactor/linux-group2
datlechin Oct 14, 2026
786f0b9
Merge branch 'g2/grid' into refactor/linux-group2
datlechin Oct 14, 2026
a683b69
Merge branch 'g2/carry' into refactor/linux-group2
datlechin Oct 14, 2026
eec94e3
Merge branch 'g2/app' into refactor/linux-group2
datlechin Oct 14, 2026
f39c941
chore(linux): regenerate POTFILES and name Ctrl+Backspace for Set NULL
datlechin Oct 14, 2026
ade14d9
fix(linux-grid): let the bulk delete dialog close itself after an answer
datlechin Oct 14, 2026
2e78d76
fix(linux): write exported results and history off the GTK thread
datlechin Oct 14, 2026
4d3da83
fix(linux-grid): refuse to copy a value with a NUL character
datlechin Oct 14, 2026
968308d
ci(linux): keep blocking file I/O out of all UI code
datlechin Oct 14, 2026
0213999
fix(linux-sqlite): read INTEGER PRIMARY KEY DESC as an ordinary column
datlechin Oct 14, 2026
eb5ac2b
refactor(linux-structure): bind column, index and key lists to models
datlechin Oct 14, 2026
271aebb
feat(linux): open one window per connection session
datlechin Oct 14, 2026
7675a65
fix(linux): close a connect that lands after its window went
datlechin Oct 14, 2026
f55a230
docs(linux): put the window actions comment above their list
datlechin Oct 14, 2026
ff7a40d
fix(linux): keep Ctrl+W working on every page of a window
datlechin Oct 14, 2026
74ec9cf
fix(linux): close a connect still queued when its window shuts down
datlechin Oct 14, 2026
b418f26
fix(linux): retry a saved connection as it is saved now
datlechin Oct 14, 2026
9ac93d5
fix(linux): go to the failed page when resolving a file stops
datlechin Oct 14, 2026
f2b4921
fix(linux): look for SSH keys off the GTK thread
datlechin Oct 14, 2026
70f0574
fix(linux): hold the process until a saved query or edit is written
datlechin Oct 14, 2026
55974d9
fix(linux): close a window whose page is in use without a panic
datlechin Oct 14, 2026
a14b1a4
test(linux): pin the teardown order, late replies and NUL copies
datlechin Oct 14, 2026
7d071a6
refactor(linux): drop what-comments from the workspace input
datlechin Oct 14, 2026
2eb7fb6
docs(linux): record the window per session decision in ADR 0012
datlechin Oct 14, 2026
73fd97d
Merge branch 'g2/session' into refactor/linux-group2
datlechin Oct 14, 2026
6dfaa10
Merge branch 'g2/structure' into refactor/linux-group2
datlechin Oct 14, 2026
0ef6d6f
fix(linux): keep Ctrl+Home and Ctrl+End for the editor and grid in tabs
datlechin Oct 14, 2026
46f8058
feat(linux): ask for a refused password again from the failed page
datlechin Oct 14, 2026
63b76bb
feat(linux): name what a structure save drops, rebuilds included
datlechin Oct 14, 2026
4f1d3a9
feat(linux-structure): review destructive schema changes before saving
datlechin Oct 14, 2026
b0cc3a2
feat(linux): react to per-session reachability and resume from suspend
datlechin Oct 14, 2026
23915c0
feat(linux): locate moved SQLite files, ask before network opens
datlechin Oct 14, 2026
3b9024d
fix(linux): hold the process until connection list writes land
datlechin Oct 14, 2026
bec1b91
feat(linux-storage): count and delete a connection's query history
datlechin Oct 14, 2026
fcd3d58
fix(linux): delete a connection's secrets first, then purge its data
datlechin Oct 14, 2026
b1cb902
feat(linux-storage): add the restore-session setting
datlechin Oct 14, 2026
6255111
feat(linux): reopen the connection windows that were open at quit
datlechin Oct 14, 2026
7a45489
fix(linux): review a rejected SSH host key from the connection banner
datlechin Oct 14, 2026
6d4de65
docs(linux): describe reachability, resume and host key review
datlechin Oct 14, 2026
27caf8b
feat(linux-structure): validate index and foreign key dialogs live
datlechin Oct 14, 2026
edddff6
feat(linux): open SQLite files from Files and the command line
datlechin Oct 14, 2026
c84831a
fix(linux-grid): make grid cells keyboard focusable with native keys
datlechin Oct 14, 2026
36ef189
fix(linux-grid): list the data grid keys in the shortcuts dialog
datlechin Oct 14, 2026
00c8828
fix(linux): reconnect with the password typed for the session
datlechin Oct 14, 2026
851b2ac
fix(linux): offer Enter Password only for a secret the server refused
datlechin Oct 14, 2026
a0a1675
fix(linux): offer Retry for host keys the review cannot accept
datlechin Oct 14, 2026
23eb404
fix(linux): keep the host key review shut while ssh-keygen runs
datlechin Oct 14, 2026
d65005c
fix(linux): show workspace toasts as plain text, not markup
datlechin Oct 14, 2026
215ae86
test(linux): make the LAN reachability test depend on delivery
datlechin Oct 14, 2026
49eeafe
fix(linux): classify a linked SQLite file by its target's mount
datlechin Oct 14, 2026
9929de6
fix(linux): keep Locate from restoring a connection deleted elsewhere
datlechin Oct 14, 2026
e9a66af
test(linux): ask about shares for opened files and dialog connects
datlechin Oct 14, 2026
600cbf9
fix(linux): close a file's extra window only on its first claim
datlechin Oct 14, 2026
a573885
fix(linux-structure): header case for the foreign key form's row titles
datlechin Oct 14, 2026
37be8a3
fix(linux): restore sessions on an activate after an approved quit
datlechin Oct 14, 2026
ba505a9
fix(linux): drop a failed restore's key when a quit is cancelled
datlechin Oct 14, 2026
5857607
test(linux): check a logout quit keeps the sessions recorded
datlechin Oct 14, 2026
1bed375
fix(linux): keep a file's record while another window shows it
datlechin Oct 14, 2026
50a59b6
fix(linux): forget a restore whose window closes before it resolves
datlechin Oct 14, 2026
0fe4cff
fix(linux): hold the process while Reset renames the connection list
datlechin Oct 14, 2026
71fe00b
fix(linux): refuse a connect to a connection being deleted
datlechin Oct 14, 2026
e7c5079
fix(linux): say what a connection delete left behind
datlechin Oct 14, 2026
88b9093
fix(linux): write forgotten widths and filters before a delete ends
datlechin Oct 14, 2026
91a9192
fix(linux): purge a deleted connection's drafts after they land
datlechin Oct 14, 2026
300dc39
fix(linux-grid): return the focus to a cell when its popover closes
datlechin Oct 14, 2026
4e5483d
fix(linux-grid): toggle a focused check box with Space
datlechin Oct 14, 2026
65aa37c
test(linux-grid): match the column when a test focuses a cell
datlechin Oct 14, 2026
ef13009
Merge branch 'g2/health' into refactor/linux-group2
datlechin Oct 14, 2026
a00111c
docs(linux-grid): drop doc comments that restate the code
datlechin Oct 14, 2026
8f53035
docs(linux): say Tab carries a grid edit to the next cell
datlechin Oct 14, 2026
f3ba14e
Merge branch 'g2/creds' into refactor/linux-group2
datlechin Oct 14, 2026
cceb124
fix(linux-structure): keep add dialogs alive once the tab opens them
datlechin Oct 14, 2026
ec05c7f
fix(linux-structure): pick a SQLite key's table from its own schema
datlechin Oct 14, 2026
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
ec7b085
test(linux): pass the settings and askpass tests in one test process
datlechin Oct 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
30 changes: 25 additions & 5 deletions .github/workflows/build-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -106,21 +106,41 @@ jobs:
echo "::error::crates/app/src/services must not hold thread_local! state"
exit 1
fi
- name: No blocking file I/O in the window and editor code
- name: No blocking file I/O in the UI code
# This code runs on the GTK thread, where a slow disk or a
# network mount freezes the window. A storage call ending in
# _blocking is handed to spawn_blocking_task on the same line,
# which is what this check can see. Tests may do either.
# which is what this check can see. A Path method that stats the
# disk blocks the same way. Tests may do either.
run: |
# The $0 in the awk program is awk's record, not a shell variable.
# shellcheck disable=SC2016
found=$(find crates/app/src/ui/app crates/app/src/ui/editor -name '*.rs' ! -name tests.rs -print0 \
| xargs -0 awk '/^mod tests \{/ { nextfile } /std::fs::/ || (/_blocking\(/ && !/spawn_blocking_task\(/) { print FILENAME ":" FNR ": " $0 }')
found=$(find crates/app/src/ui -name '*.rs' ! -name tests.rs -print0 \
| xargs -0 awk '/^mod tests \{/ { nextfile } /std::fs::/ || /\.(exists|try_exists|is_dir|is_file|is_symlink|canonicalize|read_dir|read_link|symlink_metadata)\(/ || (/_blocking\(/ && !/spawn_blocking_task\(/) { print FILENAME ":" FNR ": " $0 }')
if [ -n "$found" ]; then
echo "$found"
echo "::error::crates/app/src/ui/app and crates/app/src/ui/editor must not call std::fs, or a _blocking function outside spawn_blocking_task"
echo "::error::crates/app/src/ui must not call std::fs or a Path method that reads the disk, or a _blocking function outside spawn_blocking_task"
exit 1
fi
- name: Window actions on the window's own map
# GTK exports a window's own action map as win. A group inserted
# under that name hides it from the application's accelerators
# and from D-Bus.
run: |
if grep -rn 'insert_action_group("win"' crates/app/src; then
echo "::error::add window actions with add_action_entries on the window, not a group inserted as win"
exit 1
fi
- name: Docs name paths and types that exist
# A renamed type or a moved file stays named in prose until
# something asks. GTK and GLib names resolve against the GIR
# files the -dev packages install.
run: |
../scripts/check-doc-symbols.sh \
linux/ARCHITECTURE.md \
linux/docs/state-management.md \
linux/docs/testing.md \
linux/docs/decisions/0012-window-per-session.md
- name: Clippy
run: meson devenv -C _build cargo clippy --locked --workspace --all-targets -- -D warnings
- name: Clippy without default features
Expand Down
4 changes: 2 additions & 2 deletions linux/AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# TablePro for Linux

The native Linux app: Rust, GTK 4 and libadwaita through Relm4, built with Meson and Cargo. The platform floor is GNOME 50 (GTK 4.22, libadwaita 1.9, GtkSourceView 5.18, GLib 2.88). It shares no code with the macOS app.
The native Linux app: Rust, GTK 4 and libadwaita through gtk-rs, built with Meson and Cargo. The platform floor is GNOME 50 (GTK 4.22, libadwaita 1.9, GtkSourceView 5.18, GLib 2.88). It shares no code with the macOS app.

This is the guide for work under `linux/`. The root `AGENTS.md` describes the macOS and iOS apps; of it, only the principles named below, "Writing style" and the commit rules apply here. Claude Code loads this file through `linux/CLAUDE.md` once a file under `linux/` is read; Codex reads it when started in `linux/`, so otherwise read it yourself.

Expand All @@ -18,7 +18,7 @@ This is the guide for work under `linux/`. The root `AGENTS.md` describes the ma

## Map

- `crates/app`: the binary and every Relm4 component. `crates/core`: domain types and traits, no GUI. `crates/storage`: secrets, settings and files. `crates/session`, `crates/net`, `crates/ssh`: sessions, the network layer and the OpenSSH transport. `crates/drivers/*`: one crate per engine. `crates/test-fixtures` and `crates/test-support`: test-only.
- `crates/app`: the binary, the GTK application, its windows and views. `crates/core`: domain types and traits, no GUI. `crates/storage`: secrets, settings and files. `crates/session`, `crates/net`, `crates/ssh`: sessions, the network layer and the OpenSSH transport. `crates/drivers/*`: one crate per engine. `crates/test-fixtures` and `crates/test-support`: test-only.
- `data/`: desktop entry, D-Bus service, metainfo, GSettings schema, icons and GResource. `po/`: translations. `build-aux/flatpak/`: the Flatpak manifest.
- `ARCHITECTURE.md`, `CONTRIBUTING.md` and `docs/` (testing, storage, error handling, state management, adding a driver, decisions) are the reference. Read the one for the area you touch.

Expand Down
Loading
Loading