gitgrip 0.2.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/LICENSE +21 -0
- package/README.md +211 -0
- package/actions/cross-repo-sync/action.yml +55 -0
- package/assets/banner.svg +73 -0
- package/assets/icon.svg +30 -0
- package/assets/logo-dark.svg +36 -0
- package/assets/logo.svg +36 -0
- package/dist/commands/add.d.ts +9 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +80 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/bench.d.ts +12 -0
- package/dist/commands/bench.d.ts.map +1 -0
- package/dist/commands/bench.js +136 -0
- package/dist/commands/bench.js.map +1 -0
- package/dist/commands/branch.d.ts +15 -0
- package/dist/commands/branch.d.ts.map +1 -0
- package/dist/commands/branch.js +159 -0
- package/dist/commands/branch.js.map +1 -0
- package/dist/commands/checkout.d.ts +10 -0
- package/dist/commands/checkout.d.ts.map +1 -0
- package/dist/commands/checkout.js +85 -0
- package/dist/commands/checkout.js.map +1 -0
- package/dist/commands/commit.d.ts +10 -0
- package/dist/commands/commit.d.ts.map +1 -0
- package/dist/commands/commit.js +94 -0
- package/dist/commands/commit.js.map +1 -0
- package/dist/commands/diff.d.ts +11 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +105 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/env.d.ts +8 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +35 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/forall.d.ts +13 -0
- package/dist/commands/forall.d.ts.map +1 -0
- package/dist/commands/forall.js +116 -0
- package/dist/commands/forall.js.map +1 -0
- package/dist/commands/init.d.ts +15 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +106 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/link.d.ts +11 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +205 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/migrate.d.ts +17 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +180 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/pr/create.d.ts +13 -0
- package/dist/commands/pr/create.d.ts.map +1 -0
- package/dist/commands/pr/create.js +202 -0
- package/dist/commands/pr/create.js.map +1 -0
- package/dist/commands/pr/index.d.ts +4 -0
- package/dist/commands/pr/index.d.ts.map +1 -0
- package/dist/commands/pr/index.js +4 -0
- package/dist/commands/pr/index.js.map +1 -0
- package/dist/commands/pr/merge.d.ts +11 -0
- package/dist/commands/pr/merge.d.ts.map +1 -0
- package/dist/commands/pr/merge.js +168 -0
- package/dist/commands/pr/merge.js.map +1 -0
- package/dist/commands/pr/status.d.ts +9 -0
- package/dist/commands/pr/status.d.ts.map +1 -0
- package/dist/commands/pr/status.js +139 -0
- package/dist/commands/pr/status.js.map +1 -0
- package/dist/commands/push.d.ts +10 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +101 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/run.d.ts +8 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +75 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +201 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +13 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +183 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +352 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/__bench__/files.bench.d.ts +2 -0
- package/dist/lib/__bench__/files.bench.d.ts.map +1 -0
- package/dist/lib/__bench__/files.bench.js +52 -0
- package/dist/lib/__bench__/files.bench.js.map +1 -0
- package/dist/lib/__bench__/manifest.bench.d.ts +2 -0
- package/dist/lib/__bench__/manifest.bench.d.ts.map +1 -0
- package/dist/lib/__bench__/manifest.bench.js +74 -0
- package/dist/lib/__bench__/manifest.bench.js.map +1 -0
- package/dist/lib/files.d.ts +84 -0
- package/dist/lib/files.d.ts.map +1 -0
- package/dist/lib/files.js +492 -0
- package/dist/lib/files.js.map +1 -0
- package/dist/lib/git.d.ts +125 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +370 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/github.d.ts +92 -0
- package/dist/lib/github.d.ts.map +1 -0
- package/dist/lib/github.js +284 -0
- package/dist/lib/github.js.map +1 -0
- package/dist/lib/hooks.d.ts +19 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +63 -0
- package/dist/lib/hooks.js.map +1 -0
- package/dist/lib/linker.d.ts +56 -0
- package/dist/lib/linker.d.ts.map +1 -0
- package/dist/lib/linker.js +185 -0
- package/dist/lib/linker.js.map +1 -0
- package/dist/lib/manifest.d.ts +73 -0
- package/dist/lib/manifest.d.ts.map +1 -0
- package/dist/lib/manifest.js +400 -0
- package/dist/lib/manifest.js.map +1 -0
- package/dist/lib/scripts.d.ts +26 -0
- package/dist/lib/scripts.d.ts.map +1 -0
- package/dist/lib/scripts.js +123 -0
- package/dist/lib/scripts.js.map +1 -0
- package/dist/lib/timing.d.ts +100 -0
- package/dist/lib/timing.d.ts.map +1 -0
- package/dist/lib/timing.js +293 -0
- package/dist/lib/timing.js.map +1 -0
- package/dist/types.d.ts +312 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
import { copyFile as fsCopyFile, symlink, readlink, unlink, mkdir, access } from 'fs/promises';
|
|
2
|
+
import { resolve, dirname, relative, join, normalize } from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Check if a path exists
|
|
5
|
+
*/
|
|
6
|
+
async function pathExists(path) {
|
|
7
|
+
try {
|
|
8
|
+
await access(path);
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Check if a path is a symlink
|
|
17
|
+
*/
|
|
18
|
+
async function isSymlink(path) {
|
|
19
|
+
try {
|
|
20
|
+
// Use lstat to detect symlink (stat follows the link)
|
|
21
|
+
const { lstat } = await import('fs/promises');
|
|
22
|
+
const stats = await lstat(path);
|
|
23
|
+
return stats.isSymbolicLink();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validate that a path does not escape its boundary
|
|
31
|
+
*/
|
|
32
|
+
export function validatePath(basePath, targetPath) {
|
|
33
|
+
const normalizedBase = normalize(resolve(basePath));
|
|
34
|
+
const normalizedTarget = normalize(resolve(basePath, targetPath));
|
|
35
|
+
return normalizedTarget.startsWith(normalizedBase);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Ensure directory exists for a file path
|
|
39
|
+
*/
|
|
40
|
+
async function ensureDir(filePath) {
|
|
41
|
+
const dir = dirname(filePath);
|
|
42
|
+
await mkdir(dir, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Copy a file from source to destination
|
|
46
|
+
*/
|
|
47
|
+
export async function copyFile(src, dest, options = {}) {
|
|
48
|
+
const { backup = false, force = false, dryRun = false } = options;
|
|
49
|
+
// Check source exists
|
|
50
|
+
if (!(await pathExists(src))) {
|
|
51
|
+
return { copied: false, message: `Source does not exist: ${src}` };
|
|
52
|
+
}
|
|
53
|
+
// Check if destination exists
|
|
54
|
+
const destExists = await pathExists(dest);
|
|
55
|
+
if (destExists && !force) {
|
|
56
|
+
return { copied: false, message: `Destination exists: ${dest} (use --force to overwrite)` };
|
|
57
|
+
}
|
|
58
|
+
if (dryRun) {
|
|
59
|
+
return { copied: true, message: `Would copy ${src} -> ${dest}` };
|
|
60
|
+
}
|
|
61
|
+
// Create backup if needed
|
|
62
|
+
let backupPath;
|
|
63
|
+
if (destExists && backup) {
|
|
64
|
+
backupPath = `${dest}.backup.${Date.now()}`;
|
|
65
|
+
await fsCopyFile(dest, backupPath);
|
|
66
|
+
}
|
|
67
|
+
// Ensure destination directory exists
|
|
68
|
+
await ensureDir(dest);
|
|
69
|
+
// Copy the file
|
|
70
|
+
await fsCopyFile(src, dest);
|
|
71
|
+
return { copied: true, backupPath };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create a relative symlink from dest pointing to src
|
|
75
|
+
*/
|
|
76
|
+
export async function createSymlink(src, dest, options = {}) {
|
|
77
|
+
const { force = false, dryRun = false } = options;
|
|
78
|
+
// Check source exists
|
|
79
|
+
if (!(await pathExists(src))) {
|
|
80
|
+
return { created: false, message: `Source does not exist: ${src}` };
|
|
81
|
+
}
|
|
82
|
+
// Check if destination exists
|
|
83
|
+
const destExists = await pathExists(dest);
|
|
84
|
+
const destIsLink = await isSymlink(dest);
|
|
85
|
+
if (destExists || destIsLink) {
|
|
86
|
+
if (!force) {
|
|
87
|
+
return { created: false, message: `Destination exists: ${dest} (use --force to overwrite)` };
|
|
88
|
+
}
|
|
89
|
+
if (!dryRun) {
|
|
90
|
+
await unlink(dest);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (dryRun) {
|
|
94
|
+
return { created: true, message: `Would link ${dest} -> ${src}` };
|
|
95
|
+
}
|
|
96
|
+
// Ensure destination directory exists
|
|
97
|
+
await ensureDir(dest);
|
|
98
|
+
// Calculate relative path from dest to src
|
|
99
|
+
const destDir = dirname(dest);
|
|
100
|
+
const relativePath = relative(destDir, src);
|
|
101
|
+
// Create symlink
|
|
102
|
+
await symlink(relativePath, dest);
|
|
103
|
+
return { created: true };
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get the status of a single link
|
|
107
|
+
*/
|
|
108
|
+
export async function getLinkStatus(type, repoName, src, dest) {
|
|
109
|
+
const srcExists = await pathExists(src);
|
|
110
|
+
const destExists = await pathExists(dest);
|
|
111
|
+
const destIsLink = await isSymlink(dest);
|
|
112
|
+
if (!srcExists) {
|
|
113
|
+
return {
|
|
114
|
+
type,
|
|
115
|
+
repoName,
|
|
116
|
+
src,
|
|
117
|
+
dest,
|
|
118
|
+
status: 'broken',
|
|
119
|
+
message: 'Source does not exist',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (!destExists && !destIsLink) {
|
|
123
|
+
return {
|
|
124
|
+
type,
|
|
125
|
+
repoName,
|
|
126
|
+
src,
|
|
127
|
+
dest,
|
|
128
|
+
status: 'missing',
|
|
129
|
+
message: 'Destination not created',
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
if (type === 'linkfile') {
|
|
133
|
+
if (!destIsLink) {
|
|
134
|
+
return {
|
|
135
|
+
type,
|
|
136
|
+
repoName,
|
|
137
|
+
src,
|
|
138
|
+
dest,
|
|
139
|
+
status: 'conflict',
|
|
140
|
+
message: 'Destination exists but is not a symlink',
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
// Check if symlink points to correct location
|
|
144
|
+
try {
|
|
145
|
+
const linkTarget = await readlink(dest);
|
|
146
|
+
const destDir = dirname(dest);
|
|
147
|
+
const resolvedTarget = resolve(destDir, linkTarget);
|
|
148
|
+
const resolvedSrc = resolve(src);
|
|
149
|
+
if (resolvedTarget !== resolvedSrc) {
|
|
150
|
+
return {
|
|
151
|
+
type,
|
|
152
|
+
repoName,
|
|
153
|
+
src,
|
|
154
|
+
dest,
|
|
155
|
+
status: 'broken',
|
|
156
|
+
message: `Symlink points to wrong target: ${linkTarget}`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return {
|
|
162
|
+
type,
|
|
163
|
+
repoName,
|
|
164
|
+
src,
|
|
165
|
+
dest,
|
|
166
|
+
status: 'broken',
|
|
167
|
+
message: 'Cannot read symlink target',
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
type,
|
|
173
|
+
repoName,
|
|
174
|
+
src,
|
|
175
|
+
dest,
|
|
176
|
+
status: 'valid',
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Process all copyfile and linkfile entries for a repository
|
|
181
|
+
*/
|
|
182
|
+
export async function processRepoLinks(repoName, repoConfig, repoPath, rootDir, options = {}) {
|
|
183
|
+
const result = {
|
|
184
|
+
repoName,
|
|
185
|
+
copyfiles: [],
|
|
186
|
+
linkfiles: [],
|
|
187
|
+
};
|
|
188
|
+
// Process copyfiles
|
|
189
|
+
if (repoConfig.copyfile) {
|
|
190
|
+
for (const config of repoConfig.copyfile) {
|
|
191
|
+
const src = resolve(repoPath, config.src);
|
|
192
|
+
const dest = resolve(rootDir, config.dest);
|
|
193
|
+
// Validate paths
|
|
194
|
+
if (!validatePath(repoPath, config.src)) {
|
|
195
|
+
result.copyfiles.push({
|
|
196
|
+
src,
|
|
197
|
+
dest,
|
|
198
|
+
success: false,
|
|
199
|
+
message: 'Source path escapes repository boundary',
|
|
200
|
+
});
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (!validatePath(rootDir, config.dest)) {
|
|
204
|
+
result.copyfiles.push({
|
|
205
|
+
src,
|
|
206
|
+
dest,
|
|
207
|
+
success: false,
|
|
208
|
+
message: 'Destination path escapes workspace boundary',
|
|
209
|
+
});
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
const copyResult = await copyFile(src, dest, {
|
|
213
|
+
force: options.force,
|
|
214
|
+
dryRun: options.dryRun,
|
|
215
|
+
});
|
|
216
|
+
result.copyfiles.push({
|
|
217
|
+
src,
|
|
218
|
+
dest,
|
|
219
|
+
success: copyResult.copied,
|
|
220
|
+
message: copyResult.message,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Process linkfiles
|
|
225
|
+
if (repoConfig.linkfile) {
|
|
226
|
+
for (const config of repoConfig.linkfile) {
|
|
227
|
+
const src = resolve(repoPath, config.src);
|
|
228
|
+
const dest = resolve(rootDir, config.dest);
|
|
229
|
+
// Validate paths
|
|
230
|
+
if (!validatePath(repoPath, config.src)) {
|
|
231
|
+
result.linkfiles.push({
|
|
232
|
+
src,
|
|
233
|
+
dest,
|
|
234
|
+
success: false,
|
|
235
|
+
message: 'Source path escapes repository boundary',
|
|
236
|
+
});
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
if (!validatePath(rootDir, config.dest)) {
|
|
240
|
+
result.linkfiles.push({
|
|
241
|
+
src,
|
|
242
|
+
dest,
|
|
243
|
+
success: false,
|
|
244
|
+
message: 'Destination path escapes workspace boundary',
|
|
245
|
+
});
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
const linkResult = await createSymlink(src, dest, {
|
|
249
|
+
force: options.force,
|
|
250
|
+
dryRun: options.dryRun,
|
|
251
|
+
});
|
|
252
|
+
result.linkfiles.push({
|
|
253
|
+
src,
|
|
254
|
+
dest,
|
|
255
|
+
success: linkResult.created,
|
|
256
|
+
message: linkResult.message,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return result;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Process links for manifest-level copyfile/linkfile entries
|
|
264
|
+
*/
|
|
265
|
+
export async function processManifestLinks(manifest, manifestsDir, rootDir, options = {}) {
|
|
266
|
+
const result = {
|
|
267
|
+
repoName: 'manifest',
|
|
268
|
+
copyfiles: [],
|
|
269
|
+
linkfiles: [],
|
|
270
|
+
};
|
|
271
|
+
if (!manifest.manifest) {
|
|
272
|
+
return result;
|
|
273
|
+
}
|
|
274
|
+
// Process manifest copyfiles
|
|
275
|
+
if (manifest.manifest.copyfile) {
|
|
276
|
+
for (const config of manifest.manifest.copyfile) {
|
|
277
|
+
const src = resolve(manifestsDir, config.src);
|
|
278
|
+
const dest = resolve(rootDir, config.dest);
|
|
279
|
+
// Validate paths
|
|
280
|
+
if (!validatePath(manifestsDir, config.src)) {
|
|
281
|
+
result.copyfiles.push({
|
|
282
|
+
src,
|
|
283
|
+
dest,
|
|
284
|
+
success: false,
|
|
285
|
+
message: 'Source path escapes manifest boundary',
|
|
286
|
+
});
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
if (!validatePath(rootDir, config.dest)) {
|
|
290
|
+
result.copyfiles.push({
|
|
291
|
+
src,
|
|
292
|
+
dest,
|
|
293
|
+
success: false,
|
|
294
|
+
message: 'Destination path escapes workspace boundary',
|
|
295
|
+
});
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
const copyResult = await copyFile(src, dest, {
|
|
299
|
+
force: options.force,
|
|
300
|
+
dryRun: options.dryRun,
|
|
301
|
+
});
|
|
302
|
+
result.copyfiles.push({
|
|
303
|
+
src,
|
|
304
|
+
dest,
|
|
305
|
+
success: copyResult.copied,
|
|
306
|
+
message: copyResult.message,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// Process manifest linkfiles
|
|
311
|
+
if (manifest.manifest.linkfile) {
|
|
312
|
+
for (const config of manifest.manifest.linkfile) {
|
|
313
|
+
const src = resolve(manifestsDir, config.src);
|
|
314
|
+
const dest = resolve(rootDir, config.dest);
|
|
315
|
+
// Validate paths
|
|
316
|
+
if (!validatePath(manifestsDir, config.src)) {
|
|
317
|
+
result.linkfiles.push({
|
|
318
|
+
src,
|
|
319
|
+
dest,
|
|
320
|
+
success: false,
|
|
321
|
+
message: 'Source path escapes manifest boundary',
|
|
322
|
+
});
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (!validatePath(rootDir, config.dest)) {
|
|
326
|
+
result.linkfiles.push({
|
|
327
|
+
src,
|
|
328
|
+
dest,
|
|
329
|
+
success: false,
|
|
330
|
+
message: 'Destination path escapes workspace boundary',
|
|
331
|
+
});
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
const linkResult = await createSymlink(src, dest, {
|
|
335
|
+
force: options.force,
|
|
336
|
+
dryRun: options.dryRun,
|
|
337
|
+
});
|
|
338
|
+
result.linkfiles.push({
|
|
339
|
+
src,
|
|
340
|
+
dest,
|
|
341
|
+
success: linkResult.created,
|
|
342
|
+
message: linkResult.message,
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return result;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Process all links for all repositories and manifest
|
|
350
|
+
*/
|
|
351
|
+
export async function processAllLinks(manifest, rootDir, options = {}, manifestsDir) {
|
|
352
|
+
const results = [];
|
|
353
|
+
// Process manifest-level links first
|
|
354
|
+
if (manifestsDir) {
|
|
355
|
+
const manifestResult = await processManifestLinks(manifest, manifestsDir, rootDir, options);
|
|
356
|
+
if (manifestResult.copyfiles.length > 0 || manifestResult.linkfiles.length > 0) {
|
|
357
|
+
results.push(manifestResult);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
// Process repo-level links
|
|
361
|
+
for (const [repoName, repoConfig] of Object.entries(manifest.repos)) {
|
|
362
|
+
const repoPath = resolve(rootDir, repoConfig.path);
|
|
363
|
+
const result = await processRepoLinks(repoName, repoConfig, repoPath, rootDir, options);
|
|
364
|
+
results.push(result);
|
|
365
|
+
}
|
|
366
|
+
return results;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Get status of all links (including manifest-level links)
|
|
370
|
+
*/
|
|
371
|
+
export async function getAllLinkStatus(manifest, rootDir, manifestsDir) {
|
|
372
|
+
const statuses = [];
|
|
373
|
+
// Get manifest-level link statuses
|
|
374
|
+
if (manifestsDir && manifest.manifest) {
|
|
375
|
+
if (manifest.manifest.copyfile) {
|
|
376
|
+
for (const config of manifest.manifest.copyfile) {
|
|
377
|
+
const src = resolve(manifestsDir, config.src);
|
|
378
|
+
const dest = resolve(rootDir, config.dest);
|
|
379
|
+
const status = await getLinkStatus('copyfile', 'manifest', src, dest);
|
|
380
|
+
statuses.push(status);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
if (manifest.manifest.linkfile) {
|
|
384
|
+
for (const config of manifest.manifest.linkfile) {
|
|
385
|
+
const src = resolve(manifestsDir, config.src);
|
|
386
|
+
const dest = resolve(rootDir, config.dest);
|
|
387
|
+
const status = await getLinkStatus('linkfile', 'manifest', src, dest);
|
|
388
|
+
statuses.push(status);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// Get repo-level link statuses
|
|
393
|
+
for (const [repoName, repoConfig] of Object.entries(manifest.repos)) {
|
|
394
|
+
const repoPath = resolve(rootDir, repoConfig.path);
|
|
395
|
+
if (repoConfig.copyfile) {
|
|
396
|
+
for (const config of repoConfig.copyfile) {
|
|
397
|
+
const src = resolve(repoPath, config.src);
|
|
398
|
+
const dest = resolve(rootDir, config.dest);
|
|
399
|
+
const status = await getLinkStatus('copyfile', repoName, src, dest);
|
|
400
|
+
statuses.push(status);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
if (repoConfig.linkfile) {
|
|
404
|
+
for (const config of repoConfig.linkfile) {
|
|
405
|
+
const src = resolve(repoPath, config.src);
|
|
406
|
+
const dest = resolve(rootDir, config.dest);
|
|
407
|
+
const status = await getLinkStatus('linkfile', repoName, src, dest);
|
|
408
|
+
statuses.push(status);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
return statuses;
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Find and remove orphaned links (links that exist but are no longer in manifest)
|
|
416
|
+
*/
|
|
417
|
+
export async function cleanOrphanedLinks(manifest, rootDir, options = {}) {
|
|
418
|
+
const results = [];
|
|
419
|
+
// Get all currently defined destinations
|
|
420
|
+
const definedDests = new Set();
|
|
421
|
+
// Add manifest-level destinations
|
|
422
|
+
if (manifest.manifest) {
|
|
423
|
+
if (manifest.manifest.copyfile) {
|
|
424
|
+
for (const config of manifest.manifest.copyfile) {
|
|
425
|
+
definedDests.add(resolve(rootDir, config.dest));
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
if (manifest.manifest.linkfile) {
|
|
429
|
+
for (const config of manifest.manifest.linkfile) {
|
|
430
|
+
definedDests.add(resolve(rootDir, config.dest));
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
// Add repo-level destinations
|
|
435
|
+
for (const repoConfig of Object.values(manifest.repos)) {
|
|
436
|
+
if (repoConfig.copyfile) {
|
|
437
|
+
for (const config of repoConfig.copyfile) {
|
|
438
|
+
definedDests.add(resolve(rootDir, config.dest));
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
if (repoConfig.linkfile) {
|
|
442
|
+
for (const config of repoConfig.linkfile) {
|
|
443
|
+
definedDests.add(resolve(rootDir, config.dest));
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
// Check common link locations for orphans
|
|
448
|
+
// This is a simplified implementation - in a full impl you'd track links in state
|
|
449
|
+
const linkDirs = [
|
|
450
|
+
join(rootDir, '.bin'),
|
|
451
|
+
];
|
|
452
|
+
for (const linkDir of linkDirs) {
|
|
453
|
+
if (!(await pathExists(linkDir)))
|
|
454
|
+
continue;
|
|
455
|
+
const { readdir } = await import('fs/promises');
|
|
456
|
+
try {
|
|
457
|
+
const entries = await readdir(linkDir, { withFileTypes: true });
|
|
458
|
+
for (const entry of entries) {
|
|
459
|
+
const fullPath = join(linkDir, entry.name);
|
|
460
|
+
if (await isSymlink(fullPath)) {
|
|
461
|
+
if (!definedDests.has(fullPath)) {
|
|
462
|
+
if (options.dryRun) {
|
|
463
|
+
results.push({
|
|
464
|
+
path: fullPath,
|
|
465
|
+
removed: false,
|
|
466
|
+
message: `Would remove orphaned link: ${fullPath}`,
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
try {
|
|
471
|
+
await unlink(fullPath);
|
|
472
|
+
results.push({ path: fullPath, removed: true });
|
|
473
|
+
}
|
|
474
|
+
catch (error) {
|
|
475
|
+
results.push({
|
|
476
|
+
path: fullPath,
|
|
477
|
+
removed: false,
|
|
478
|
+
message: `Failed to remove: ${error instanceof Error ? error.message : String(error)}`,
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
// Directory may not be readable
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
return results;
|
|
491
|
+
}
|
|
492
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/lib/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { SimpleGit } from 'simple-git';
|
|
2
|
+
import type { RepoInfo, RepoStatus, MultiRepoResult } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Get a SimpleGit instance for a repository
|
|
5
|
+
*/
|
|
6
|
+
export declare function getGitInstance(repoPath: string): SimpleGit;
|
|
7
|
+
/**
|
|
8
|
+
* Check if a directory is a git repository
|
|
9
|
+
*/
|
|
10
|
+
export declare function isGitRepo(path: string): Promise<boolean>;
|
|
11
|
+
/**
|
|
12
|
+
* Check if a path exists
|
|
13
|
+
*/
|
|
14
|
+
export declare function pathExists(path: string): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* Clone a repository
|
|
17
|
+
*/
|
|
18
|
+
export declare function cloneRepo(url: string, path: string, branch?: string): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Get the current branch name
|
|
21
|
+
*/
|
|
22
|
+
export declare function getCurrentBranch(repoPath: string): Promise<string>;
|
|
23
|
+
/**
|
|
24
|
+
* Get repository status
|
|
25
|
+
*/
|
|
26
|
+
export declare function getRepoStatus(repo: RepoInfo): Promise<RepoStatus>;
|
|
27
|
+
/**
|
|
28
|
+
* Get status for all repositories
|
|
29
|
+
*/
|
|
30
|
+
export declare function getAllRepoStatus(repos: RepoInfo[]): Promise<RepoStatus[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Create a branch in a repository
|
|
33
|
+
*/
|
|
34
|
+
export declare function createBranch(repoPath: string, branchName: string): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Checkout a branch in a repository
|
|
37
|
+
*/
|
|
38
|
+
export declare function checkoutBranch(repoPath: string, branchName: string): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Check if a branch exists locally
|
|
41
|
+
*/
|
|
42
|
+
export declare function branchExists(repoPath: string, branchName: string): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Check if a branch exists on remote
|
|
45
|
+
*/
|
|
46
|
+
export declare function remoteBranchExists(repoPath: string, branchName: string, remote?: string): Promise<boolean>;
|
|
47
|
+
/**
|
|
48
|
+
* Pull latest changes from remote
|
|
49
|
+
*/
|
|
50
|
+
export declare function pullLatest(repoPath: string, remote?: string): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Fetch from remote
|
|
53
|
+
*/
|
|
54
|
+
export declare function fetchRemote(repoPath: string, remote?: string): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Push branch to remote
|
|
57
|
+
*/
|
|
58
|
+
export declare function pushBranch(repoPath: string, branchName: string, remote?: string, setUpstream?: boolean): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Get list of changed files (staged and unstaged)
|
|
61
|
+
*/
|
|
62
|
+
export declare function getChangedFiles(repoPath: string): Promise<string[]>;
|
|
63
|
+
/**
|
|
64
|
+
* Check if there are uncommitted changes
|
|
65
|
+
*/
|
|
66
|
+
export declare function hasUncommittedChanges(repoPath: string): Promise<boolean>;
|
|
67
|
+
/**
|
|
68
|
+
* Get commits between current branch and base branch
|
|
69
|
+
*/
|
|
70
|
+
export declare function getCommitsBetween(repoPath: string, baseBranch: string, headBranch?: string): Promise<string[]>;
|
|
71
|
+
/**
|
|
72
|
+
* Check if branch has commits not in base
|
|
73
|
+
*/
|
|
74
|
+
export declare function hasCommitsAhead(repoPath: string, baseBranch: string): Promise<boolean>;
|
|
75
|
+
/**
|
|
76
|
+
* Run an operation across multiple repos
|
|
77
|
+
*/
|
|
78
|
+
export declare function runOnAllRepos<T>(repos: RepoInfo[], operation: (repo: RepoInfo) => Promise<T>): Promise<MultiRepoResult<T>[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Create branch in all repos
|
|
81
|
+
*/
|
|
82
|
+
export declare function createBranchInAllRepos(repos: RepoInfo[], branchName: string): Promise<MultiRepoResult<void>[]>;
|
|
83
|
+
/**
|
|
84
|
+
* Checkout branch in all repos
|
|
85
|
+
*/
|
|
86
|
+
export declare function checkoutBranchInAllRepos(repos: RepoInfo[], branchName: string): Promise<MultiRepoResult<void>[]>;
|
|
87
|
+
/**
|
|
88
|
+
* Pull latest in all repos
|
|
89
|
+
*/
|
|
90
|
+
export declare function pullAllRepos(repos: RepoInfo[]): Promise<MultiRepoResult<void>[]>;
|
|
91
|
+
/**
|
|
92
|
+
* Push branch in all repos that have it
|
|
93
|
+
*/
|
|
94
|
+
export declare function pushAllRepos(repos: RepoInfo[], branchName: string, setUpstream?: boolean): Promise<MultiRepoResult<void>[]>;
|
|
95
|
+
/**
|
|
96
|
+
* Get the URL of a remote
|
|
97
|
+
*/
|
|
98
|
+
export declare function getRemoteUrl(repoPath: string, remote?: string): Promise<string | null>;
|
|
99
|
+
/**
|
|
100
|
+
* Set the URL of a remote (creates it if it doesn't exist)
|
|
101
|
+
*/
|
|
102
|
+
export declare function setRemoteUrl(repoPath: string, url: string, remote?: string): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Set upstream tracking for the current branch
|
|
105
|
+
*/
|
|
106
|
+
export declare function setUpstreamBranch(repoPath: string, remote?: string): Promise<void>;
|
|
107
|
+
/**
|
|
108
|
+
* Get the upstream tracking branch for a local branch
|
|
109
|
+
* Returns null if no upstream is configured
|
|
110
|
+
*/
|
|
111
|
+
export declare function getUpstreamBranch(repoPath: string, branch?: string): Promise<string | null>;
|
|
112
|
+
/**
|
|
113
|
+
* Check if the upstream branch for current branch still exists on remote
|
|
114
|
+
*/
|
|
115
|
+
export declare function upstreamBranchExists(repoPath: string, remote?: string): Promise<boolean>;
|
|
116
|
+
/**
|
|
117
|
+
* Safely pull latest, handling the case where upstream branch was deleted
|
|
118
|
+
* Returns true if pull succeeded, false if had to recover (checkout default branch)
|
|
119
|
+
*/
|
|
120
|
+
export declare function safePullLatest(repoPath: string, defaultBranch?: string, remote?: string): Promise<{
|
|
121
|
+
pulled: boolean;
|
|
122
|
+
recovered: boolean;
|
|
123
|
+
message?: string;
|
|
124
|
+
}>;
|
|
125
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/lib/git.ts"],"names":[],"mappings":"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"}
|