Skip to content

refactor(linux): finish remediation steps 46 to 55 - #3420

Merged
datlechin merged 235 commits into
linuxfrom
refactor/linux-group3
Oct 14, 2026
Merged

datlechin merged 235 commits into
linuxfrom
refactor/linux-group3

Conversation

@datlechin

Copy link
Copy Markdown
Member

Why

Steps 46 to 55 of linux/docs/plan-2026-09-14-audit-remediation.md. A failed reload cleared the grid, exports and copies ran on the GTK thread and stopped at the page in memory, shortcuts were bound in a dozen places, and history search, the sidebar and the picker did not scale.

Change

  • Tabs refresh in place and keep the last good page; columns, structure and row counts fail visibly and recount on demand.
  • Exports stream to disk off the GTK thread with progress and cancel, for whole tables and complete results; clipboard copies render off the GTK thread in several formats.
  • One accelerator table behind every shortcut and the shortcuts dialog; split header bars, find and replace, tab titles from one place, a recycling sidebar and picker.
  • History search pages by substring with connection filters; result grids sort and show row limits; the About dialog ships third-party license notices.

Verified

fmt, both clippy runs, nextest and cargo test suites, the CI source scans and the license regeneration in the ubuntu:26.04 image.

Not in this PR

TrackerEdit::DeleteRows replaces Delete and DiscardDraft and is one undo
step. TrackerDelta lists inserted and removed drafts for the one store path.
Delete is tab.delete-rows, enabled from the selection and the delta.
relm4's ComponentSender::input and FactorySender::input expect on a
closed channel, so a read or save that answered after its window closed
aborted the whole process. Both are now banned in favour of deliver.
Ctrl+Shift+N becomes the application's New Window, and GTK runs
application accelerators before a focused grid sees the key.
Drafts hold CellInput, so a cell left to the server is not a NULL, and
InsertDraft seeds Default where the server fills. The grid parses each
commit against its column and sends a TrackerEdit; untouched text is no edit.
An adw::Application subclass replaces RelmApp and the flock gate: a
second launch hands over to the running instance on D-Bus, and
--new-window opens a window there. Quit asks each window through its
close prompts and never calls g_application_quit, so the process ends
only once every close and save hold has dropped.
A copied draft keeps the cells it leaves to the server instead of
writing NULL there. One Ctrl+Z removes every copy, past the 50-step
history limit too.
GtkCalendar emits day-selected only when the date changes, so a click
or Space on the selected day, such as today on a NULL cell, picked
nothing.
begin_edit flipped the check box, so the auto-edit after Insert Row
would write TRUE into a new row once its cells take focus.
GTK takes C strings: the cell drew such a value cut at the NUL, or
aborted in a debug build, and an editor would save the cut text.
A new row is dropped at once with its undo history, so the prompt no
longer tells it to wait for Save.
The Delete button takes its icon from the template. A preset for a
column the tab lacks is logged and dropped instead of reading as a
missing value.
- A view or trigger whose SQL cannot be replayed is named as itself, not as a column.
- new.x and old.x in a trigger on another table no longer block dropping column x.
- The Structure tab hides Add Foreign Key and foreign key removal there.
- The CREATE TABLE read for capabilities is kept per thread, so a wide table is read once, not once per column.
The table definition also reads the CREATE statement once, not again for its foreign keys.
# Conflicts:
#	linux/CHANGELOG.md
A stopped export deleted its path, even when another export had since finished a file there. It now checks the inode it created first, and a second export to a file still being written is refused.
A grid copy checked only the other grid copies, so Copy Query in the history, Copy SQL in a structure tab or a text field's own Copy was overwritten when it landed. It now gives way to any copy this process made since it was asked for, and the two direct writes go through copy_text.
The list only doubled quotes, so on MySQL, MariaDB and ClickHouse a value ending in a backslash closed the string and the rest ran as SQL. Each value now goes through the session dialect's literal.
A toast read its title as markup, so an export to R&D.csv, or a column, path or server message with an & or <, showed an empty toast.
A status page reads its description as markup, so a table named R&D left the loading page blank, and a failed connect to a path or host with an & or < showed no reason.
Copy offers rows as text/tab-separated-values, which a spreadsheet pastes into cells and runs a cell starting with = as a formula. Free text gets the apostrophe the CSV copy gives it.
A connection name, or error text with a lone carriage return, could end its -- comment in the SQL export, and what followed would run when the script was replayed on PostgreSQL.
An Excel export held every row until the last arrived, then built the workbook in memory. The sheet now takes each batch as it lands, in rust_xlsxwriter's constant memory mode, which spills rows to a temporary file; only the compressed workbook is held at the end.
@datlechin
datlechin merged commit 54fb890 into linux Oct 14, 2026
27 of 29 checks passed
@datlechin
datlechin deleted the refactor/linux-group3 branch October 14, 2026 16:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant