You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gristlabs_grist-core/app/server/utils/pruneActionHistory.ts

64 lines
2.2 KiB

import * as gutil from 'app/common/gutil';
import {ActionHistoryImpl} from 'app/server/lib/ActionHistoryImpl';
import {DocStorage} from 'app/server/lib/DocStorage';
import {DocStorageManager} from 'app/server/lib/DocStorageManager';
import * as docUtils from 'app/server/lib/docUtils';
import log from 'app/server/lib/log';
/**
* A utility script for cleaning up the action log.
*
* @param {String} docPath - The path to the document from the current directory including
* the document name.
* @param {Int} keepN - The number of recent actions to keep. Must be at least 1. Defaults to 1
* if not provided.
*/
export async function pruneActionHistory(docPath: string, keepN: number) {
if (!docPath || !gutil.endsWith(docPath, '.grist')) {
throw new Error('Invalid document: Document should be a valid .grist file');
}
const storageManager = new DocStorageManager(".", ".");
const docStorage = new DocStorage(storageManager, docPath);
const backupPath = gutil.removeSuffix(docPath, '.grist') + "-backup.grist";
// If the backup already exists, abort. Otherwise, create a backup copy and continue.
const exists = await docUtils.pathExists(backupPath);
if (exists) { throw new Error('Backup file already exists, aborting pruneActionHistory'); }
await docUtils.copyFile(docPath, backupPath);
await docStorage.openFile();
try {
const history = new ActionHistoryImpl(docStorage);
await history.initialize();
await history.deleteActions(keepN);
} finally {
await docStorage.shutdown();
}
}
/**
* Variant that accepts and parses command line arguments.
*/
export async function pruneActionHistoryFromConsole(argv: string[]): Promise<number> {
if (argv.length === 0) {
log.error("Please supply document name, and optionally the number of actions to preserve (default=1)");
return 1;
}
const docPath = argv[0];
const keepN = parseInt(argv[1], 10) || 1;
try {
await pruneActionHistory(docPath, keepN);
} catch (e) {
log.error(e);
return 1;
}
return 0;
}
if (require.main === module) {
pruneActionHistoryFromConsole(process.argv.slice(2)).catch((e) => {
log.error("pruneActionHistory failed: %s", e);
process.exit(1);
});
}