craftar 0.32.0 → 0.33.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/README.md +29 -5
- package/dist/cli.js +267 -54
- package/dist/cli.js.map +1 -1
- package/dist/core/cache.js +57 -7
- package/dist/core/cache.js.map +1 -1
- package/dist/core/clone.js +416 -0
- package/dist/core/clone.js.map +1 -0
- package/dist/core/doctor.js +22 -9
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/forge.js +48 -0
- package/dist/core/forge.js.map +1 -1
- package/dist/core/init-flow.js +121 -3
- package/dist/core/init-flow.js.map +1 -1
- package/dist/core/init.js +10 -1
- package/dist/core/init.js.map +1 -1
- package/dist/core/integrations.js +8 -1
- package/dist/core/integrations.js.map +1 -1
- package/dist/core/registry.js +123 -4
- package/dist/core/registry.js.map +1 -1
- package/dist/core/remote.js +31 -15
- package/dist/core/remote.js.map +1 -1
- package/dist/core/repos.js +299 -0
- package/dist/core/repos.js.map +1 -0
- package/dist/core/sync.js +7 -2
- package/dist/core/sync.js.map +1 -1
- package/package.json +1 -1
package/dist/core/cache.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { promises as fs } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { credentialKeys, hideKeys, namedCacheKeys, readRegistry } from "./registry.js";
|
|
4
|
-
import { cacheDir, cacheKey, classifyForge, inspectCache, pruneTrees, removeEntry, removeLeftover, withPruneLock, } from "./remote.js";
|
|
3
|
+
import { credentialKeys, hideCacheKeys, hideCacheSegment, hideKeys, namedCacheKeys, readRegistry, vouchedKeys } from "./registry.js";
|
|
4
|
+
import { cacheDir, cacheKey, classifyForge, inspectCache, pruneTrees, removeEntry, removeLeftover, REMOVING_PREFIX, withPruneLock, } from "./remote.js";
|
|
5
5
|
import { readWorkspaceConfig } from "./sync.js";
|
|
6
6
|
/** Build the "whole entries kept" warning from a reason (used by two code paths). */
|
|
7
7
|
const wholeEntriesWarning = (reason) => `whole entries kept: ${reason} — nothing can tell which ones are used`;
|
|
@@ -20,9 +20,17 @@ export async function pruneCache(home, opts) {
|
|
|
20
20
|
// The keys the registry records for a URL with credentials: an entry's name is its key, and such a
|
|
21
21
|
// key holds them in clear. Filled once the registry is read; nothing this run says names one.
|
|
22
22
|
const hide = [];
|
|
23
|
+
// The unvouched keys: filled after the snapshot is built. A failure before the snapshot
|
|
24
|
+
// uses `hideCacheSegment`; a failure after it uses `hideCacheKeys(text, hide, unvouched)` (spec 39 §5.1).
|
|
25
|
+
let snapshotBuilt = false;
|
|
26
|
+
const unvouched = [];
|
|
23
27
|
// The actual prune work: under the prune lock for a run, no lock for dry-run.
|
|
24
28
|
// Everything after the "no forges/" check runs under the prune lock (§4.2 step 0).
|
|
25
29
|
const doPrune = async (lock) => {
|
|
30
|
+
// Reset the state in case of retry (spec 39 §5.1: an entry unvouched at the snapshot stays labelled for the whole run).
|
|
31
|
+
snapshotBuilt = false;
|
|
32
|
+
hide.length = 0;
|
|
33
|
+
unvouched.length = 0;
|
|
26
34
|
const start = Date.now();
|
|
27
35
|
// Step 2: Determine naming info (§4.2 step 2) — under the lock so a waiting prune sees the state
|
|
28
36
|
// after the one that held the lock finishes.
|
|
@@ -59,8 +67,9 @@ export async function pruneCache(home, opts) {
|
|
|
59
67
|
hide.push(...credentialKeys(reg));
|
|
60
68
|
// Step 3: Snapshot the cache — under the lock.
|
|
61
69
|
let snapshot;
|
|
70
|
+
const doInspect = opts.inspectCache ?? inspectCache;
|
|
62
71
|
try {
|
|
63
|
-
snapshot = await
|
|
72
|
+
snapshot = await doInspect(home);
|
|
64
73
|
}
|
|
65
74
|
catch (e) {
|
|
66
75
|
throw new Error(`cannot read ${forgesDir}: ${e.message}`);
|
|
@@ -69,6 +78,27 @@ export async function pruneCache(home, opts) {
|
|
|
69
78
|
// the lock is in forges/ during the snapshot but is not part of the cache content.
|
|
70
79
|
const headerBytes = snapshot.bytes - lock.bytes;
|
|
71
80
|
const header = { forges: forgesDir, entries: snapshot.entries.length, bytes: headerBytes };
|
|
81
|
+
// The unvouched list: every key in the snapshot that is not vouched (spec 39 §5.1).
|
|
82
|
+
// Built now, so `guarded` knows whether the failure came before or after the snapshot.
|
|
83
|
+
const vouched = vouchedKeys(named, reg);
|
|
84
|
+
unvouched.length = 0; // Clear in case of retry
|
|
85
|
+
for (const e of snapshot.entries)
|
|
86
|
+
if (!vouched.has(e.key))
|
|
87
|
+
unvouched.push(e.key);
|
|
88
|
+
// Keys inside ~removing- directories: strip the prefix and the trailing `-<digits>`.
|
|
89
|
+
for (const r of snapshot.removing) {
|
|
90
|
+
const name = path.basename(r.dir);
|
|
91
|
+
if (name.startsWith(REMOVING_PREFIX)) {
|
|
92
|
+
const rest = name.slice(REMOVING_PREFIX.length);
|
|
93
|
+
const lastDash = rest.lastIndexOf("-");
|
|
94
|
+
if (lastDash !== -1) {
|
|
95
|
+
const maybeKey = rest.slice(0, lastDash);
|
|
96
|
+
if (!vouched.has(maybeKey) && !hide.includes(maybeKey))
|
|
97
|
+
unvouched.push(maybeKey);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
snapshotBuilt = true; // Mark that the snapshot was built for guarded's hide logic.
|
|
72
102
|
const removed = [];
|
|
73
103
|
const kept = [];
|
|
74
104
|
const warnings = [];
|
|
@@ -216,9 +246,13 @@ export async function pruneCache(home, opts) {
|
|
|
216
246
|
}
|
|
217
247
|
const freedBytes = removed.reduce((sum, r) => sum + r.bytes, 0);
|
|
218
248
|
// The report names such an entry by the fixed label, in every path and warning.
|
|
219
|
-
|
|
249
|
+
// hideCacheKeys labels both credential and unvouched keys by merged ranges of the original text (spec 39 review rounds 2-3).
|
|
250
|
+
// An entry unvouched at the snapshot stays labelled for the whole run (fail closed).
|
|
251
|
+
const hidePath = (text) => hideCacheKeys(text, hide, unvouched);
|
|
252
|
+
const shownRemoved = removed.map((r) => ({ ...r, path: hidePath(r.path) }));
|
|
253
|
+
const shownKept = kept.map((r) => ({ ...r, path: hidePath(r.path) }));
|
|
220
254
|
return {
|
|
221
|
-
report: { home, dryRun: opts.dryRun, removed:
|
|
255
|
+
report: { home, dryRun: opts.dryRun, removed: shownRemoved, kept: shownKept, freedBytes, warnings: warnings.map(hidePath) },
|
|
222
256
|
header,
|
|
223
257
|
};
|
|
224
258
|
};
|
|
@@ -229,10 +263,26 @@ export async function pruneCache(home, opts) {
|
|
|
229
263
|
return await doPrune(lock);
|
|
230
264
|
}
|
|
231
265
|
catch (e) {
|
|
232
|
-
if (!(e instanceof Error)
|
|
266
|
+
if (!(e instanceof Error))
|
|
267
|
+
throw e;
|
|
268
|
+
// Before the snapshot: use hideCacheSegment then hideKeys (spec 39 §5.1).
|
|
269
|
+
// Two passes are safe: hideCacheSegment replaces the whole segment after `forges/`, and a
|
|
270
|
+
// credential key is a cacheKey — only [a-z0-9._-], ending in `-<12 hex>` — while the inserted
|
|
271
|
+
// label holds no such run and starts with `(` and holds spaces, so hideKeys can match neither
|
|
272
|
+
// inside nor across it.
|
|
273
|
+
// After the snapshot: use hideCacheKeys, one call over the original text (spec 39 review rounds 2-3).
|
|
274
|
+
let msg = e.message;
|
|
275
|
+
if (!snapshotBuilt) {
|
|
276
|
+
msg = hideCacheSegment(msg, home);
|
|
277
|
+
msg = hideKeys(msg, hide);
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
msg = hideCacheKeys(msg, hide, unvouched);
|
|
281
|
+
}
|
|
282
|
+
if (msg === e.message)
|
|
233
283
|
throw e;
|
|
234
284
|
// A new error on purpose — no `cause`, no copied `code`: the original carries the name.
|
|
235
|
-
throw new Error(
|
|
285
|
+
throw new Error(msg);
|
|
236
286
|
}
|
|
237
287
|
};
|
|
238
288
|
// Under prune lock for a run, no lock for dry-run.
|
package/dist/core/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repository cloning for `craftar init --clone` and `craftar repos clone` (spec 37 §5.1, §5.2).
|
|
3
|
+
* The destination checks (C5) are stricter than the rest of craftar on purpose: real-path
|
|
4
|
+
* containment (§7), so neither a `..` segment nor a symlink can carry a clone outside the workspace
|
|
5
|
+
* or into the Forge. The check-then-act gap is known (§7): a destination can appear between the
|
|
6
|
+
* plan and the clone; `cloneRepos` re-checks before each runner call, and a failure there is
|
|
7
|
+
* reported as one entry's failure.
|
|
8
|
+
*
|
|
9
|
+
* PURE: no console; `process` read only for `process.platform`.
|
|
10
|
+
*/
|
|
11
|
+
import { promises as fs } from "node:fs";
|
|
12
|
+
import path from "node:path";
|
|
13
|
+
import { realpathOfNearest } from "./forge.js";
|
|
14
|
+
import { nameShaped } from "./integrations.js";
|
|
15
|
+
import { onPath, spawnInherited } from "./proc.js";
|
|
16
|
+
import { cloneArgs, isRepoName, profileRepos } from "./repos.js";
|
|
17
|
+
/* ------------------------------------------------------------------ */
|
|
18
|
+
/* Helpers */
|
|
19
|
+
/* ------------------------------------------------------------------ */
|
|
20
|
+
const WIN = process.platform === "win32";
|
|
21
|
+
/**
|
|
22
|
+
* The repository-local environment variables git itself clears when it moves to another repository.
|
|
23
|
+
* This is what `git rev-parse --local-env-vars` lists (git 2.53).
|
|
24
|
+
*/
|
|
25
|
+
const GIT_LOCAL_ENV = [
|
|
26
|
+
"GIT_ALTERNATE_OBJECT_DIRECTORIES",
|
|
27
|
+
"GIT_CONFIG",
|
|
28
|
+
"GIT_CONFIG_PARAMETERS",
|
|
29
|
+
"GIT_CONFIG_COUNT",
|
|
30
|
+
"GIT_OBJECT_DIRECTORY",
|
|
31
|
+
"GIT_DIR",
|
|
32
|
+
"GIT_WORK_TREE",
|
|
33
|
+
"GIT_IMPLICIT_WORK_TREE",
|
|
34
|
+
"GIT_GRAFT_FILE",
|
|
35
|
+
"GIT_INDEX_FILE",
|
|
36
|
+
"GIT_NO_REPLACE_OBJECTS",
|
|
37
|
+
"GIT_REPLACE_REF_BASE",
|
|
38
|
+
"GIT_PREFIX",
|
|
39
|
+
"GIT_SHALLOW_FILE",
|
|
40
|
+
"GIT_COMMON_DIR",
|
|
41
|
+
];
|
|
42
|
+
/** Set for O(1) lookup, upper-case for win32. */
|
|
43
|
+
const GIT_LOCAL_SET = new Set(GIT_LOCAL_ENV.map((v) => v.toUpperCase()));
|
|
44
|
+
/** Whether a key is one of git's repository-local variables — case-insensitive on win32, exact elsewhere. */
|
|
45
|
+
function isLocalEnvVar(k) {
|
|
46
|
+
return WIN ? GIT_LOCAL_SET.has(k.toUpperCase()) : GIT_LOCAL_SET.has(k);
|
|
47
|
+
}
|
|
48
|
+
/** Case-insensitive comparison on Windows, case-sensitive elsewhere. */
|
|
49
|
+
function eq(a, b) {
|
|
50
|
+
return WIN ? a.toLowerCase() === b.toLowerCase() : a === b;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Whether `a` is equal to `b` or strictly inside `b`, by `path.relative`. The comparison is
|
|
54
|
+
* case-insensitive on win32.
|
|
55
|
+
*/
|
|
56
|
+
function isInsideOrEqual(a, b) {
|
|
57
|
+
const rel = path.relative(b, a);
|
|
58
|
+
if (rel === "")
|
|
59
|
+
return true; // equal
|
|
60
|
+
if (path.isAbsolute(rel))
|
|
61
|
+
return false;
|
|
62
|
+
// A relative path starting with ".." (but not "..something") is outside
|
|
63
|
+
if (rel === ".." || rel.startsWith(".." + path.sep))
|
|
64
|
+
return false;
|
|
65
|
+
// On win32, compare without case
|
|
66
|
+
if (WIN) {
|
|
67
|
+
const relLower = path.relative(b.toLowerCase(), a.toLowerCase());
|
|
68
|
+
if (relLower === ".." || relLower.startsWith(".." + path.sep) || path.isAbsolute(relLower))
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Whether `a` is strictly inside `b` (equal returns false).
|
|
75
|
+
*/
|
|
76
|
+
function isStrictlyInside(a, b) {
|
|
77
|
+
const rel = path.relative(b, a);
|
|
78
|
+
if (rel === "")
|
|
79
|
+
return false; // equal, not strictly inside
|
|
80
|
+
if (path.isAbsolute(rel))
|
|
81
|
+
return false;
|
|
82
|
+
if (rel === ".." || rel.startsWith(".." + path.sep))
|
|
83
|
+
return false;
|
|
84
|
+
if (WIN) {
|
|
85
|
+
const relLower = path.relative(b.toLowerCase(), a.toLowerCase());
|
|
86
|
+
if (relLower === "" || relLower === ".." || relLower.startsWith(".." + path.sep) || path.isAbsolute(relLower))
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
/** Whether `lstat` can see anything at `p` (a file, directory, or dangling link). */
|
|
92
|
+
async function exists(p) {
|
|
93
|
+
try {
|
|
94
|
+
await fs.lstat(p);
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Walk up from `from` toward `stop`, following links via `fs.stat`. Returns the first existing
|
|
103
|
+
* path (a directory check), or null if nothing exists. Never goes above `stop`.
|
|
104
|
+
*/
|
|
105
|
+
async function firstExistingAncestor(from, stop) {
|
|
106
|
+
let current = from;
|
|
107
|
+
while (current !== stop && !eq(current, stop)) {
|
|
108
|
+
const parent = path.dirname(current);
|
|
109
|
+
if (parent === current)
|
|
110
|
+
break; // reached root
|
|
111
|
+
try {
|
|
112
|
+
const stat = await fs.stat(parent);
|
|
113
|
+
return { path: parent, isDir: stat.isDirectory() };
|
|
114
|
+
}
|
|
115
|
+
catch (e) {
|
|
116
|
+
const code = e.code;
|
|
117
|
+
if (code === "ENOENT" || code === "ENOTDIR") {
|
|
118
|
+
current = parent;
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
// Other errors (permission, etc.): stop walking
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
/* ------------------------------------------------------------------ */
|
|
128
|
+
/* destinationFault — C5 in each of its forms */
|
|
129
|
+
/* ------------------------------------------------------------------ */
|
|
130
|
+
/**
|
|
131
|
+
* The reason this destination cannot be used, or null. Checks in §5.1's order (first hit wins):
|
|
132
|
+
* 1. already exists (lstat succeeds)
|
|
133
|
+
* 2. a file sync writes (planned or lockPaths, with prefix matching)
|
|
134
|
+
* 3. resolution error (realpathOfNearest throws)
|
|
135
|
+
* 4. inside the Forge
|
|
136
|
+
* 5. leaves the workspace through a link
|
|
137
|
+
* 6. a parent is not a directory
|
|
138
|
+
*
|
|
139
|
+
* `root` and `ctx.forgeDir` are absolute; `e.path` is POSIX relative.
|
|
140
|
+
*/
|
|
141
|
+
export async function destinationFault(root, e, ctx) {
|
|
142
|
+
const abs = path.join(root, ...e.path.split("/"));
|
|
143
|
+
const pPath = e.path; // the profile's spelling, POSIX
|
|
144
|
+
// 1. lstat succeeds → already exists
|
|
145
|
+
try {
|
|
146
|
+
await fs.lstat(abs);
|
|
147
|
+
return `${pPath} already exists in the workspace — move it, or leave the clone out`;
|
|
148
|
+
}
|
|
149
|
+
catch (lstatErr) {
|
|
150
|
+
const code = lstatErr.code;
|
|
151
|
+
if (code !== "ENOENT" && code !== "ENOTDIR") {
|
|
152
|
+
// Some other lstat error (EACCES, EIO, …) falls through on purpose: step 3's
|
|
153
|
+
// realpathOfNearest fails closed, refusing the destination rather than missing it.
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// 2. A file sync writes — check planned and lockPaths
|
|
157
|
+
const pLower = pPath.toLowerCase();
|
|
158
|
+
for (const planned of ctx.planned) {
|
|
159
|
+
const plannedLower = planned.toLowerCase();
|
|
160
|
+
// Equal or e.path is a prefix of planned followed by /
|
|
161
|
+
if (pLower === plannedLower || plannedLower.startsWith(pLower + "/")) {
|
|
162
|
+
return `${pPath} is a file sync writes`;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
for (const lock of ctx.lockPaths) {
|
|
166
|
+
const lockLower = lock.toLowerCase();
|
|
167
|
+
if (pLower === lockLower || lockLower.startsWith(pLower + "/")) {
|
|
168
|
+
return `${pPath} is a file sync writes`;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// 3. Resolve paths — any error → return the error message
|
|
172
|
+
let destReal;
|
|
173
|
+
let rootReal;
|
|
174
|
+
let forgeReal;
|
|
175
|
+
try {
|
|
176
|
+
destReal = await realpathOfNearest(abs);
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
return err instanceof Error ? err.message : String(err);
|
|
180
|
+
}
|
|
181
|
+
try {
|
|
182
|
+
rootReal = await realpathOfNearest(root);
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
return err instanceof Error ? err.message : String(err);
|
|
186
|
+
}
|
|
187
|
+
try {
|
|
188
|
+
forgeReal = await realpathOfNearest(ctx.forgeDir);
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
return err instanceof Error ? err.message : String(err);
|
|
192
|
+
}
|
|
193
|
+
// 4. Inside the Forge
|
|
194
|
+
if (isInsideOrEqual(destReal, forgeReal)) {
|
|
195
|
+
return `${pPath} lies inside the Forge`;
|
|
196
|
+
}
|
|
197
|
+
// 5. Not strictly inside workspace (leaves through a link)
|
|
198
|
+
if (!isStrictlyInside(destReal, rootReal)) {
|
|
199
|
+
return `${pPath} leaves the workspace through a link`;
|
|
200
|
+
}
|
|
201
|
+
// 6. Walk up from parent toward root: first existing path that is not a directory
|
|
202
|
+
const ancestor = await firstExistingAncestor(abs, root);
|
|
203
|
+
if (ancestor && !ancestor.isDir) {
|
|
204
|
+
// Report the path relative to root, POSIX
|
|
205
|
+
const relPath = path.relative(root, ancestor.path).split(path.sep).join("/");
|
|
206
|
+
return `${relPath} is not a directory`;
|
|
207
|
+
}
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
/* ------------------------------------------------------------------ */
|
|
211
|
+
/* listRepos — present, missing, blocked */
|
|
212
|
+
/* ------------------------------------------------------------------ */
|
|
213
|
+
/**
|
|
214
|
+
* Classify each entry: `present` (lstat succeeds — present wins over a sync-writes check, §4.7),
|
|
215
|
+
* `missing` (no fault), or `blocked` (with the reason). Nothing is written.
|
|
216
|
+
*/
|
|
217
|
+
export async function listRepos(root, entries, ctx) {
|
|
218
|
+
const results = [];
|
|
219
|
+
for (const entry of entries) {
|
|
220
|
+
const abs = path.join(root, ...entry.path.split("/"));
|
|
221
|
+
// Present wins (§4.7)
|
|
222
|
+
if (await exists(abs)) {
|
|
223
|
+
results.push({ ...entry, state: "present", reason: null });
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
const fault = await destinationFault(root, entry, ctx);
|
|
227
|
+
if (fault === null) {
|
|
228
|
+
results.push({ ...entry, state: "missing", reason: null });
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
results.push({ ...entry, state: "blocked", reason: fault });
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return results;
|
|
235
|
+
}
|
|
236
|
+
/* ------------------------------------------------------------------ */
|
|
237
|
+
/* planClone — C3, C4, C5 and R1–R3 */
|
|
238
|
+
/* ------------------------------------------------------------------ */
|
|
239
|
+
/**
|
|
240
|
+
* Plan which entries to clone. This is the one place C3 and C5 (and R1–R3) are decided and C4
|
|
241
|
+
* becomes a refusal (spec 37 §5.2). The real-path containment is stricter than the rest of craftar
|
|
242
|
+
* on purpose (§7), and the check-then-act gap is known (§7).
|
|
243
|
+
*
|
|
244
|
+
* @param root Absolute path of the workspace.
|
|
245
|
+
* @param profile The profile (needs `name` and `repos`).
|
|
246
|
+
* @param ctx Destination context (planned paths, lock paths, Forge dir).
|
|
247
|
+
* @param opts.present How to handle a destination that already exists: "refuse" (init) or "skip" (repos clone).
|
|
248
|
+
* @param opts.noEntries The message tail for C3 ("nothing to clone; drop --clone" or similar).
|
|
249
|
+
* @param opts.names When given, only these names are considered; compared case-insensitively.
|
|
250
|
+
* @returns The entries to clone (in profile order) and the skipped ones (present, unnamed).
|
|
251
|
+
* @throws On C3 (no entries), C4 (profileRepos fails), C5 (destination fault), R1 (unknown name), R2 (named present), R3 (name given twice).
|
|
252
|
+
*/
|
|
253
|
+
export async function planClone(root, profile, ctx, opts) {
|
|
254
|
+
// C4: let profileRepos throw its own error
|
|
255
|
+
const allEntries = profileRepos(profile);
|
|
256
|
+
// C3: no entries
|
|
257
|
+
if (allEntries.length === 0) {
|
|
258
|
+
throw new Error(`profile ${profile.name} lists no repositories — ${opts.noEntries}`);
|
|
259
|
+
}
|
|
260
|
+
// Handle names option: R1, R3 checks, then filter
|
|
261
|
+
let entriesToConsider;
|
|
262
|
+
const namedSet = new Set(); // lower-cased names that were explicitly given
|
|
263
|
+
if (opts.names && opts.names.length > 0) {
|
|
264
|
+
// R1: check all names exist before R3
|
|
265
|
+
const entryNameMap = new Map();
|
|
266
|
+
for (const entry of allEntries) {
|
|
267
|
+
entryNameMap.set(entry.name.toLowerCase(), entry);
|
|
268
|
+
}
|
|
269
|
+
for (const name of opts.names) {
|
|
270
|
+
if (!entryNameMap.has(name.toLowerCase())) {
|
|
271
|
+
// R1: unknown name — print it only when it is shaped like a repository name
|
|
272
|
+
if (isRepoName(name) && nameShaped(name)) {
|
|
273
|
+
throw new Error(`profile ${profile.name} has no repository ${name}`);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
throw new Error(`profile ${profile.name}: a name given is not a repository name`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// R3: check for duplicates (after R1)
|
|
281
|
+
const seenNames = new Map(); // lower → original
|
|
282
|
+
for (const name of opts.names) {
|
|
283
|
+
const lower = name.toLowerCase();
|
|
284
|
+
const existing = seenNames.get(lower);
|
|
285
|
+
if (existing !== undefined) {
|
|
286
|
+
throw new Error(`${existing} is given twice`);
|
|
287
|
+
}
|
|
288
|
+
seenNames.set(lower, name);
|
|
289
|
+
namedSet.add(lower);
|
|
290
|
+
}
|
|
291
|
+
// Filter to named entries, in profile order
|
|
292
|
+
entriesToConsider = allEntries.filter((e) => namedSet.has(e.name.toLowerCase()));
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
entriesToConsider = allEntries;
|
|
296
|
+
}
|
|
297
|
+
const entries = [];
|
|
298
|
+
const skipped = [];
|
|
299
|
+
for (const entry of entriesToConsider) {
|
|
300
|
+
const abs = path.join(root, ...entry.path.split("/"));
|
|
301
|
+
const isNamed = namedSet.has(entry.name.toLowerCase());
|
|
302
|
+
const isPresent = await exists(abs);
|
|
303
|
+
if (isPresent) {
|
|
304
|
+
if (opts.present === "refuse") {
|
|
305
|
+
// C5: refuse with the exists reason
|
|
306
|
+
throw new Error(`cannot clone ${entry.name}: ${entry.path} already exists in the workspace — move it, or leave the clone out`);
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
// present: skip
|
|
310
|
+
if (isNamed) {
|
|
311
|
+
// R2: a named entry that is present
|
|
312
|
+
throw new Error(`${entry.name} is present at ${entry.path} — nothing to clone`);
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
skipped.push(entry);
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Check destination fault (C5)
|
|
321
|
+
const fault = await destinationFault(root, entry, ctx);
|
|
322
|
+
if (fault !== null) {
|
|
323
|
+
throw new Error(`cannot clone ${entry.name}: ${fault}`);
|
|
324
|
+
}
|
|
325
|
+
entries.push(entry);
|
|
326
|
+
}
|
|
327
|
+
return { entries, skipped };
|
|
328
|
+
}
|
|
329
|
+
/* ------------------------------------------------------------------ */
|
|
330
|
+
/* findGit — onPath, nothing else */
|
|
331
|
+
/* ------------------------------------------------------------------ */
|
|
332
|
+
/**
|
|
333
|
+
* Find `git` on the PATH. Returns the absolute path if found, or null.
|
|
334
|
+
* Uses `onPath` from `./proc.js` — no other lookup.
|
|
335
|
+
*/
|
|
336
|
+
export async function findGit(env) {
|
|
337
|
+
return onPath("git", env);
|
|
338
|
+
}
|
|
339
|
+
/* ------------------------------------------------------------------ */
|
|
340
|
+
/* cloneRepos — sequential runner calls */
|
|
341
|
+
/* ------------------------------------------------------------------ */
|
|
342
|
+
/**
|
|
343
|
+
* Clone the entries sequentially, one at a time. Before each clone:
|
|
344
|
+
* - If `lstat(abs)` succeeds → failed "already exists", no runner call
|
|
345
|
+
* - If the nearest existing ancestor is not strictly inside the workspace → failed "leaves the workspace through a link"
|
|
346
|
+
*
|
|
347
|
+
* The runner is called with `GIT_ALLOW_PROTOCOL: "https:ssh"` and, when `!opts.stdinIsTty`,
|
|
348
|
+
* `GIT_TERMINAL_PROMPT: "0"`.
|
|
349
|
+
*
|
|
350
|
+
* @returns One result per entry: cloned or failed with a reason. Never throws for one entry.
|
|
351
|
+
*/
|
|
352
|
+
export async function cloneRepos(root, entries, opts, run = spawnInherited) {
|
|
353
|
+
const results = [];
|
|
354
|
+
for (const entry of entries) {
|
|
355
|
+
const abs = path.join(root, ...entry.path.split("/"));
|
|
356
|
+
// Re-check: if destination now exists, fail
|
|
357
|
+
if (await exists(abs)) {
|
|
358
|
+
results.push({ entry, outcome: "failed", reason: "already exists" });
|
|
359
|
+
continue;
|
|
360
|
+
}
|
|
361
|
+
// Re-check: containment via real paths. A realpathOfNearest error (EACCES, a dangling link
|
|
362
|
+
// appeared, …) is reported as "leaves the workspace through a link" — fail closed rather than
|
|
363
|
+
// letting the clone through.
|
|
364
|
+
let destNearest;
|
|
365
|
+
let rootReal;
|
|
366
|
+
try {
|
|
367
|
+
destNearest = await realpathOfNearest(abs);
|
|
368
|
+
rootReal = await realpathOfNearest(root);
|
|
369
|
+
}
|
|
370
|
+
catch {
|
|
371
|
+
results.push({ entry, outcome: "failed", reason: "leaves the workspace through a link" });
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
if (!isStrictlyInside(destNearest, rootReal)) {
|
|
375
|
+
results.push({ entry, outcome: "failed", reason: "leaves the workspace through a link" });
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
// Build environment: drop repository-local variables (they would place the checkout or parts
|
|
379
|
+
// of it outside the checked destination) and any inherited GIT_ALLOW_PROTOCOL. Craftar's own
|
|
380
|
+
// values are set last, so nothing inherited can widen the transports (spec 37 §4.4, §7).
|
|
381
|
+
const env = {};
|
|
382
|
+
const isAllowProtocol = (k) => WIN ? k.toUpperCase() === "GIT_ALLOW_PROTOCOL" : k === "GIT_ALLOW_PROTOCOL";
|
|
383
|
+
for (const [k, v] of Object.entries(opts.env)) {
|
|
384
|
+
if (v !== undefined && !isLocalEnvVar(k) && !isAllowProtocol(k))
|
|
385
|
+
env[k] = v;
|
|
386
|
+
}
|
|
387
|
+
env.GIT_ALLOW_PROTOCOL = "https:ssh";
|
|
388
|
+
if (!opts.stdinIsTty) {
|
|
389
|
+
env.GIT_TERMINAL_PROMPT = "0";
|
|
390
|
+
}
|
|
391
|
+
// Run the clone
|
|
392
|
+
try {
|
|
393
|
+
const result = await run({
|
|
394
|
+
file: opts.git,
|
|
395
|
+
args: cloneArgs(entry),
|
|
396
|
+
cwd: root,
|
|
397
|
+
env,
|
|
398
|
+
stdin: "inherit",
|
|
399
|
+
});
|
|
400
|
+
if (result.code === 0) {
|
|
401
|
+
results.push({ entry, outcome: "cloned" });
|
|
402
|
+
}
|
|
403
|
+
else if (result.code === null) {
|
|
404
|
+
results.push({ entry, outcome: "failed", reason: "git was ended by a signal" });
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
results.push({ entry, outcome: "failed", reason: `git exited ${result.code}` });
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
results.push({ entry, outcome: "failed", reason: "git could not be started" });
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return results;
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=clone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone.js","sourceRoot":"","sources":["../../src/core/clone.ts"],"names":[],"mappings":"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"}
|