@bluewombat/integrator 0.7.0 → 0.8.0
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/SPECS.md +16 -0
- package/dist/fold/backend.d.ts +8 -0
- package/dist/fold/backend.d.ts.map +1 -1
- package/dist/fold/fold.d.ts.map +1 -1
- package/dist/fold/fold.js +5 -2
- package/dist/fold/fold.js.map +1 -1
- package/dist/fold/working-files.d.ts +12 -2
- package/dist/fold/working-files.d.ts.map +1 -1
- package/dist/fold/working-files.js +46 -3
- package/dist/fold/working-files.js.map +1 -1
- package/package.json +1 -1
package/SPECS.md
CHANGED
|
@@ -221,6 +221,19 @@ Integrator writes Parent working files only when the outcome is `integrated`.
|
|
|
221
221
|
On every other outcome, Parent working files are what they were at invocation
|
|
222
222
|
start.
|
|
223
223
|
|
|
224
|
+
"What they were" is the Parent's whole tree unless the backend narrows it.
|
|
225
|
+
Before the fold, Integrator copies the Parent's working files aside so it can
|
|
226
|
+
put them back. A backend may offer `snapshotPaths(directory)`: the `/`-separated
|
|
227
|
+
paths, from the root, of the working files a failed fold has to restore. Only
|
|
228
|
+
those are copied, and on a failure only those are put back (what the fold
|
|
229
|
+
created among them is removed). A path the backend leaves out is neither read
|
|
230
|
+
nor restored: listing it is the backend's promise that the fold never writes
|
|
231
|
+
there. A backend without `snapshotPaths`, or one that returns `undefined` for a
|
|
232
|
+
directory it cannot list, gets the whole tree. `@bluewombat/isolation-git` lists
|
|
233
|
+
what git sees (tracked, plus untracked and not ignored), so `node_modules/` and
|
|
234
|
+
build output are not copied; `@bluewombat/isolation-copy` lists nothing and gets
|
|
235
|
+
the whole tree.
|
|
236
|
+
|
|
224
237
|
If Integrator began to write and then hit `conflict`, `failed`, or
|
|
225
238
|
`interrupted`, it restores Parent before returning. A leftover merge in
|
|
226
239
|
progress (index, merge state) does not remain.
|
|
@@ -378,5 +391,8 @@ either what they were at invocation start, or the complete `integrated` result.
|
|
|
378
391
|
17. `@bluewombat/isolation-copy` → copy inside; a same-type bytes difference is taken from the Child, not `conflict`.
|
|
379
392
|
18. `@bluewombat/isolation-git` and git cannot complete for a reason that is not a merge conflict → `failed`, not a copy, not `conflict`.
|
|
380
393
|
19. The CLI requires `--strategy <specifier>`; `runIntegrator` never chooses a strategy.
|
|
394
|
+
20. A backend with `snapshotPaths` and a fold that fails → Parent's listed working files are as they were, what the fold created among them is gone, and a path the backend left out is not read (an unreadable one does not fail the Integration).
|
|
395
|
+
21. A backend without `snapshotPaths`, or whose `snapshotPaths` returns `undefined` → the whole Parent is restored, as before.
|
|
396
|
+
22. `@bluewombat/isolation-git` and a `conflict` with an ignored `node_modules/` in Parent → Parent restored; the ignored directory is not read and is still there.
|
|
381
397
|
|
|
382
398
|
How to build and run this Transformer: [README.md](./README.md).
|
package/dist/fold/backend.d.ts
CHANGED
|
@@ -17,6 +17,14 @@ export type FoldBackendResult = {
|
|
|
17
17
|
* Integrator does not choose a strategy or know git versus copy.
|
|
18
18
|
*/
|
|
19
19
|
export type FoldBackend = {
|
|
20
|
+
/**
|
|
21
|
+
* The working files of `directory` a failed fold has to put back, as
|
|
22
|
+
* `/`-separated paths from its root. Absent, or `undefined` for a directory
|
|
23
|
+
* the backend cannot list: all of them. A backend that never writes a path
|
|
24
|
+
* (git never writes one it ignores) leaves it out, and the snapshot never
|
|
25
|
+
* copies it.
|
|
26
|
+
*/
|
|
27
|
+
snapshotPaths?(directory: string): Promise<readonly string[] | undefined>;
|
|
20
28
|
fold(input: {
|
|
21
29
|
parent: string;
|
|
22
30
|
child: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/fold/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,GAAG,EAAE,MAAM,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,OAAO,CAAC;QAC/B,UAAU,EAAE,MAAM,QAAQ,GAAG,SAAS,CAAC;KACxC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAChC,CAAC"}
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/fold/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;;OAMG;IACH,aAAa,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IAC1E,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,GAAG,EAAE,MAAM,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,OAAO,CAAC;QAC/B,UAAU,EAAE,MAAM,QAAQ,GAAG,SAAS,CAAC;KACxC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAChC,CAAC"}
|
package/dist/fold/fold.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fold.d.ts","sourceRoot":"","sources":["../../src/fold/fold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,KAAK,QAAQ,EAId,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;GAGG;AACH,wBAAsB,IAAI,CAAC,KAAK,EAAE;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,CAAC;IACrB,gDAAgD;IAChD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,OAAO,CAAC;CAChC,GAAG,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"fold.d.ts","sourceRoot":"","sources":["../../src/fold/fold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,KAAK,QAAQ,EAId,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;GAGG;AACH,wBAAsB,IAAI,CAAC,KAAK,EAAE;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,CAAC;IACrB,gDAAgD;IAChD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,OAAO,CAAC;CAChC,GAAG,OAAO,CAAC,UAAU,CAAC,CAiDtB"}
|
package/dist/fold/fold.js
CHANGED
|
@@ -5,7 +5,8 @@ import { removeSnapshot, restoreWorkingFiles, snapshotWorkingFiles, } from "./wo
|
|
|
5
5
|
*/
|
|
6
6
|
export async function fold(input) {
|
|
7
7
|
const { parent, child, backend, id, subject, mergeSubject, deadlineMs, now, shouldInterrupt } = input;
|
|
8
|
-
const
|
|
8
|
+
const saved = await backend.snapshotPaths?.(parent);
|
|
9
|
+
const backup = await snapshotWorkingFiles(parent, saved);
|
|
9
10
|
const shouldStop = () => {
|
|
10
11
|
if (shouldInterrupt()) {
|
|
11
12
|
return "interrupt";
|
|
@@ -16,7 +17,9 @@ export async function fold(input) {
|
|
|
16
17
|
return undefined;
|
|
17
18
|
};
|
|
18
19
|
const fail = async (result) => {
|
|
19
|
-
|
|
20
|
+
// What is in scope now includes what the fold created.
|
|
21
|
+
const current = saved === undefined ? undefined : await backend.snapshotPaths?.(parent);
|
|
22
|
+
await restoreWorkingFiles(parent, backup, saved, current);
|
|
20
23
|
await removeSnapshot(backup);
|
|
21
24
|
return result;
|
|
22
25
|
};
|
package/dist/fold/fold.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fold.js","sourceRoot":"","sources":["../../src/fold/fold.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,cAAc,EACd,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAQ5B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,KAW1B;IACC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,EAAE,GAC3F,KAAK,CAAC;IACR,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"fold.js","sourceRoot":"","sources":["../../src/fold/fold.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,cAAc,EACd,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAQ5B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,KAW1B;IACC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,EAAE,GAC3F,KAAK,CAAC;IACR,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAEzD,MAAM,UAAU,GAAG,GAAyB,EAAE;QAC5C,IAAI,eAAe,EAAE,EAAE,CAAC;YACtB,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,IAAI,GAAG,EAAE,IAAI,UAAU,EAAE,CAAC;YACxB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,KAAK,EAAE,MAAkB,EAAuB,EAAE;QAC7D,uDAAuD;QACvD,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC;QACxF,MAAM,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAChC,MAAM;YACN,KAAK;YACL,GAAG,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;YACnC,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YAC7C,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;YACvD,UAAU;YACV,GAAG;YACH,eAAe;YACf,UAAU;SACX,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;YAC7B,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;YACV,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,mCAAmC,MAAM,EAAE;SACpD,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -22,7 +22,17 @@ export declare function copyWorkingFiles(input: {
|
|
|
22
22
|
shouldStop: () => FoldStop | undefined;
|
|
23
23
|
}): Promise<void>;
|
|
24
24
|
export declare function wipeWorkingFiles(directory: string, shouldStop: () => FoldStop | undefined): Promise<void>;
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Copy the working files of `directory` aside. `paths` limits the copy to what
|
|
27
|
+
* the backend says a failed fold must restore; without it, everything.
|
|
28
|
+
*/
|
|
29
|
+
export declare function snapshotWorkingFiles(directory: string, paths?: readonly string[]): Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Put `directory` back as the snapshot found it. Given `saved` (the paths the
|
|
32
|
+
* snapshot was limited to), only working files in scope are touched: those
|
|
33
|
+
* listed now (`current`, which includes what the fold created) are removed,
|
|
34
|
+
* then `saved` is copied back. Whatever the backend left out is not touched.
|
|
35
|
+
*/
|
|
36
|
+
export declare function restoreWorkingFiles(directory: string, backup: string, saved?: readonly string[], current?: readonly string[]): Promise<void>;
|
|
27
37
|
export declare function removeSnapshot(backup: string): Promise<void>;
|
|
28
38
|
//# sourceMappingURL=working-files.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"working-files.d.ts","sourceRoot":"","sources":["../../src/fold/working-files.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC;AAE7C,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpE,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;gBAEZ,IAAI,EAAE,QAAQ;CAS3B;AAED,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1F;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAChC,cAAc,IAAI,OAAO,CAAC;IAC1B,WAAW,IAAI,OAAO,CAAC;IACvB,MAAM,IAAI,OAAO,CAAC;CACnB,GAAG,QAAQ,GAAG,OAAO,CAWrB;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,CAmBxE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,QAAQ,GAAG,SAAS,CAAC;CACxC,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhB;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,QAAQ,GAAG,SAAS,GACrC,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"working-files.d.ts","sourceRoot":"","sources":["../../src/fold/working-files.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC;AAE7C,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpE,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;gBAEZ,IAAI,EAAE,QAAQ;CAS3B;AAED,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1F;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAChC,cAAc,IAAI,OAAO,CAAC;IAC1B,WAAW,IAAI,OAAO,CAAC;IACvB,MAAM,IAAI,OAAO,CAAC;CACnB,GAAG,QAAQ,GAAG,OAAO,CAWrB;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,CAmBxE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,QAAQ,GAAG,SAAS,CAAC;CACxC,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhB;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,QAAQ,GAAG,SAAS,GACrC,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GACxB,OAAO,CAAC,MAAM,CAAC,CAajB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,EACzB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAef;AAwBD,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElE"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { copyFile, lstat, mkdir, mkdtemp, readdir, readlink, rm, symlink } from "node:fs/promises";
|
|
2
2
|
import { tmpdir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
4
|
export class IntegrationStoppedError extends Error {
|
|
5
5
|
stop;
|
|
6
6
|
constructor(stop) {
|
|
@@ -68,8 +68,16 @@ export async function wipeWorkingFiles(directory, shouldStop) {
|
|
|
68
68
|
await rm(join(directory, name), { recursive: true, force: true });
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
|
-
|
|
71
|
+
/**
|
|
72
|
+
* Copy the working files of `directory` aside. `paths` limits the copy to what
|
|
73
|
+
* the backend says a failed fold must restore; without it, everything.
|
|
74
|
+
*/
|
|
75
|
+
export async function snapshotWorkingFiles(directory, paths) {
|
|
72
76
|
const backup = await mkdtemp(join(tmpdir(), "integrator-parent-"));
|
|
77
|
+
if (paths !== undefined) {
|
|
78
|
+
await copyPaths(directory, backup, paths);
|
|
79
|
+
return backup;
|
|
80
|
+
}
|
|
73
81
|
await copyWorkingFiles({
|
|
74
82
|
from: directory,
|
|
75
83
|
to: backup,
|
|
@@ -78,7 +86,20 @@ export async function snapshotWorkingFiles(directory) {
|
|
|
78
86
|
});
|
|
79
87
|
return backup;
|
|
80
88
|
}
|
|
81
|
-
|
|
89
|
+
/**
|
|
90
|
+
* Put `directory` back as the snapshot found it. Given `saved` (the paths the
|
|
91
|
+
* snapshot was limited to), only working files in scope are touched: those
|
|
92
|
+
* listed now (`current`, which includes what the fold created) are removed,
|
|
93
|
+
* then `saved` is copied back. Whatever the backend left out is not touched.
|
|
94
|
+
*/
|
|
95
|
+
export async function restoreWorkingFiles(directory, backup, saved, current) {
|
|
96
|
+
if (saved !== undefined) {
|
|
97
|
+
for (const path of current ?? saved) {
|
|
98
|
+
await rm(join(directory, path), { recursive: true, force: true });
|
|
99
|
+
}
|
|
100
|
+
await copyPaths(backup, directory, saved);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
82
103
|
await wipeWorkingFiles(directory, () => undefined);
|
|
83
104
|
await copyWorkingFiles({
|
|
84
105
|
from: backup,
|
|
@@ -87,6 +108,28 @@ export async function restoreWorkingFiles(directory, backup) {
|
|
|
87
108
|
shouldStop: () => undefined,
|
|
88
109
|
});
|
|
89
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Copy each of `paths` from `from` to `to`, creating directories as needed. A
|
|
113
|
+
* path that is not there, or is a directory (a submodule), is skipped: the
|
|
114
|
+
* list names files.
|
|
115
|
+
*/
|
|
116
|
+
async function copyPaths(from, to, paths) {
|
|
117
|
+
for (const path of paths) {
|
|
118
|
+
const src = join(from, path);
|
|
119
|
+
const kind = await pathKind(src);
|
|
120
|
+
if (kind !== "file" && kind !== "symlink") {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const dest = join(to, path);
|
|
124
|
+
await mkdir(dirname(dest), { recursive: true });
|
|
125
|
+
if (kind === "symlink") {
|
|
126
|
+
await symlink(await readlink(src), dest);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
await copyFile(src, dest);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
90
133
|
export async function removeSnapshot(backup) {
|
|
91
134
|
await rm(backup, { recursive: true, force: true });
|
|
92
135
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"working-files.js","sourceRoot":"","sources":["../../src/fold/working-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACnG,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"working-files.js","sourceRoot":"","sources":["../../src/fold/working-files.ts"],"names":[],"mappings":"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"}
|