Files
nvrl fc2be66b0c revisions: a save keeps what it replaces
Every write of a document's text keeps the text it replaces, in the same
transaction. Autosave writes every few seconds, so an ordinary save keeps
one at most every ten minutes; `:w!`, a save over the SFTP mount and a
restore always keep one, because each may undo something. A rename alone,
or a document that was empty, keeps nothing.

`gh` or `:history` lists the open document's earlier versions, the newest
first, and shows the highlighted one as a line diff against the text as it
is now. Enter brings it back, and what it replaces becomes a version of
its own, so a restore is undone the same way.

The daily sweep forgets versions older than WORKSPACE_REVISION_DAYS (90)
but never the newest 20 of a document, and keeps an upload as long as a
version still embeds it. Versions stay out of the export, the mount and
the readable mirror; a document in the trash shows none.
2026-10-20 18:40:50 +02:00

16 lines
769 B
SQL

-- What a document said before it was written over. A row holds the text that
-- was replaced, not the text that replaced it: the newest version is the
-- document itself. Autosave writes every few seconds, so an ordinary save
-- keeps one at most every ten minutes; `:w!`, a save over the mount and a
-- restore always keep one, because each of those may undo something.
CREATE TABLE revisions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
node_id INTEGER NOT NULL REFERENCES nodes (id) ON DELETE CASCADE,
name TEXT NOT NULL,
body TEXT NOT NULL,
saved_at INTEGER NOT NULL,
reason TEXT NOT NULL CHECK (reason IN ('edit', 'force', 'sftp', 'restore'))
);
CREATE INDEX idx_revisions_node ON revisions (node_id, saved_at DESC);