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.
This commit is contained in:
nvrl committed 2026-10-20 18:40:50 +02:00
1 parent 8ffad6350f
commit fc2be66b0c
17 files changed
+887 -31

No files matched your search

+13
View File
@@ -776,6 +776,19 @@ export const commands: CommandSpec[] = [
await workspace.guard(() => workspace.deleteSpace(space.id))
},
},
{
name: 'history',
aliases: ['hist'],
group: 'documents',
help: "the open document's earlier versions as diffs — j/k, Enter brings one back (gh)",
run: async () => {
if (!requireOpen()) return
await workspace.guard(async () => {
await workspace.loadHistory()
workspace.overlay = 'history'
})
},
},
{
name: 'trash',
args: '[purge]',