@procedures/snapshot 0.11.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/README.md +10 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +13 -9
- package/dist/module.js.map +1 -1
- package/dist/procedures/snapshot/commands.d.ts +17 -9
- package/dist/procedures/snapshot/commands.d.ts.map +1 -1
- package/dist/procedures/snapshot/commands.js +28 -12
- package/dist/procedures/snapshot/commands.js.map +1 -1
- package/dist/procedures/snapshot/create.d.ts.map +1 -1
- package/dist/procedures/snapshot/create.js +20 -11
- package/dist/procedures/snapshot/create.js.map +1 -1
- package/dist/procedures/snapshot/diff.d.ts.map +1 -1
- package/dist/procedures/snapshot/diff.js +15 -9
- package/dist/procedures/snapshot/diff.js.map +1 -1
- package/package.json +7 -7
- package/src/module.ts +13 -10
- package/src/procedures/snapshot/commands.ts +26 -12
- package/src/procedures/snapshot/create.ts +19 -11
- package/src/procedures/snapshot/diff.ts +13 -9
package/dist/module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAA+D,KAAK,eAAe,EAAuC,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAA+D,KAAK,eAAe,EAAuC,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAuJpL;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,eAMzB,CAAC;eAEU,cAAc;AAE7B;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,GAAE,iBAAsC,GAAG,IAAI,CAEjG"}
|
package/dist/module.js
CHANGED
|
@@ -12,20 +12,24 @@ import { SnapshotCreateInputSchema, SnapshotListInputSchema, SnapshotRestoreInpu
|
|
|
12
12
|
// Procedures
|
|
13
13
|
// =============================================================================
|
|
14
14
|
// =============================================================================
|
|
15
|
-
// The rules under a root of the files (roadmap R33, tracker
|
|
15
|
+
// The rules under a root of the files (roadmap R33, tracker items O36 and O46)
|
|
16
16
|
// =============================================================================
|
|
17
|
-
/**
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
/**
|
|
18
|
+
* `snapshot.create`: each folder of `paths` is in the root, and the default folder is the root.
|
|
19
|
+
* Git goes through the `git.*` procedures, so their rules of the root apply. Pnpm does not start.
|
|
20
|
+
* Tar stores a symlink as a link, so the archive has only the files of the folders.
|
|
21
|
+
*/
|
|
22
|
+
const CREATE_UNDER_A_ROOT = { paths: ["paths"] };
|
|
21
23
|
/** `snapshot.restore`: a root refuses it. */
|
|
22
24
|
const RESTORE_UNDER_A_ROOT = {
|
|
23
25
|
refuse: "it downloads the archive into the temporary folder of the host through s3.download, and the names of the folders come from the data of the snapshot",
|
|
24
26
|
};
|
|
25
|
-
/**
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
/**
|
|
28
|
+
* `snapshot.diff`: each folder of `paths` is in the root. Without `paths`, the folders are the
|
|
29
|
+
* paths that the snapshot recorded, maybe on another machine, so a root needs `paths`. Git goes
|
|
30
|
+
* through the `git.*` procedures, so their rules of the root apply.
|
|
31
|
+
*/
|
|
32
|
+
const DIFF_UNDER_A_ROOT = { paths: ["paths"], required: ["paths"] };
|
|
29
33
|
const snapshotCreateProcedure = createProcedure()
|
|
30
34
|
.path(["snapshot", "create"])
|
|
31
35
|
.input(zodAdapter(SnapshotCreateInputSchema))
|
package/dist/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAA0C,kBAAkB,EAAE,eAAe,EAA0B,MAAM,oBAAoB,CAAC;AAEpL,OAAO,EACL,cAAc,EACd,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,cAAc,GACf,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EAWzB,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AAEpB,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF,gFAAgF;AAChF
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The programs
|
|
2
|
+
* The programs of the snapshot procedures: git through the `git.*` procedures, and pnpm.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* - Git goes through the `git.*` procedures of the host (`ctx.client`), not through a process of
|
|
5
|
+
* this package. Under a root of the files, the rules of the root then apply to each git command:
|
|
6
|
+
* the working folder in the root, no hooks, no configuration that starts a program (tracker
|
|
7
|
+
* item O46).
|
|
8
|
+
* - `runCommand` starts pnpm. It is async, kills the process tree when the signal aborts, and runs
|
|
9
|
+
* no shell. Under a root, pnpm does not start.
|
|
7
10
|
*/
|
|
11
|
+
import type { ProcedureContext, ProcedurePath } from "@procedures/client";
|
|
8
12
|
/**
|
|
9
|
-
* This function
|
|
10
|
-
* when
|
|
13
|
+
* This function starts a `git.*` procedure of the host and gives its output. It gives `undefined`
|
|
14
|
+
* when the procedure fails, for example in a folder that is not a repository. A refusal of the
|
|
15
|
+
* root (`FORBIDDEN` with the reason `outside-root`) is not a failure of git: it stays the error.
|
|
11
16
|
*/
|
|
12
|
-
export declare function
|
|
13
|
-
/**
|
|
14
|
-
|
|
17
|
+
export declare function gitCall<T>(ctx: ProcedureContext, path: ProcedurePath, input: Record<string, unknown>): Promise<T | undefined>;
|
|
18
|
+
/**
|
|
19
|
+
* This function gives the version of pnpm, or "unknown" when pnpm cannot run. Under a root of the
|
|
20
|
+
* files (`fsRoot`), it starts no program and gives "unknown".
|
|
21
|
+
*/
|
|
22
|
+
export declare function pnpmVersion(signal?: AbortSignal, fsRoot?: string): Promise<string>;
|
|
15
23
|
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/procedures/snapshot/commands.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/procedures/snapshot/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQ1E;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAOnI;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUxF"}
|
|
@@ -1,24 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The programs
|
|
2
|
+
* The programs of the snapshot procedures: git through the `git.*` procedures, and pnpm.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* - Git goes through the `git.*` procedures of the host (`ctx.client`), not through a process of
|
|
5
|
+
* this package. Under a root of the files, the rules of the root then apply to each git command:
|
|
6
|
+
* the working folder in the root, no hooks, no configuration that starts a program (tracker
|
|
7
|
+
* item O46).
|
|
8
|
+
* - `runCommand` starts pnpm. It is async, kills the process tree when the signal aborts, and runs
|
|
9
|
+
* no shell. Under a root, pnpm does not start.
|
|
7
10
|
*/
|
|
11
|
+
import { isOutsideRoot } from "@procedures/fs/root";
|
|
8
12
|
import { runCommand } from "@procedures/shell/command";
|
|
9
13
|
import { resolvePnpm } from "@procedures/pnpm";
|
|
10
|
-
/** The longest time of one
|
|
14
|
+
/** The longest time of one pnpm query, in milliseconds. */
|
|
11
15
|
const QUERY_TIMEOUT_MS = 30_000;
|
|
12
16
|
/**
|
|
13
|
-
* This function
|
|
14
|
-
* when
|
|
17
|
+
* This function starts a `git.*` procedure of the host and gives its output. It gives `undefined`
|
|
18
|
+
* when the procedure fails, for example in a folder that is not a repository. A refusal of the
|
|
19
|
+
* root (`FORBIDDEN` with the reason `outside-root`) is not a failure of git: it stays the error.
|
|
15
20
|
*/
|
|
16
|
-
export async function
|
|
17
|
-
|
|
18
|
-
|
|
21
|
+
export async function gitCall(ctx, path, input) {
|
|
22
|
+
try {
|
|
23
|
+
return await ctx.client.call(path, input);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
if (isOutsideRoot(error))
|
|
27
|
+
throw error;
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
19
30
|
}
|
|
20
|
-
/**
|
|
21
|
-
|
|
31
|
+
/**
|
|
32
|
+
* This function gives the version of pnpm, or "unknown" when pnpm cannot run. Under a root of the
|
|
33
|
+
* files (`fsRoot`), it starts no program and gives "unknown".
|
|
34
|
+
*/
|
|
35
|
+
export async function pnpmVersion(signal, fsRoot) {
|
|
36
|
+
if (fsRoot !== undefined)
|
|
37
|
+
return "unknown";
|
|
22
38
|
let pnpm;
|
|
23
39
|
try {
|
|
24
40
|
pnpm = resolvePnpm();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/procedures/snapshot/commands.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/procedures/snapshot/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,2DAA2D;AAC3D,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAI,GAAqB,EAAE,IAAmB,EAAE,KAA8B;IACzG,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAA6B,IAAI,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,aAAa,CAAC,KAAK,CAAC;YAAE,MAAM,KAAK,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAoB,EAAE,MAAe;IACrE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,IAA2C,CAAC;IAChD,IAAI,CAAC;QACH,IAAI,GAAG,WAAW,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC1H,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/procedures/snapshot/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/procedures/snapshot/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAK3D,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EAIrB,MAAM,gBAAgB,CAAC;AAKxB;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,EAC1B,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,oBAAoB,CAAC,CAgG/B"}
|
|
@@ -9,9 +9,10 @@ import { join, basename, dirname, resolve } from "node:path";
|
|
|
9
9
|
import { tmpdir, hostname } from "node:os";
|
|
10
10
|
import { randomUUID } from "node:crypto";
|
|
11
11
|
import * as tar from "tar";
|
|
12
|
+
import { isOutsideRoot, realPathIsInside, resolveRoot } from "@procedures/fs/root";
|
|
12
13
|
import { assertSnapshotName, isExcluded } from "./names.js";
|
|
13
14
|
import { readPart, sha256File } from "./archive-io.js";
|
|
14
|
-
import {
|
|
15
|
+
import { gitCall, pnpmVersion } from "./commands.js";
|
|
15
16
|
/** The size of each part of a multipart upload (the S3 minimum) */
|
|
16
17
|
const PART_SIZE = 5 * 1024 * 1024;
|
|
17
18
|
/**
|
|
@@ -29,7 +30,7 @@ export async function snapshotCreate(input, ctx) {
|
|
|
29
30
|
// Gather repository info
|
|
30
31
|
const repositories = await Promise.all(repoPaths.map((path) => getRepositoryInfo(path, ctx)));
|
|
31
32
|
// Get environment info
|
|
32
|
-
const environment = await getEnvironmentInfo(ctx.signal);
|
|
33
|
+
const environment = await getEnvironmentInfo(ctx.signal, ctx.fsRoot);
|
|
33
34
|
// Create metadata
|
|
34
35
|
const metadata = {
|
|
35
36
|
id,
|
|
@@ -103,10 +104,10 @@ export async function snapshotCreate(input, ctx) {
|
|
|
103
104
|
/**
|
|
104
105
|
* Get ecosystem repository paths from manifest
|
|
105
106
|
*/
|
|
106
|
-
async function getEcosystemPaths(
|
|
107
|
+
async function getEcosystemPaths(ctx) {
|
|
107
108
|
// TODO: Read from ecosystem manifest
|
|
108
|
-
// For now,
|
|
109
|
-
return [process.cwd()];
|
|
109
|
+
// For now, the root of the files under a root, else the current working directory
|
|
110
|
+
return [ctx.fsRoot ?? process.cwd()];
|
|
110
111
|
}
|
|
111
112
|
/**
|
|
112
113
|
* Get repository info for a path
|
|
@@ -115,8 +116,8 @@ async function getRepositoryInfo(repoPath, ctx) {
|
|
|
115
116
|
try {
|
|
116
117
|
const result = await ctx.client.call(["git", "status"], { cwd: repoPath });
|
|
117
118
|
// The commit hash ("" for a repository with no commit) and the remote URL (none without "origin")
|
|
118
|
-
const commit = (await
|
|
119
|
-
const remoteUrl = await
|
|
119
|
+
const commit = (await gitCall(ctx, ["git", "revParse"], { cwd: repoPath }))?.value ?? "";
|
|
120
|
+
const remoteUrl = (await gitCall(ctx, ["git", "remote"], { cwd: repoPath, name: "origin" }))?.url;
|
|
120
121
|
// Get stash count
|
|
121
122
|
let stashCount = 0;
|
|
122
123
|
try {
|
|
@@ -126,11 +127,13 @@ async function getRepositoryInfo(repoPath, ctx) {
|
|
|
126
127
|
catch {
|
|
127
128
|
// No stashes
|
|
128
129
|
}
|
|
129
|
-
// Get package name from package.json
|
|
130
|
+
// Get package name from package.json. Under a root, a package.json whose real path is outside
|
|
131
|
+
// the root (a symlink) is not read.
|
|
130
132
|
let name = basename(repoPath);
|
|
131
133
|
try {
|
|
132
134
|
const pkgPath = join(repoPath, "package.json");
|
|
133
|
-
|
|
135
|
+
const readable = ctx.fsRoot === undefined || (await realPathIsInside(await resolveRoot(ctx.fsRoot), pkgPath));
|
|
136
|
+
if (readable && existsSync(pkgPath)) {
|
|
134
137
|
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
135
138
|
name = pkg.name || name;
|
|
136
139
|
}
|
|
@@ -151,6 +154,9 @@ async function getRepositoryInfo(repoPath, ctx) {
|
|
|
151
154
|
};
|
|
152
155
|
}
|
|
153
156
|
catch (error) {
|
|
157
|
+
// A refusal of the root is not "no repository": the repository is there, and the root refuses it
|
|
158
|
+
if (isOutsideRoot(error))
|
|
159
|
+
throw error;
|
|
154
160
|
// Not a git repo or error
|
|
155
161
|
return {
|
|
156
162
|
path: repoPath,
|
|
@@ -167,11 +173,11 @@ async function getRepositoryInfo(repoPath, ctx) {
|
|
|
167
173
|
/**
|
|
168
174
|
* Get environment info
|
|
169
175
|
*/
|
|
170
|
-
async function getEnvironmentInfo(signal) {
|
|
176
|
+
async function getEnvironmentInfo(signal, fsRoot) {
|
|
171
177
|
return {
|
|
172
178
|
os: process.platform,
|
|
173
179
|
nodeVersion: process.version,
|
|
174
|
-
pnpmVersion: await pnpmVersion(signal),
|
|
180
|
+
pnpmVersion: await pnpmVersion(signal, fsRoot),
|
|
175
181
|
username: process.env["USER"] || process.env["USERNAME"] || "unknown",
|
|
176
182
|
hostname: hostname(),
|
|
177
183
|
};
|
|
@@ -206,10 +212,13 @@ async function createArchive(archivePath, repoPaths, preset, workDir) {
|
|
|
206
212
|
excludePatterns.push(".pnpm-store", "*.log");
|
|
207
213
|
}
|
|
208
214
|
// heavy preset includes everything
|
|
215
|
+
// Tar reads only the listed folders from their parent. Without `follow`, it stores a symlink as
|
|
216
|
+
// a link and does not read its target: under a root, the archive has only files of the root.
|
|
209
217
|
await tar.create({
|
|
210
218
|
gzip: gzipOpts,
|
|
211
219
|
file: archivePath,
|
|
212
220
|
cwd,
|
|
221
|
+
follow: false,
|
|
213
222
|
// Whole path segments, and "*.ext" for file endings. (Before, `path.includes("dist")`
|
|
214
223
|
// left out src/distance.ts, and "*.log" matched nothing: deep dive DATA-3.)
|
|
215
224
|
filter: (path) => !isExcluded(path, excludePatterns),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/procedures/snapshot/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjG,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAE3B,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AASrD,mEAAmE;AACnE,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAElC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAA0B,EAC1B,GAAqB;IAErB,uFAAuF;IACvF,0DAA0D;IAC1D,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;IAEzD,IAAI,CAAC;QAEH,mCAAmC;QACnC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;QAEhE,yBAAyB;QACzB,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CACtD,CAAC;QAEF,uBAAuB;QACvB,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/procedures/snapshot/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjG,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAE3B,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AASrD,mEAAmE;AACnE,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAElC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAA0B,EAC1B,GAAqB;IAErB,uFAAuF;IACvF,0DAA0D;IAC1D,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;IAEzD,IAAI,CAAC;QAEH,mCAAmC;QACnC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;QAEhE,yBAAyB;QACzB,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CACtD,CAAC;QAEF,uBAAuB;QACvB,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAErE,kBAAkB;QAClB,MAAM,QAAQ,GAAqB;YACjC,EAAE;YACF,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,WAAW;YACX,YAAY;YACZ,QAAQ,EAAE,EAAE,EAAE,4CAA4C;YAC1D,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC;QAEF,mCAAmC;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACpD,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/D,iCAAiC;QACjC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAClD,MAAM,aAAa,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEnE,2EAA2E;QAC3E,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;QAE/C,gCAAgC;QAChC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;QACnC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/D,eAAe;QACf,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,aAAa,KAAK,CAAC,IAAI,IAAI,EAAE,SAAS,CAAC;QAErD,2FAA2F;QAC3F,4BAA4B;QAC5B,IAAI,WAAW,GAAG,SAAS,EAAE,CAAC;YAC5B,MAAM,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE;gBACtC,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAClD,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,kBAAkB;gBAC/B,QAAQ,EAAE;oBACR,UAAU,EAAE,EAAE;oBACd,YAAY,EAAE,KAAK,CAAC,IAAI;oBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,QAAQ;iBACT;aACF,CAAC,CAAC;QACL,CAAC;QAED,oDAAoD;QACpD,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE;YACtC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,GAAG,EAAE,aAAa,KAAK,CAAC,IAAI,IAAI,EAAE,gBAAgB;YAClD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,WAAW,EAAE,kBAAkB;SAChC,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;QAEhD,OAAO;YACL,EAAE;YACF,QAAQ,EAAE,QAAQ,KAAK,CAAC,MAAM,IAAI,KAAK,EAAE;YACzC,QAAQ;YACR,cAAc;SACf,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,yBAAyB;QACzB,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,GAAqB;IACpD,qCAAqC;IACrC,kFAAkF;IAClF,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAC9B,QAAgB,EAChB,GAAqB;IAErB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAGlC,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QAExC,kGAAkG;QAClG,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAoB,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QAC5G,MAAM,SAAS,GAAG,CAAC,MAAM,OAAO,CAAkB,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC;QAEnH,kBAAkB;QAClB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAGrC,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/C,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;QAED,8FAA8F;QAC9F,oCAAoC;QACpC,IAAI,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,gBAAgB,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9G,IAAI,QAAQ,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;gBACtD,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;YAC1B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;QAED,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,IAAI;YACJ,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM;YACN,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK;YACpB,UAAU;YACV,SAAS;YACT,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,iGAAiG;QACjG,IAAI,aAAa,CAAC,KAAK,CAAC;YAAE,MAAM,KAAK,CAAC;QACtC,0BAA0B;QAC1B,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC;YACxB,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,KAAK;YACZ,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;SACV,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAAC,MAAoB,EAAE,MAAe;IACrE,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,QAAQ;QACpB,WAAW,EAAE,OAAO,CAAC,OAAO;QAC5B,WAAW,EAAE,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;QAC9C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,SAAS;QACrE,QAAQ,EAAE,QAAQ,EAAE;KACrB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAC1B,WAAmB,EACnB,SAAmB,EACnB,MAAsB,EACtB,OAAe;IAEf,yDAAyD;IACzD,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7D,8EAA8E;IAC9E,6EAA6E;IAC7E,sEAAsE;IACtE,0EAA0E;IAC1E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,8FAA8F;YAC5F,GAAG,OAAO;SACX,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACf,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAErF,sCAAsC;IACtC,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvD,yCAAyC;IACzC,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,sCAAsC;QACtC,eAAe,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;SAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,8CAA8C;QAC9C,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IACD,mCAAmC;IAEnC,gGAAgG;IAChG,6FAA6F;IAC7F,MAAM,GAAG,CAAC,MAAM,CACd;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,WAAW;QACjB,GAAG;QACH,MAAM,EAAE,KAAK;QACb,sFAAsF;QACtF,4EAA4E;QAC5E,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,eAAe,CAAC;KACrD,EACD,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CACtC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,GAAqB,EACrB,MAAc,EACd,GAAW,EACX,WAAmB,EACnB,WAAmB;IAEnB,8BAA8B;IAC9B,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAGtC,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE;QAC7B,MAAM;QACN,GAAG;QACH,WAAW,EAAE,kBAAkB;KAChC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;IACrC,MAAM,KAAK,GAAgD,EAAE,CAAC;IAC9D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAE1C,IAAI,CAAC;QACH,eAAe;QACf,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,MAAM,IAAI,SAAS,EAAE,CAAC;YAC/D,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YAEtD,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAGtC,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE;gBAC/B,MAAM;gBACN,GAAG;gBACH,QAAQ;gBACR,UAAU;gBACV,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;aAC/B,CAAC,CAAC;YAEH,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,UAAU,EAAE,UAAU,CAAC,UAAU;aAClC,CAAC,CAAC;YAEH,UAAU,EAAE,CAAC;QACf,CAAC;QAED,4BAA4B;QAC5B,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE;YACrD,MAAM;YACN,GAAG;YACH,QAAQ;YACR,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,oFAAoF;QACpF,eAAe;QACf,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE;gBAClD,MAAM;gBACN,GAAG;gBACH,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,GAAG,SAAS,CAAC,KAAK,CAAC,yBAAyB,QAAQ,iBAAiB,SAAS,CAAC,UAAU,CAAC,GAAG,EAC7F,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/procedures/snapshot/diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/procedures/snapshot/diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAGnB,MAAM,gBAAgB,CAAC;AAGxB;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,iBAAiB,EACxB,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,kBAAkB,CAAC,CA6H7B"}
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { existsSync } from "node:fs";
|
|
7
7
|
import { basename } from "node:path";
|
|
8
|
-
import {
|
|
8
|
+
import { isOutsideRoot } from "@procedures/fs/root";
|
|
9
|
+
import { gitCall } from "./commands.js";
|
|
9
10
|
import { listAllObjects, findSnapshotKey } from "./s3-lookup.js";
|
|
10
11
|
/**
|
|
11
12
|
* Compare current state against a snapshot
|
|
@@ -46,7 +47,7 @@ export async function snapshotDiff(input, ctx) {
|
|
|
46
47
|
}
|
|
47
48
|
try {
|
|
48
49
|
// Get current branch (a failure is an error of this repository: the catch below)
|
|
49
|
-
const currentBranch = await
|
|
50
|
+
const currentBranch = (await gitCall(ctx, ["git", "revParse"], { cwd: repoPath, abbrevRef: true }))?.value;
|
|
50
51
|
if (currentBranch === undefined)
|
|
51
52
|
throw new Error(`git cannot read the branch of ${repoPath}`);
|
|
52
53
|
if (currentBranch !== snapshotRepo.branch) {
|
|
@@ -56,7 +57,7 @@ export async function snapshotDiff(input, ctx) {
|
|
|
56
57
|
};
|
|
57
58
|
}
|
|
58
59
|
// Get current commit
|
|
59
|
-
const currentCommit = await
|
|
60
|
+
const currentCommit = (await gitCall(ctx, ["git", "revParse"], { cwd: repoPath }))?.value;
|
|
60
61
|
if (currentCommit === undefined)
|
|
61
62
|
throw new Error(`git cannot read the commit of ${repoPath}`);
|
|
62
63
|
if (currentCommit !== snapshotRepo.commit) {
|
|
@@ -71,14 +72,16 @@ export async function snapshotDiff(input, ctx) {
|
|
|
71
72
|
if (!/^[0-9a-f]{7,64}$/i.test(snapshotRepo.commit)) {
|
|
72
73
|
throw new Error(`Not a commit hash: ${snapshotRepo.commit}`);
|
|
73
74
|
}
|
|
74
|
-
const
|
|
75
|
-
if (
|
|
75
|
+
const changes = await gitCall(ctx, ["git", "diff"], { cwd: repoPath, ref: `${snapshotRepo.commit}..HEAD`, stat: true });
|
|
76
|
+
if (changes === undefined)
|
|
76
77
|
throw new Error(`git cannot compare ${snapshotRepo.commit} with HEAD`);
|
|
77
|
-
//
|
|
78
|
-
diff.filesChanged =
|
|
78
|
+
// One entry for each file that changed, also a binary file
|
|
79
|
+
diff.filesChanged = changes.files.length;
|
|
79
80
|
totalFilesChanged += diff.filesChanged;
|
|
80
81
|
}
|
|
81
|
-
catch {
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (isOutsideRoot(error))
|
|
84
|
+
throw error;
|
|
82
85
|
// Snapshot commit may not exist locally
|
|
83
86
|
diff.filesChanged = -1;
|
|
84
87
|
}
|
|
@@ -93,7 +96,10 @@ export async function snapshotDiff(input, ctx) {
|
|
|
93
96
|
reposChanged++;
|
|
94
97
|
}
|
|
95
98
|
}
|
|
96
|
-
catch {
|
|
99
|
+
catch (error) {
|
|
100
|
+
// A refusal of the root is not "no repository": the repository is there, and the root refuses it
|
|
101
|
+
if (isOutsideRoot(error))
|
|
102
|
+
throw error;
|
|
97
103
|
// Not a git repo or error
|
|
98
104
|
diff.filesChanged = -1;
|
|
99
105
|
reposChanged++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/procedures/snapshot/diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/procedures/snapshot/diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAOxC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAwB,EACxB,GAAqB;IAErB,wEAAwE;IACxE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAEzE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAG1C,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,GAAG,EAAE,WAAW;QAChB,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAqB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAE3E,0BAA0B;IAC1B,MAAM,YAAY,GAA6B,EAAE,CAAC;IAClD,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,IAAI,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAErF,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,gBAAgB,CAAC,YAAY,CAAC,IAAI,CACrD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAC5D,CAAC;QAEF,IAAI,CAAC,YAAY;YAAE,SAAS;QAE5B,MAAM,IAAI,GAA2B;YACnC,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,CAAC;SACd,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,yBAAyB;YACzB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB;YAC5C,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,YAAY,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,iFAAiF;YACjF,MAAM,aAAa,GAAG,CAAC,MAAM,OAAO,CAAoB,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC;YAC9H,IAAI,aAAa,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;YAE9F,IAAI,aAAa,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC1C,IAAI,CAAC,UAAU,GAAG;oBAChB,OAAO,EAAE,aAAa;oBACtB,QAAQ,EAAE,YAAY,CAAC,MAAM;iBAC9B,CAAC;YACJ,CAAC;YAED,qBAAqB;YACrB,MAAM,aAAa,GAAG,CAAC,MAAM,OAAO,CAAoB,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC;YAC7G,IAAI,aAAa,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;YAE9F,IAAI,aAAa,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC1C,IAAI,CAAC,UAAU,GAAG;oBAChB,OAAO,EAAE,aAAa;oBACtB,QAAQ,EAAE,YAAY,CAAC,MAAM;iBAC9B,CAAC;gBAEF,6CAA6C;gBAC7C,gFAAgF;gBAChF,qFAAqF;gBACrF,IAAI,CAAC;oBACH,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;wBACnD,MAAM,IAAI,KAAK,CAAC,sBAAsB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC/D,CAAC;oBACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAuB,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,MAAM,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC9I,IAAI,OAAO,KAAK,SAAS;wBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,YAAY,CAAC,MAAM,YAAY,CAAC,CAAC;oBAClG,2DAA2D;oBAC3D,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;oBACzC,iBAAiB,IAAI,IAAI,CAAC,YAAY,CAAC;gBACzC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,aAAa,CAAC,KAAK,CAAC;wBAAE,MAAM,KAAK,CAAC;oBACtC,wCAAwC;oBACxC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,wBAAwB;YACxB,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAGvC,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;YAE/C,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC;YAE9D,IACE,IAAI,CAAC,UAAU;gBACf,IAAI,CAAC,UAAU;gBACf,IAAI,CAAC,YAAY,GAAG,CAAC;gBACrB,IAAI,CAAC,UAAU,GAAG,CAAC,EACnB,CAAC;gBACD,YAAY,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iGAAiG;YACjG,IAAI,aAAa,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;YACtC,0BAA0B;YAC1B,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACvB,YAAY,EAAE,CAAC;QACjB,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO;QACL,gBAAgB;QAChB,YAAY;QACZ,OAAO,EAAE;YACP,YAAY;YACZ,iBAAiB;YACjB,OAAO,EAAE,YAAY,KAAK,CAAC;SAC5B;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package",
|
|
3
3
|
"name": "@procedures/snapshot",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.12.1",
|
|
5
5
|
"description": "Snapshot and restore development environments with S3: git state, packages and files, with streamed archives and a safe restore.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"snapshot",
|
|
@@ -61,12 +61,12 @@
|
|
|
61
61
|
"provenance": true
|
|
62
62
|
},
|
|
63
63
|
"dependencies": {
|
|
64
|
-
"@procedures/client": "0.
|
|
65
|
-
"@procedures/fs": "0.
|
|
66
|
-
"@procedures/git": "0.
|
|
67
|
-
"@procedures/pnpm": "0.
|
|
68
|
-
"@procedures/s3": "0.
|
|
69
|
-
"@procedures/shell": "0.
|
|
64
|
+
"@procedures/client": "0.12.1",
|
|
65
|
+
"@procedures/fs": "0.12.1",
|
|
66
|
+
"@procedures/git": "0.12.1",
|
|
67
|
+
"@procedures/pnpm": "0.12.1",
|
|
68
|
+
"@procedures/s3": "0.12.1",
|
|
69
|
+
"@procedures/shell": "0.12.1",
|
|
70
70
|
"tar": "^7.5.0",
|
|
71
71
|
"zod": "^4.6.5"
|
|
72
72
|
},
|
package/src/module.ts
CHANGED
|
@@ -43,24 +43,27 @@ import {
|
|
|
43
43
|
// =============================================================================
|
|
44
44
|
|
|
45
45
|
// =============================================================================
|
|
46
|
-
// The rules under a root of the files (roadmap R33, tracker
|
|
46
|
+
// The rules under a root of the files (roadmap R33, tracker items O36 and O46)
|
|
47
47
|
// =============================================================================
|
|
48
48
|
|
|
49
|
-
/**
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
/**
|
|
50
|
+
* `snapshot.create`: each folder of `paths` is in the root, and the default folder is the root.
|
|
51
|
+
* Git goes through the `git.*` procedures, so their rules of the root apply. Pnpm does not start.
|
|
52
|
+
* Tar stores a symlink as a link, so the archive has only the files of the folders.
|
|
53
|
+
*/
|
|
54
|
+
const CREATE_UNDER_A_ROOT: FsRootRules = { paths: ["paths"] };
|
|
54
55
|
|
|
55
56
|
/** `snapshot.restore`: a root refuses it. */
|
|
56
57
|
const RESTORE_UNDER_A_ROOT: FsRootRules = {
|
|
57
58
|
refuse: "it downloads the archive into the temporary folder of the host through s3.download, and the names of the folders come from the data of the snapshot",
|
|
58
59
|
};
|
|
59
60
|
|
|
60
|
-
/**
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
/**
|
|
62
|
+
* `snapshot.diff`: each folder of `paths` is in the root. Without `paths`, the folders are the
|
|
63
|
+
* paths that the snapshot recorded, maybe on another machine, so a root needs `paths`. Git goes
|
|
64
|
+
* through the `git.*` procedures, so their rules of the root apply.
|
|
65
|
+
*/
|
|
66
|
+
const DIFF_UNDER_A_ROOT: FsRootRules = { paths: ["paths"], required: ["paths"] };
|
|
64
67
|
|
|
65
68
|
const snapshotCreateProcedure = createProcedure()
|
|
66
69
|
.path(["snapshot", "create"])
|
|
@@ -1,28 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The programs
|
|
2
|
+
* The programs of the snapshot procedures: git through the `git.*` procedures, and pnpm.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* - Git goes through the `git.*` procedures of the host (`ctx.client`), not through a process of
|
|
5
|
+
* this package. Under a root of the files, the rules of the root then apply to each git command:
|
|
6
|
+
* the working folder in the root, no hooks, no configuration that starts a program (tracker
|
|
7
|
+
* item O46).
|
|
8
|
+
* - `runCommand` starts pnpm. It is async, kills the process tree when the signal aborts, and runs
|
|
9
|
+
* no shell. Under a root, pnpm does not start.
|
|
7
10
|
*/
|
|
8
11
|
|
|
12
|
+
import type { ProcedureContext, ProcedurePath } from "@procedures/client";
|
|
13
|
+
import { isOutsideRoot } from "@procedures/fs/root";
|
|
9
14
|
import { runCommand } from "@procedures/shell/command";
|
|
10
15
|
import { resolvePnpm } from "@procedures/pnpm";
|
|
11
16
|
|
|
12
|
-
/** The longest time of one
|
|
17
|
+
/** The longest time of one pnpm query, in milliseconds. */
|
|
13
18
|
const QUERY_TIMEOUT_MS = 30_000;
|
|
14
19
|
|
|
15
20
|
/**
|
|
16
|
-
* This function
|
|
17
|
-
* when
|
|
21
|
+
* This function starts a `git.*` procedure of the host and gives its output. It gives `undefined`
|
|
22
|
+
* when the procedure fails, for example in a folder that is not a repository. A refusal of the
|
|
23
|
+
* root (`FORBIDDEN` with the reason `outside-root`) is not a failure of git: it stays the error.
|
|
18
24
|
*/
|
|
19
|
-
export async function
|
|
20
|
-
|
|
21
|
-
|
|
25
|
+
export async function gitCall<T>(ctx: ProcedureContext, path: ProcedurePath, input: Record<string, unknown>): Promise<T | undefined> {
|
|
26
|
+
try {
|
|
27
|
+
return await ctx.client.call<Record<string, unknown>, T>(path, input);
|
|
28
|
+
} catch (error) {
|
|
29
|
+
if (isOutsideRoot(error)) throw error;
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
22
32
|
}
|
|
23
33
|
|
|
24
|
-
/**
|
|
25
|
-
|
|
34
|
+
/**
|
|
35
|
+
* This function gives the version of pnpm, or "unknown" when pnpm cannot run. Under a root of the
|
|
36
|
+
* files (`fsRoot`), it starts no program and gives "unknown".
|
|
37
|
+
*/
|
|
38
|
+
export async function pnpmVersion(signal?: AbortSignal, fsRoot?: string): Promise<string> {
|
|
39
|
+
if (fsRoot !== undefined) return "unknown";
|
|
26
40
|
let pnpm: { command: string; prefix: string[] };
|
|
27
41
|
try {
|
|
28
42
|
pnpm = resolvePnpm();
|