@limrun/api 0.39.4 → 0.39.5
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 +4 -0
- package/folder-sync-ignore.d.mts +38 -0
- package/folder-sync-ignore.d.mts.map +1 -1
- package/folder-sync-ignore.d.ts +38 -0
- package/folder-sync-ignore.d.ts.map +1 -1
- package/folder-sync-ignore.js +107 -12
- package/folder-sync-ignore.js.map +1 -1
- package/folder-sync-ignore.mjs +107 -12
- package/folder-sync-ignore.mjs.map +1 -1
- package/folder-sync.d.mts +6 -0
- package/folder-sync.d.mts.map +1 -1
- package/folder-sync.d.ts +6 -0
- package/folder-sync.d.ts.map +1 -1
- package/folder-sync.js +153 -13
- package/folder-sync.js.map +1 -1
- package/folder-sync.mjs +153 -13
- package/folder-sync.mjs.map +1 -1
- package/package.json +1 -1
- package/resources/xcode-instances-helpers.d.mts +6 -0
- package/resources/xcode-instances-helpers.d.mts.map +1 -1
- package/resources/xcode-instances-helpers.d.ts +6 -0
- package/resources/xcode-instances-helpers.d.ts.map +1 -1
- package/resources/xcode-instances-helpers.js +7 -25
- package/resources/xcode-instances-helpers.js.map +1 -1
- package/resources/xcode-instances-helpers.mjs +7 -25
- package/resources/xcode-instances-helpers.mjs.map +1 -1
- package/src/folder-sync-ignore.ts +128 -12
- package/src/folder-sync.ts +189 -17
- package/src/resources/xcode-instances-helpers.ts +13 -29
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
|
@@ -223,36 +223,18 @@ export class XcodeInstances extends GeneratedXcodeInstances {
|
|
|
223
223
|
ignoreFn: await createIgnoreFn(localCodePath, {
|
|
224
224
|
basisCacheDir,
|
|
225
225
|
log,
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
relativePath.startsWith('DerivedData/') ||
|
|
230
|
-
relativePath.startsWith('Index.noindex/') ||
|
|
231
|
-
relativePath.startsWith('ModuleCache.noindex/') ||
|
|
232
|
-
relativePath.startsWith('.index-build/')) {
|
|
233
|
-
return true;
|
|
234
|
-
}
|
|
235
|
-
if (relativePath.startsWith('.swiftpm/') ||
|
|
236
|
-
relativePath.startsWith('Pods/') ||
|
|
237
|
-
relativePath.startsWith('Carthage/Build/')) {
|
|
238
|
-
return true;
|
|
239
|
-
}
|
|
240
|
-
if (relativePath.includes('/xcuserdata/')) {
|
|
241
|
-
return true;
|
|
242
|
-
}
|
|
243
|
-
if (relativePath.includes('.dSYM/')) {
|
|
244
|
-
return true;
|
|
245
|
-
}
|
|
246
|
-
if (opts?.ignore?.(relativePath)) {
|
|
247
|
-
return true;
|
|
248
|
-
}
|
|
249
|
-
return false;
|
|
250
|
-
},
|
|
226
|
+
xcodeDefaults: true,
|
|
227
|
+
...(opts?.include ? { include: opts.include } : {}),
|
|
228
|
+
...(opts?.ignore ? { additional: opts.ignore } : {}),
|
|
251
229
|
}),
|
|
252
230
|
basisCacheDir,
|
|
253
231
|
watch: opts?.watch ?? true,
|
|
254
232
|
launchMode: 'ForegroundIfRunning',
|
|
255
233
|
log,
|
|
234
|
+
// The limbuild workspace sync understands symlink entries; the
|
|
235
|
+
// limulator app-install sync (ios-client.ts) does not and keeps
|
|
236
|
+
// the default skip behavior.
|
|
237
|
+
syncSymlinks: true,
|
|
256
238
|
...(additionalFiles ? { additionalFiles } : {}),
|
|
257
239
|
};
|
|
258
240
|
const result = await syncFolderImpl(localCodePath, codeSyncOpts);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xcode-instances-helpers.mjs","sourceRoot":"","sources":["../src/resources/xcode-instances-helpers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"xcode-instances-helpers.mjs","sourceRoot":"","sources":["../src/resources/xcode-instances-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import fs from 'fs';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { execFile } from 'child_process';
|
|
4
4
|
import { promisify } from 'util';
|
|
5
|
-
import ignorePkg from 'ignore';
|
|
5
|
+
import ignorePkg, { type Ignore } from 'ignore';
|
|
6
6
|
|
|
7
7
|
const execFileAsync = promisify(execFile);
|
|
8
8
|
|
|
@@ -11,7 +11,26 @@ export type IgnoreFn = (relativePath: string) => boolean;
|
|
|
11
11
|
export type IgnoreLogger = (level: 'debug' | 'info' | 'warn' | 'error', msg: string) => void;
|
|
12
12
|
|
|
13
13
|
export type IgnoreFnOptions = {
|
|
14
|
+
/** User-supplied extra excludes (the CLI's --ignore). Consulted after every built-in layer. */
|
|
14
15
|
additional?: IgnoreFn;
|
|
16
|
+
/**
|
|
17
|
+
* User-supplied force-includes (the CLI's --include): matches sync even when
|
|
18
|
+
* gitignored or covered by the default Xcode excludes. Only `.git`,
|
|
19
|
+
* `.DS_Store`, and the basis cache stay excluded. Note: the walk prunes
|
|
20
|
+
* gitignore-excluded directories, so to rescue files under a wholly-ignored
|
|
21
|
+
* parent the predicate must also match the parent directory paths (probed
|
|
22
|
+
* with a trailing slash), e.g. `^ios/` reaches `ios/GeneratedKit/...` but
|
|
23
|
+
* `GeneratedKit/` alone does not.
|
|
24
|
+
*/
|
|
25
|
+
include?: IgnoreFn;
|
|
26
|
+
/**
|
|
27
|
+
* "Xcode project sync mode." Enables the default Xcode/dependency excludes
|
|
28
|
+
* (build/, Pods/, xcuserdata/, …) and nested-.gitignore honoring. When
|
|
29
|
+
* unset (e.g. the app-bundle install sync) only the root .gitignore is
|
|
30
|
+
* read, so a build artifact isn't reshaped by gitignore files embedded
|
|
31
|
+
* in it.
|
|
32
|
+
*/
|
|
33
|
+
xcodeDefaults?: boolean;
|
|
15
34
|
basisCacheDir: string;
|
|
16
35
|
log?: IgnoreLogger;
|
|
17
36
|
};
|
|
@@ -52,21 +71,98 @@ async function getGitTrackedSets(rootDir: string): Promise<GitTrackedSets | null
|
|
|
52
71
|
}
|
|
53
72
|
}
|
|
54
73
|
|
|
74
|
+
// Root-anchored (top-level only) default excludes; nested build junk is the
|
|
75
|
+
// project's own nested .gitignore's job. xcuserdata/.dSYM below are any-depth.
|
|
76
|
+
const XCODE_DEFAULT_EXCLUDE_PREFIXES = [
|
|
77
|
+
'build/',
|
|
78
|
+
'.build/',
|
|
79
|
+
'DerivedData/',
|
|
80
|
+
'Index.noindex/',
|
|
81
|
+
'ModuleCache.noindex/',
|
|
82
|
+
'.index-build/',
|
|
83
|
+
'.swiftpm/',
|
|
84
|
+
'Pods/',
|
|
85
|
+
'Carthage/Build/',
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Builds the layered sync ignore predicate. First decisive answer wins:
|
|
90
|
+
*
|
|
91
|
+
* 1. `.git`, `.DS_Store`, the basis cache: excluded, never overridable.
|
|
92
|
+
* 2. User include (--include): explicit intent beats the default excludes.
|
|
93
|
+
* 3. Default Xcode/dependency excludes (when xcodeDefaults is set).
|
|
94
|
+
* 4. Built-in force-include: `*.xcconfig` (gitignored xcconfigs are still
|
|
95
|
+
* required to reproduce the build remotely). Gitignored projects are NOT
|
|
96
|
+
* force-included: limbuild regenerates them from project.yml, and
|
|
97
|
+
* exact-version holdouts force-sync theirs with `--include`.
|
|
98
|
+
* 5. `.gitignore` chain: the root file, plus nested ones with git semantics
|
|
99
|
+
* when xcodeDefaults is set (rules bind relative to their containing
|
|
100
|
+
* directory, deeper files override shallower ones). Only a decisive
|
|
101
|
+
* *exclude* short-circuits; a negation re-include defers to layer 6.
|
|
102
|
+
* Directory pruning in the walk means only layers 2 and 4 can reach a
|
|
103
|
+
* file whose parent directory is gitignore-excluded, and only when the
|
|
104
|
+
* predicate matches the pruned parent directory paths too.
|
|
105
|
+
* 6. User ignore (--ignore).
|
|
106
|
+
*/
|
|
55
107
|
export async function createIgnoreFn(rootDir: string, options: IgnoreFnOptions): Promise<IgnoreFn> {
|
|
56
108
|
const rootResolved = path.resolve(rootDir);
|
|
109
|
+
|
|
110
|
+
// Per-directory .gitignore instances, lazily loaded; key is the dir path
|
|
111
|
+
// relative to the root ('' = root), value null when the dir has none.
|
|
57
112
|
// ignorecase: false matches git's default semantics. The package defaults to true,
|
|
58
113
|
// which silently drops e.g. `Vendor/` when .gitignore says `vendor/` (Ruby convention).
|
|
59
114
|
// allowRelativePaths: true so a `../`-style path doesn't throw mid-sync — treat it as
|
|
60
115
|
// "not ignored" and let it through, since the cost of dropping a needed file is higher
|
|
61
116
|
// than including an unexpected one.
|
|
62
|
-
const
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
117
|
+
const dirIgnores = new Map<string, Ignore | null>();
|
|
118
|
+
const gitignoreFor = (dirRel: string): Ignore | null => {
|
|
119
|
+
let ig = dirIgnores.get(dirRel);
|
|
120
|
+
if (ig !== undefined) return ig;
|
|
121
|
+
try {
|
|
122
|
+
const content = fs.readFileSync(
|
|
123
|
+
path.join(rootResolved, dirRel.split('/').join(path.sep), '.gitignore'),
|
|
124
|
+
'utf-8',
|
|
125
|
+
);
|
|
126
|
+
ig = ignorePkg({ ignorecase: false, allowRelativePaths: true }).add(content);
|
|
127
|
+
} catch {
|
|
128
|
+
ig = null;
|
|
129
|
+
}
|
|
130
|
+
dirIgnores.set(dirRel, ig);
|
|
131
|
+
return ig;
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
// xcodeDefaults selects "Xcode project sync mode": besides the default junk
|
|
135
|
+
// excludes it also enables nested-.gitignore honoring and the project-file
|
|
136
|
+
// force-includes below. Callers that don't set it (e.g. the app-bundle
|
|
137
|
+
// install sync) keep the legacy behavior: root-only .gitignore and no
|
|
138
|
+
// project force-includes, so a build artifact isn't reshaped by gitignore
|
|
139
|
+
// files or Xcode-specific rules that happen to sit inside it.
|
|
140
|
+
const nestedGitignore = !!options.xcodeDefaults;
|
|
141
|
+
|
|
142
|
+
// Evaluates the .gitignore chain for a path (trailing slash preserved so
|
|
143
|
+
// dir-only rules like `build/` match the directory itself). Files are
|
|
144
|
+
// consulted root-to-deepest; the last decisive match wins, so deeper
|
|
145
|
+
// files naturally override shallower ones. When nestedGitignore is off,
|
|
146
|
+
// only the root .gitignore is consulted.
|
|
147
|
+
const gitignoreDecision = (testPath: string): { ignored: boolean; rule?: string } | undefined => {
|
|
148
|
+
const withoutTrailingSlash = testPath.replace(/\/+$/, '');
|
|
149
|
+
const trailingSlash = testPath.endsWith('/') ? '/' : '';
|
|
150
|
+
const parts = withoutTrailingSlash.split('/');
|
|
151
|
+
let decision: { ignored: boolean; rule?: string } | undefined;
|
|
152
|
+
const depth = nestedGitignore ? parts.length : 1;
|
|
153
|
+
for (let i = 0; i < depth; i++) {
|
|
154
|
+
const ig = gitignoreFor(parts.slice(0, i).join('/'));
|
|
155
|
+
if (!ig) continue;
|
|
156
|
+
const result = ig.test(parts.slice(i).join('/') + trailingSlash);
|
|
157
|
+
if (result.ignored || result.unignored) {
|
|
158
|
+
decision = { ignored: result.ignored };
|
|
159
|
+
const rule = (result as { rule?: { pattern?: string } }).rule?.pattern;
|
|
160
|
+
if (rule !== undefined) decision.rule = rule;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return decision;
|
|
164
|
+
};
|
|
165
|
+
|
|
70
166
|
const basisCacheRelative = normalizeRelativePath(
|
|
71
167
|
path.relative(rootResolved, options.basisCacheDir),
|
|
72
168
|
).replace(/\/+$/, '');
|
|
@@ -86,6 +182,7 @@ export async function createIgnoreFn(rootDir: string, options: IgnoreFnOptions):
|
|
|
86
182
|
if (!normalized) return false;
|
|
87
183
|
const withoutTrailingSlash = normalized.replace(/\/+$/, '');
|
|
88
184
|
|
|
185
|
+
// 1. Never overridable.
|
|
89
186
|
if (
|
|
90
187
|
withoutTrailingSlash === '.git' ||
|
|
91
188
|
withoutTrailingSlash.startsWith('.git/') ||
|
|
@@ -103,16 +200,34 @@ export async function createIgnoreFn(rootDir: string, options: IgnoreFnOptions):
|
|
|
103
200
|
) {
|
|
104
201
|
return true;
|
|
105
202
|
}
|
|
203
|
+
// 2. User include.
|
|
204
|
+
if (options.include?.(normalized)) return false;
|
|
205
|
+
// 3. Default Xcode/dependency excludes.
|
|
206
|
+
if (options.xcodeDefaults) {
|
|
207
|
+
for (const prefix of XCODE_DEFAULT_EXCLUDE_PREFIXES) {
|
|
208
|
+
if (normalized.startsWith(prefix)) return true;
|
|
209
|
+
}
|
|
210
|
+
if (normalized.includes('/xcuserdata/') || normalized.includes('.dSYM/')) return true;
|
|
211
|
+
}
|
|
212
|
+
// 4. Built-in force-include: gitignored xcconfigs are still required to
|
|
213
|
+
// reproduce the build remotely. Gitignored .xcodeproj bundles are NOT
|
|
214
|
+
// force-included: limbuild regenerates them from project.yml, and
|
|
215
|
+
// exact-version holdouts force-sync theirs with --include.
|
|
106
216
|
if (withoutTrailingSlash.endsWith('.xcconfig')) return false;
|
|
107
|
-
|
|
217
|
+
// 5. The .gitignore chain. Only a decisive *exclude* short-circuits; a
|
|
218
|
+
// negation re-include (decision.ignored === false) still falls through to
|
|
219
|
+
// the user --ignore layer, matching the pre-restructure precedence where
|
|
220
|
+
// gitignore never overrode --ignore for a re-included path.
|
|
221
|
+
const decision = gitignoreDecision(normalized);
|
|
222
|
+
if (decision?.ignored) {
|
|
108
223
|
if (
|
|
109
224
|
trackedSets &&
|
|
110
225
|
(trackedSets.tracked.has(withoutTrailingSlash) || trackedSets.prefixes.has(withoutTrailingSlash))
|
|
111
226
|
) {
|
|
112
|
-
const rule =
|
|
227
|
+
const rule = decision.rule ?? '<unknown>';
|
|
113
228
|
if (!warnedRules.has(rule)) {
|
|
114
229
|
warnedRules.add(rule);
|
|
115
|
-
const msg = `.gitignore rule '${rule}' is dropping '${withoutTrailingSlash}', which is tracked in git. The remote build will not see this path. Remove or scope the rule if you need it synced.`;
|
|
230
|
+
const msg = `.gitignore rule '${rule}' is dropping '${withoutTrailingSlash}', which is tracked in git. The remote build will not see this path. Remove or scope the rule, or pass --include, if you need it synced.`;
|
|
116
231
|
if (log) {
|
|
117
232
|
log('warn', msg);
|
|
118
233
|
} else {
|
|
@@ -122,6 +237,7 @@ export async function createIgnoreFn(rootDir: string, options: IgnoreFnOptions):
|
|
|
122
237
|
}
|
|
123
238
|
return true;
|
|
124
239
|
}
|
|
240
|
+
// 6. User ignore.
|
|
125
241
|
if (options.additional?.(normalized)) return true;
|
|
126
242
|
return false;
|
|
127
243
|
};
|
package/src/folder-sync.ts
CHANGED
|
@@ -47,6 +47,12 @@ export type FolderSyncOptions = {
|
|
|
47
47
|
* ignoreFn: (path) => !(path.startsWith('src/') || path.endsWith('.json'))
|
|
48
48
|
*/
|
|
49
49
|
ignoreFn: IgnoreFn;
|
|
50
|
+
/**
|
|
51
|
+
* Sync symlinks as symlinks (relative, in-root targets only). Off by
|
|
52
|
+
* default: only the limbuild workspace sync understands link entries;
|
|
53
|
+
* the limulator app-install sync keeps the historical skip behavior.
|
|
54
|
+
*/
|
|
55
|
+
syncSymlinks?: boolean;
|
|
50
56
|
/**
|
|
51
57
|
* Extra files to sync into limbuild. These are included
|
|
52
58
|
* in every sync pass but are not watched directly.
|
|
@@ -77,6 +83,12 @@ type FileEntry = {
|
|
|
77
83
|
sha256: string;
|
|
78
84
|
absPath: string;
|
|
79
85
|
mode: number;
|
|
86
|
+
/**
|
|
87
|
+
* Symlink target (literal readlink output, forward slashes). Non-empty
|
|
88
|
+
* marks a symlink entry: the target string is the content (sha256/size
|
|
89
|
+
* describe it) and the entry never carries a payload.
|
|
90
|
+
*/
|
|
91
|
+
linkTarget?: string;
|
|
80
92
|
};
|
|
81
93
|
|
|
82
94
|
type FolderSyncHttpPayload = {
|
|
@@ -94,7 +106,7 @@ type FolderSyncHttpMeta = {
|
|
|
94
106
|
rootName: string;
|
|
95
107
|
install?: boolean;
|
|
96
108
|
launchMode?: 'ForegroundIfRunning' | 'RelaunchIfRunning';
|
|
97
|
-
files: { path: string; size: number; sha256: string; mode
|
|
109
|
+
files: { path: string; size: number; sha256: string; mode?: number; link?: string }[];
|
|
98
110
|
payloads: FolderSyncHttpPayload[];
|
|
99
111
|
};
|
|
100
112
|
type FolderSyncHttpResponse = {
|
|
@@ -109,6 +121,10 @@ type FolderSyncHttpResponse = {
|
|
|
109
121
|
error?: string;
|
|
110
122
|
};
|
|
111
123
|
|
|
124
|
+
/** Full uploads at or above this size get an info-level notice so "sync is
|
|
125
|
+
* stuck" turns into "a GB-scale file is being uploaded". */
|
|
126
|
+
const LARGE_UPLOAD_NOTICE_BYTES = 64 * 1024 * 1024;
|
|
127
|
+
|
|
112
128
|
const noopLogger = (_level: 'debug' | 'info' | 'warn' | 'error', _msg: string) => {
|
|
113
129
|
// Intentionally empty: callers (e.g. ios-client.ts) should provide their own logger
|
|
114
130
|
// to control verbosity and integrate with the SDK's logging setup.
|
|
@@ -269,7 +285,35 @@ async function sha256FileHex(filePath: string): Promise<string> {
|
|
|
269
285
|
});
|
|
270
286
|
}
|
|
271
287
|
|
|
272
|
-
|
|
288
|
+
/**
|
|
289
|
+
* Validates a symlink's readlink target at sync time: it must be relative,
|
|
290
|
+
* backslash-free, and lexically resolve inside the sync root when joined
|
|
291
|
+
* with the link's directory (the daemon enforces the same policy on apply,
|
|
292
|
+
* so failing here is the same failure with a better message).
|
|
293
|
+
*/
|
|
294
|
+
function validateSymlinkTarget(rel: string, target: string): void {
|
|
295
|
+
if (target.includes('\\')) {
|
|
296
|
+
throw new Error(
|
|
297
|
+
`symlink ${rel} -> ${target} target contains a backslash, which the daemon rejects; ` +
|
|
298
|
+
'remove the link or pass --ignore to skip it',
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
const resolved = path.posix.normalize(path.posix.join(path.posix.dirname(rel), target));
|
|
302
|
+
if (resolved === '.' || resolved === '..' || resolved.startsWith('../')) {
|
|
303
|
+
throw new Error(
|
|
304
|
+
`symlink ${rel} -> ${target} points outside the sync root; ` +
|
|
305
|
+
'run the sync from the repo root that contains the target, remove the link, ' +
|
|
306
|
+
'or pass --ignore to skip it',
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
async function walkFiles(
|
|
312
|
+
root: string,
|
|
313
|
+
ignoreFn: IgnoreFn,
|
|
314
|
+
syncSymlinks: boolean,
|
|
315
|
+
log?: FolderSyncOptions['log'],
|
|
316
|
+
): Promise<FileEntry[]> {
|
|
273
317
|
const rootResolved = path.resolve(root);
|
|
274
318
|
const rootStat = await fs.promises.stat(rootResolved);
|
|
275
319
|
if (rootStat.isFile()) {
|
|
@@ -305,6 +349,36 @@ async function walkFiles(root: string, ignoreFn: IgnoreFn): Promise<FileEntry[]>
|
|
|
305
349
|
stack.push(abs);
|
|
306
350
|
continue;
|
|
307
351
|
}
|
|
352
|
+
if (ent.isSymbolicLink()) {
|
|
353
|
+
if (!syncSymlinks) continue;
|
|
354
|
+
// Symlinks ship as link entries with the literal target: a
|
|
355
|
+
// symlinked directory arrives here too and is sent as a link, not
|
|
356
|
+
// traversed (git semantics). The target string is the content.
|
|
357
|
+
// Probe both forms: a symlink named e.g. `Pods` or `build` may point
|
|
358
|
+
// at a directory, so directory-only excludes (`Pods/`, `build/`)
|
|
359
|
+
// must match it and skip before validation rejects an out-of-root
|
|
360
|
+
// target.
|
|
361
|
+
if (ignoreFn(rel) || ignoreFn(rel + '/')) continue;
|
|
362
|
+
const target = (await fs.promises.readlink(abs)).split(path.sep).join('/');
|
|
363
|
+
// An absolute target can never resolve remotely and no sync root
|
|
364
|
+
// can contain it; skip it like pre-symlink clients did (with a
|
|
365
|
+
// warning) instead of failing a previously working sync.
|
|
366
|
+
if (path.posix.isAbsolute(target) || path.win32.isAbsolute(target)) {
|
|
367
|
+
log?.('warn', `skipping symlink ${rel} -> ${target}: absolute targets cannot resolve remotely`);
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
validateSymlinkTarget(rel, target);
|
|
371
|
+
const sha256 = crypto.createHash('sha256').update(target).digest('hex');
|
|
372
|
+
out.push({
|
|
373
|
+
path: rel,
|
|
374
|
+
size: Buffer.byteLength(target),
|
|
375
|
+
sha256,
|
|
376
|
+
absPath: abs,
|
|
377
|
+
mode: 0,
|
|
378
|
+
linkTarget: target,
|
|
379
|
+
});
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
308
382
|
if (!ent.isFile()) continue;
|
|
309
383
|
|
|
310
384
|
// Check custom ignores for files
|
|
@@ -329,7 +403,9 @@ async function collectAdditionalFiles(
|
|
|
329
403
|
}
|
|
330
404
|
const out: FileEntry[] = [];
|
|
331
405
|
for (const additionalFile of additionalFiles) {
|
|
332
|
-
|
|
406
|
+
// Canonicalize user-supplied remote paths ("./netrc" -> "netrc") so the
|
|
407
|
+
// manifest key matches what the daemon applies and echoes in needFull.
|
|
408
|
+
const remotePath = path.posix.normalize(additionalFile.remotePath);
|
|
333
409
|
const absPath = path.resolve(additionalFile.localPath);
|
|
334
410
|
const st = await fs.promises.stat(absPath);
|
|
335
411
|
if (!st.isFile()) {
|
|
@@ -449,9 +525,48 @@ export async function encodeXdelta3Patch(
|
|
|
449
525
|
return bytesWritten;
|
|
450
526
|
}
|
|
451
527
|
|
|
452
|
-
async function cachePut(
|
|
453
|
-
|
|
528
|
+
async function cachePut(
|
|
529
|
+
cacheRoot: string,
|
|
530
|
+
relPath: string,
|
|
531
|
+
srcFile: string,
|
|
532
|
+
linkTarget?: string,
|
|
533
|
+
checkedDirs?: Set<string>,
|
|
534
|
+
): Promise<void> {
|
|
535
|
+
const segments = relPath.split('/');
|
|
536
|
+
const dst = path.join(cacheRoot, segments.join(path.sep));
|
|
537
|
+
// Remove any ancestor that is not a real directory before mkdir/write: a
|
|
538
|
+
// path that previously synced as a symlink (or a regular file that became
|
|
539
|
+
// a directory) leaves a stale cache inode, and writing children through a
|
|
540
|
+
// symlink would corrupt the link target's cached entries while mkdir over
|
|
541
|
+
// a file throws after the server already applied. Only relevant when
|
|
542
|
+
// symlink sync is on; the caller passes checkedDirs (which also memoizes
|
|
543
|
+
// ancestors already confirmed real, so the sorted walk skips shared
|
|
544
|
+
// prefixes) then and omits it otherwise to skip the sweep entirely.
|
|
545
|
+
if (checkedDirs) {
|
|
546
|
+
let ancestor = cacheRoot;
|
|
547
|
+
for (let i = 0; i < segments.length - 1; i++) {
|
|
548
|
+
ancestor = path.join(ancestor, segments[i]!);
|
|
549
|
+
if (checkedDirs.has(ancestor)) continue;
|
|
550
|
+
const ast = await fs.promises.lstat(ancestor).catch(() => null);
|
|
551
|
+
if (ast && !ast.isDirectory()) {
|
|
552
|
+
await fs.promises.rm(ancestor, { recursive: true, force: true });
|
|
553
|
+
} else if (ast) {
|
|
554
|
+
checkedDirs.add(ancestor);
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
}
|
|
454
558
|
await fs.promises.mkdir(path.dirname(dst), { recursive: true });
|
|
559
|
+
// Replace the destination inode when its type doesn't match what we're
|
|
560
|
+
// writing: a stale symlink (copyFile would follow it) or a stale directory
|
|
561
|
+
// (copyFile onto a dir throws EISDIR) left by a since-changed path.
|
|
562
|
+
const st = await fs.promises.lstat(dst).catch(() => null);
|
|
563
|
+
if (st && (st.isSymbolicLink() || st.isDirectory() || linkTarget !== undefined)) {
|
|
564
|
+
await fs.promises.rm(dst, { recursive: true, force: true });
|
|
565
|
+
}
|
|
566
|
+
if (linkTarget !== undefined) {
|
|
567
|
+
await fs.promises.symlink(linkTarget, dst);
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
455
570
|
await fs.promises.copyFile(srcFile, dst);
|
|
456
571
|
}
|
|
457
572
|
|
|
@@ -567,7 +682,7 @@ async function syncFolderOnce(
|
|
|
567
682
|
const log = opts.log ?? noopLogger;
|
|
568
683
|
const slog = (level: 'debug' | 'info' | 'warn' | 'error', msg: string) => log(level, `syncFolder: ${msg}`);
|
|
569
684
|
|
|
570
|
-
const files = await walkFiles(localFolderPath, opts.ignoreFn);
|
|
685
|
+
const files = await walkFiles(localFolderPath, opts.ignoreFn, opts.syncSymlinks ?? false, slog);
|
|
571
686
|
const additionalFiles = await collectAdditionalFiles(opts.additionalFiles);
|
|
572
687
|
const allFiles = [...files, ...additionalFiles].sort((a, b) => a.path.localeCompare(b.path));
|
|
573
688
|
const fileMap = new Map(allFiles.map((f) => [f.path, f]));
|
|
@@ -587,11 +702,30 @@ async function syncFolderOnce(
|
|
|
587
702
|
type EncodedPayload = { payload: FolderSyncHttpPayload; filePath: string; cleanupDir?: string };
|
|
588
703
|
|
|
589
704
|
// Build payload list by comparing against local basis cache (single-flight/watch assumes server matches cache).
|
|
705
|
+
// lstat, never stat/existsSync: those follow symlinks and misreport a
|
|
706
|
+
// basis symlink (dangling or pointing at another cached file) as the
|
|
707
|
+
// file itself.
|
|
590
708
|
const encodeLimit = concurrencyLimit();
|
|
591
709
|
const changed: FileEntry[] = [];
|
|
592
710
|
for (const f of allFiles) {
|
|
593
711
|
const basisPath = cacheGet(opts.basisCacheDir, f.path);
|
|
594
|
-
|
|
712
|
+
const basisStat = await fs.promises.lstat(basisPath).catch(() => null);
|
|
713
|
+
if (!basisStat) {
|
|
714
|
+
changed.push(f);
|
|
715
|
+
continue;
|
|
716
|
+
}
|
|
717
|
+
if (f.linkTarget !== undefined) {
|
|
718
|
+
if (!basisStat.isSymbolicLink()) {
|
|
719
|
+
changed.push(f);
|
|
720
|
+
continue;
|
|
721
|
+
}
|
|
722
|
+
const basisTarget = (await fs.promises.readlink(basisPath)).split(path.sep).join('/');
|
|
723
|
+
if (basisTarget !== f.linkTarget) {
|
|
724
|
+
changed.push(f);
|
|
725
|
+
}
|
|
726
|
+
continue;
|
|
727
|
+
}
|
|
728
|
+
if (!basisStat.isFile()) {
|
|
595
729
|
changed.push(f);
|
|
596
730
|
continue;
|
|
597
731
|
}
|
|
@@ -601,9 +735,17 @@ async function syncFolderOnce(
|
|
|
601
735
|
}
|
|
602
736
|
}
|
|
603
737
|
|
|
604
|
-
|
|
738
|
+
// Symlink entries travel in the manifest only, with no payloads.
|
|
739
|
+
const changedFiles = changed.filter((f) => f.linkTarget === undefined);
|
|
740
|
+
// Grows in the needFull retry below; sized here so the summary counts
|
|
741
|
+
// every path that actually shipped this sync.
|
|
742
|
+
const changedPaths = new Set(changed.map((f) => f.path));
|
|
743
|
+
|
|
744
|
+
const encodedPayloads = await mapLimit(changedFiles, encodeLimit, async (f): Promise<EncodedPayload> => {
|
|
605
745
|
const basisPath = cacheGet(opts.basisCacheDir, f.path);
|
|
606
|
-
|
|
746
|
+
const basisStat =
|
|
747
|
+
f.size >= MIN_XDELTA_TARGET_BYTES ? await fs.promises.lstat(basisPath).catch(() => null) : null;
|
|
748
|
+
if (basisStat?.isFile()) {
|
|
607
749
|
const basisSha = await sha256FileHex(basisPath);
|
|
608
750
|
const tmpDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'limulator-xdelta3-'));
|
|
609
751
|
const patchPath = path.join(tmpDir, 'patch.xdelta3');
|
|
@@ -642,6 +784,9 @@ async function syncFolderOnce(
|
|
|
642
784
|
}
|
|
643
785
|
}
|
|
644
786
|
slog('debug', `full(file): ${f.path} size=${f.size}`);
|
|
787
|
+
if (f.size >= LARGE_UPLOAD_NOTICE_BYTES) {
|
|
788
|
+
slog('info', `uploading large file ${f.path} (${fmtBytes(f.size)})`);
|
|
789
|
+
}
|
|
645
790
|
bytesSentFull += f.size;
|
|
646
791
|
return {
|
|
647
792
|
payload: {
|
|
@@ -663,7 +808,8 @@ async function syncFolderOnce(
|
|
|
663
808
|
path: f.path,
|
|
664
809
|
size: f.size,
|
|
665
810
|
sha256: f.sha256.toLowerCase(),
|
|
666
|
-
mode
|
|
811
|
+
// Symlink entries carry the target; regular files carry the mode bits.
|
|
812
|
+
...(f.linkTarget !== undefined ? { link: f.linkTarget } : { mode: f.mode }),
|
|
667
813
|
})),
|
|
668
814
|
payloads: encodedPayloads.map((p) => p.payload),
|
|
669
815
|
};
|
|
@@ -696,10 +842,29 @@ async function syncFolderOnce(
|
|
|
696
842
|
// Retry once if server needs full for some paths (basis mismatch).
|
|
697
843
|
if (!resp.ok && resp.needFull && resp.needFull.length > 0) {
|
|
698
844
|
const need = new Set(resp.needFull);
|
|
845
|
+
// A daemon that predates symlink support json-drops the `link` field and
|
|
846
|
+
// asks for these entries as full files. Streaming absPath would FOLLOW
|
|
847
|
+
// the link and silently materialize target content remotely, so fail loud
|
|
848
|
+
// instead. (New daemons never put symlink entries in needFull.)
|
|
849
|
+
const needFullLinks = [...need].filter((p) => fileMap.get(p)?.linkTarget !== undefined);
|
|
850
|
+
if (needFullLinks.length > 0) {
|
|
851
|
+
throw new Error(
|
|
852
|
+
"this instance's build daemon does not support symlinks yet (needs an updated limbuild); " +
|
|
853
|
+
`recreate the instance or retry later. Paths: ${needFullLinks.join(', ')}`,
|
|
854
|
+
);
|
|
855
|
+
}
|
|
699
856
|
const retryPayloads: EncodedPayload[] = [];
|
|
700
857
|
for (const p of need) {
|
|
701
858
|
const entry = fileMap.get(p);
|
|
702
859
|
if (!entry) continue;
|
|
860
|
+
// The retry uploads real bytes: count them (and surface large files)
|
|
861
|
+
// exactly like first-pass fulls, or a fresh-daemon resync of a warm
|
|
862
|
+
// cache reports "sent=0B" while gigabytes upload.
|
|
863
|
+
if (entry.size >= LARGE_UPLOAD_NOTICE_BYTES) {
|
|
864
|
+
slog('info', `uploading large file ${entry.path} (${fmtBytes(entry.size)})`);
|
|
865
|
+
}
|
|
866
|
+
bytesSentFull += entry.size;
|
|
867
|
+
changedPaths.add(entry.path);
|
|
703
868
|
retryPayloads.push({
|
|
704
869
|
payload: {
|
|
705
870
|
kind: 'full',
|
|
@@ -709,10 +874,12 @@ async function syncFolderOnce(
|
|
|
709
874
|
},
|
|
710
875
|
filePath: entry.absPath,
|
|
711
876
|
});
|
|
712
|
-
bytesSentFull += entry.size;
|
|
713
877
|
}
|
|
714
878
|
if (retryPayloads.length > 0) {
|
|
715
|
-
slog(
|
|
879
|
+
slog(
|
|
880
|
+
'info',
|
|
881
|
+
`daemon requested a full upload for ${retryPayloads.length} files (no matching basis); retrying once`,
|
|
882
|
+
);
|
|
716
883
|
const retryMeta: FolderSyncHttpMeta = {
|
|
717
884
|
...meta,
|
|
718
885
|
id: genId('sync'),
|
|
@@ -749,11 +916,12 @@ async function syncFolderOnce(
|
|
|
749
916
|
const tookMs = nowMs() - totalStart;
|
|
750
917
|
const totalBytes = bytesSentFull + bytesSentDelta;
|
|
751
918
|
slog(
|
|
752
|
-
'
|
|
753
|
-
`sync
|
|
754
|
-
|
|
755
|
-
)}
|
|
919
|
+
'info',
|
|
920
|
+
`sync complete: files=${allFiles.length} changed=${changedPaths.size} sent=${fmtBytes(
|
|
921
|
+
totalBytes,
|
|
922
|
+
)} in ${fmtMs(tookMs)}`,
|
|
756
923
|
);
|
|
924
|
+
slog('debug', `sync timing syncWork=${fmtMs(syncWorkMs)} total=${fmtMs(tookMs)}`);
|
|
757
925
|
const out: SyncFolderResult = { bytesSent: totalBytes };
|
|
758
926
|
if (resp.installedAppPath) {
|
|
759
927
|
out.installedAppPath = resp.installedAppPath;
|
|
@@ -762,8 +930,12 @@ async function syncFolderOnce(
|
|
|
762
930
|
out.installedBundleId = resp.bundleId;
|
|
763
931
|
}
|
|
764
932
|
// Update local cache optimistically: after a successful sync, cache reflects current local tree.
|
|
933
|
+
// The stale-symlink-ancestor sweep only matters when symlink sync is on
|
|
934
|
+
// (otherwise the cache never holds a symlink); checkedDirs memoizes ancestors
|
|
935
|
+
// across the sorted walk.
|
|
936
|
+
const checkedDirs = opts.syncSymlinks ? new Set<string>() : undefined;
|
|
765
937
|
for (const f of allFiles) {
|
|
766
|
-
await cachePut(opts.basisCacheDir, f.path, f.absPath);
|
|
938
|
+
await cachePut(opts.basisCacheDir, f.path, f.absPath, f.linkTarget, checkedDirs);
|
|
767
939
|
}
|
|
768
940
|
return out;
|
|
769
941
|
}
|