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,105 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { loadManifest, getAllRepoInfo, getManifestRepoInfo } from '../lib/manifest.js';
|
|
3
|
+
import { pathExists, getGitInstance, isGitRepo } from '../lib/git.js';
|
|
4
|
+
/**
|
|
5
|
+
* Get diff output for a repo
|
|
6
|
+
*/
|
|
7
|
+
async function getRepoDiff(repoPath, options) {
|
|
8
|
+
const git = getGitInstance(repoPath);
|
|
9
|
+
const args = [];
|
|
10
|
+
if (options.staged) {
|
|
11
|
+
args.push('--staged');
|
|
12
|
+
}
|
|
13
|
+
if (options.stat) {
|
|
14
|
+
args.push('--stat');
|
|
15
|
+
}
|
|
16
|
+
if (options.nameOnly) {
|
|
17
|
+
args.push('--name-only');
|
|
18
|
+
}
|
|
19
|
+
const result = await git.diff(args);
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Check if repo has any changes (staged or unstaged)
|
|
24
|
+
*/
|
|
25
|
+
async function hasChanges(repoPath, staged) {
|
|
26
|
+
const git = getGitInstance(repoPath);
|
|
27
|
+
const status = await git.status();
|
|
28
|
+
if (staged) {
|
|
29
|
+
return status.staged.length > 0;
|
|
30
|
+
}
|
|
31
|
+
return status.modified.length > 0 || status.not_added.length > 0 || status.deleted.length > 0;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Show diff across all repositories
|
|
35
|
+
*/
|
|
36
|
+
export async function diff(options = {}) {
|
|
37
|
+
const { manifest, rootDir } = await loadManifest();
|
|
38
|
+
let repos = getAllRepoInfo(manifest, rootDir);
|
|
39
|
+
// Include manifest repo if it exists
|
|
40
|
+
const manifestInfo = getManifestRepoInfo(manifest, rootDir);
|
|
41
|
+
if (manifestInfo && await isGitRepo(manifestInfo.absolutePath)) {
|
|
42
|
+
repos = [...repos, manifestInfo];
|
|
43
|
+
}
|
|
44
|
+
let hasAnyChanges = false;
|
|
45
|
+
const outputs = [];
|
|
46
|
+
for (const repo of repos) {
|
|
47
|
+
const exists = await pathExists(repo.absolutePath);
|
|
48
|
+
if (!exists) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// Check if there are changes to show
|
|
52
|
+
const repoHasChanges = await hasChanges(repo.absolutePath, options.staged ?? false);
|
|
53
|
+
if (!repoHasChanges) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
hasAnyChanges = true;
|
|
57
|
+
try {
|
|
58
|
+
const diffOutput = await getRepoDiff(repo.absolutePath, options);
|
|
59
|
+
if (diffOutput.trim()) {
|
|
60
|
+
outputs.push({ repo, diff: diffOutput });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.error(chalk.red(`${repo.name}: ${error instanceof Error ? error.message : String(error)}`));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (!hasAnyChanges) {
|
|
68
|
+
const changeType = options.staged ? 'staged changes' : 'changes';
|
|
69
|
+
console.log(chalk.yellow(`No ${changeType} in any repository.`));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Output diffs with repo headers
|
|
73
|
+
for (let i = 0; i < outputs.length; i++) {
|
|
74
|
+
const { repo, diff: diffOutput } = outputs[i];
|
|
75
|
+
// Print header
|
|
76
|
+
console.log(chalk.blue.bold(`\n${'═'.repeat(60)}`));
|
|
77
|
+
console.log(chalk.blue.bold(` ${repo.name}`));
|
|
78
|
+
console.log(chalk.blue.bold(`${'═'.repeat(60)}\n`));
|
|
79
|
+
// Print diff
|
|
80
|
+
// Color the diff output
|
|
81
|
+
const lines = diffOutput.split('\n');
|
|
82
|
+
for (const line of lines) {
|
|
83
|
+
if (line.startsWith('+') && !line.startsWith('+++')) {
|
|
84
|
+
console.log(chalk.green(line));
|
|
85
|
+
}
|
|
86
|
+
else if (line.startsWith('-') && !line.startsWith('---')) {
|
|
87
|
+
console.log(chalk.red(line));
|
|
88
|
+
}
|
|
89
|
+
else if (line.startsWith('@@')) {
|
|
90
|
+
console.log(chalk.cyan(line));
|
|
91
|
+
}
|
|
92
|
+
else if (line.startsWith('diff --git') || line.startsWith('index ') || line.startsWith('---') || line.startsWith('+++')) {
|
|
93
|
+
console.log(chalk.dim(line));
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.log(line);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Add spacing between repos
|
|
100
|
+
if (i < outputs.length - 1) {
|
|
101
|
+
console.log('');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCjE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { loadManifest } from '../lib/manifest.js';
|
|
3
|
+
/**
|
|
4
|
+
* Show workspace environment variables
|
|
5
|
+
*/
|
|
6
|
+
export async function env(options = {}) {
|
|
7
|
+
const { manifest } = await loadManifest();
|
|
8
|
+
const workspaceEnv = manifest.workspace?.env ?? {};
|
|
9
|
+
if (options.json) {
|
|
10
|
+
console.log(JSON.stringify(workspaceEnv, null, 2));
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const entries = Object.entries(workspaceEnv);
|
|
14
|
+
if (entries.length === 0) {
|
|
15
|
+
console.log(chalk.dim('No workspace environment variables defined.'));
|
|
16
|
+
console.log(chalk.dim('\nAdd env vars to your manifest.yaml:'));
|
|
17
|
+
console.log(chalk.dim(`
|
|
18
|
+
workspace:
|
|
19
|
+
env:
|
|
20
|
+
NODE_ENV: development
|
|
21
|
+
DEBUG: "true"
|
|
22
|
+
`));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
console.log(chalk.blue('Workspace Environment Variables\n'));
|
|
26
|
+
// Find longest key for alignment
|
|
27
|
+
const maxKeyLength = Math.max(...entries.map(([key]) => key.length));
|
|
28
|
+
for (const [key, value] of entries) {
|
|
29
|
+
const paddedKey = key.padEnd(maxKeyLength);
|
|
30
|
+
console.log(` ${chalk.cyan(paddedKey)} ${value}`);
|
|
31
|
+
}
|
|
32
|
+
console.log('');
|
|
33
|
+
console.log(chalk.dim(`These variables are passed to scripts run with 'cr run <script>'`));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,UAAsB,EAAE;IAChD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;IAC1C,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,EAAE,GAAG,IAAI,EAAE,CAAC;IAEnD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;;;;;CAKzB,CAAC,CAAC,CAAC;QACA,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAE7D,iCAAiC;IACjC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAErE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC,CAAC;AAC7F,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface ForallOptions {
|
|
2
|
+
command: string;
|
|
3
|
+
repo?: string[];
|
|
4
|
+
includeManifest?: boolean;
|
|
5
|
+
continueOnError?: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Run a command in each repository directory
|
|
9
|
+
* Similar to AOSP's `repo forall -c "command"`
|
|
10
|
+
*/
|
|
11
|
+
export declare function forall(options: ForallOptions): Promise<void>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=forall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forall.d.ts","sourceRoot":"","sources":["../../src/commands/forall.ts"],"names":[],"mappings":"AAUA,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAUD;;;GAGG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2HlE"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { exec } from 'child_process';
|
|
4
|
+
import { promisify } from 'util';
|
|
5
|
+
import { loadManifest, getAllRepoInfo, getManifestRepoInfo } from '../lib/manifest.js';
|
|
6
|
+
import { pathExists, isGitRepo } from '../lib/git.js';
|
|
7
|
+
const execAsync = promisify(exec);
|
|
8
|
+
/**
|
|
9
|
+
* Run a command in each repository directory
|
|
10
|
+
* Similar to AOSP's `repo forall -c "command"`
|
|
11
|
+
*/
|
|
12
|
+
export async function forall(options) {
|
|
13
|
+
const { command, continueOnError = false } = options;
|
|
14
|
+
if (!command || command.trim().length === 0) {
|
|
15
|
+
console.log(chalk.red('Error: Command is required. Use -c "command" to specify.'));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const { manifest, rootDir } = await loadManifest();
|
|
19
|
+
let repos = getAllRepoInfo(manifest, rootDir);
|
|
20
|
+
// Filter by --repo flag if specified
|
|
21
|
+
if (options.repo && options.repo.length > 0) {
|
|
22
|
+
const requestedRepos = new Set(options.repo);
|
|
23
|
+
const filteredRepos = repos.filter((r) => requestedRepos.has(r.name));
|
|
24
|
+
// Check for unknown repo names
|
|
25
|
+
const knownNames = new Set(repos.map((r) => r.name));
|
|
26
|
+
const unknownRepos = options.repo.filter((name) => !knownNames.has(name));
|
|
27
|
+
if (unknownRepos.length > 0) {
|
|
28
|
+
console.log(chalk.yellow(`Unknown repositories: ${unknownRepos.join(', ')}`));
|
|
29
|
+
console.log(chalk.dim(`Available: ${repos.map((r) => r.name).join(', ')}\n`));
|
|
30
|
+
}
|
|
31
|
+
repos = filteredRepos;
|
|
32
|
+
}
|
|
33
|
+
// Include manifest if flag is set
|
|
34
|
+
if (options.includeManifest) {
|
|
35
|
+
const manifestInfo = getManifestRepoInfo(manifest, rootDir);
|
|
36
|
+
if (manifestInfo && (await isGitRepo(manifestInfo.absolutePath))) {
|
|
37
|
+
repos = [...repos, manifestInfo];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (repos.length === 0) {
|
|
41
|
+
console.log(chalk.red('No repositories to run command in.'));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Filter to existing repos only
|
|
45
|
+
const existingRepos = [];
|
|
46
|
+
for (const repo of repos) {
|
|
47
|
+
if (await pathExists(repo.absolutePath)) {
|
|
48
|
+
existingRepos.push(repo);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (existingRepos.length === 0) {
|
|
52
|
+
console.log(chalk.red('No cloned repositories found.'));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
console.log(chalk.blue(`Running command in ${existingRepos.length} repo(s): ${chalk.dim(command)}\n`));
|
|
56
|
+
const results = [];
|
|
57
|
+
let hasFailure = false;
|
|
58
|
+
for (const repo of existingRepos) {
|
|
59
|
+
const spinner = ora(`${repo.name}...`).start();
|
|
60
|
+
try {
|
|
61
|
+
const { stdout, stderr } = await execAsync(command, {
|
|
62
|
+
cwd: repo.absolutePath,
|
|
63
|
+
env: {
|
|
64
|
+
...process.env,
|
|
65
|
+
REPO_NAME: repo.name,
|
|
66
|
+
REPO_PATH: repo.absolutePath,
|
|
67
|
+
REPO_URL: repo.url,
|
|
68
|
+
},
|
|
69
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB buffer
|
|
70
|
+
});
|
|
71
|
+
spinner.succeed(`${repo.name}`);
|
|
72
|
+
// Print output if there is any
|
|
73
|
+
if (stdout.trim()) {
|
|
74
|
+
console.log(chalk.dim(stdout.trim().split('\n').map(line => ` ${line}`).join('\n')));
|
|
75
|
+
}
|
|
76
|
+
if (stderr.trim()) {
|
|
77
|
+
console.log(chalk.yellow(stderr.trim().split('\n').map(line => ` ${line}`).join('\n')));
|
|
78
|
+
}
|
|
79
|
+
results.push({ repo, success: true, stdout, stderr });
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
hasFailure = true;
|
|
83
|
+
const err = error;
|
|
84
|
+
const errorMsg = err.stderr || err.message || String(error);
|
|
85
|
+
spinner.fail(`${repo.name}`);
|
|
86
|
+
// Print error output
|
|
87
|
+
if (err.stdout?.trim()) {
|
|
88
|
+
console.log(chalk.dim(err.stdout.trim().split('\n').map(line => ` ${line}`).join('\n')));
|
|
89
|
+
}
|
|
90
|
+
if (errorMsg.trim()) {
|
|
91
|
+
console.log(chalk.red(errorMsg.trim().split('\n').map(line => ` ${line}`).join('\n')));
|
|
92
|
+
}
|
|
93
|
+
results.push({ repo, success: false, stdout: err.stdout, stderr: err.stderr, error: errorMsg });
|
|
94
|
+
if (!continueOnError) {
|
|
95
|
+
console.log('');
|
|
96
|
+
console.log(chalk.red(`Stopping due to error. Use --continue-on-error to continue past failures.`));
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
console.log(''); // Blank line between repos
|
|
101
|
+
}
|
|
102
|
+
// Summary
|
|
103
|
+
const succeeded = results.filter((r) => r.success).length;
|
|
104
|
+
const failed = results.filter((r) => !r.success).length;
|
|
105
|
+
const skipped = existingRepos.length - results.length;
|
|
106
|
+
if (failed === 0 && skipped === 0) {
|
|
107
|
+
console.log(chalk.green(`Completed successfully in ${succeeded} repo(s).`));
|
|
108
|
+
}
|
|
109
|
+
else if (skipped > 0) {
|
|
110
|
+
console.log(chalk.yellow(`Completed in ${succeeded} repo(s). ${skipped} skipped due to earlier error.`));
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
console.log(chalk.yellow(`Completed in ${succeeded} repo(s). ${failed} failed.`));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=forall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forall.js","sourceRoot":"","sources":["../../src/commands/forall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface InitOptions {
|
|
2
|
+
/** Branch to clone from manifest repository */
|
|
3
|
+
branch?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Initialize a new gitgrip workspace (AOSP-style)
|
|
7
|
+
*
|
|
8
|
+
* This command:
|
|
9
|
+
* 1. Creates .gitgrip/ directory
|
|
10
|
+
* 2. Clones the manifest repository into .gitgrip/manifests/
|
|
11
|
+
* 3. Reads manifest.yaml from the cloned repo
|
|
12
|
+
* 4. Clones all repositories defined in the manifest
|
|
13
|
+
*/
|
|
14
|
+
export declare function init(manifestUrl: string, options?: InitOptions): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAsB,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+FxF"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { mkdir } from 'fs/promises';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { loadManifest, getAllRepoInfo, getNewGitgripDir, getManifestsDir, findLegacyManifestPath, getGitgripDir, } from '../lib/manifest.js';
|
|
5
|
+
import { cloneRepo, pathExists } from '../lib/git.js';
|
|
6
|
+
import { getTimingContext } from '../lib/timing.js';
|
|
7
|
+
/**
|
|
8
|
+
* Initialize a new gitgrip workspace (AOSP-style)
|
|
9
|
+
*
|
|
10
|
+
* This command:
|
|
11
|
+
* 1. Creates .gitgrip/ directory
|
|
12
|
+
* 2. Clones the manifest repository into .gitgrip/manifests/
|
|
13
|
+
* 3. Reads manifest.yaml from the cloned repo
|
|
14
|
+
* 4. Clones all repositories defined in the manifest
|
|
15
|
+
*/
|
|
16
|
+
export async function init(manifestUrl, options = {}) {
|
|
17
|
+
const timing = getTimingContext();
|
|
18
|
+
const cwd = process.cwd();
|
|
19
|
+
const gitgripDir = getNewGitgripDir(cwd);
|
|
20
|
+
const existingDir = getGitgripDir(cwd);
|
|
21
|
+
const manifestsDir = getManifestsDir(cwd);
|
|
22
|
+
// Check if already initialized (either .gitgrip or .codi-repo)
|
|
23
|
+
if (await pathExists(existingDir)) {
|
|
24
|
+
console.log(chalk.yellow('Workspace already initialized.'));
|
|
25
|
+
console.log(chalk.dim('Run `gr sync` to update, or delete .gitgrip/ to reinitialize.'));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// Check for legacy format
|
|
29
|
+
const legacyManifest = await findLegacyManifestPath(cwd);
|
|
30
|
+
if (legacyManifest) {
|
|
31
|
+
console.log(chalk.yellow('Found legacy codi-repos.yaml format.'));
|
|
32
|
+
console.log(chalk.dim('Run `gr migrate` to convert to the new .gitgrip/ structure.'));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// Create .gitgrip/ directory
|
|
36
|
+
timing?.startPhase('create dirs');
|
|
37
|
+
const spinner = ora('Creating workspace...').start();
|
|
38
|
+
try {
|
|
39
|
+
await mkdir(gitgripDir, { recursive: true });
|
|
40
|
+
spinner.succeed('Created .gitgrip/');
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
spinner.fail('Failed to create .gitgrip/');
|
|
44
|
+
timing?.endPhase('create dirs');
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
timing?.endPhase('create dirs');
|
|
48
|
+
// Clone manifest repository into .gitgrip/manifests/
|
|
49
|
+
timing?.startPhase('clone manifest');
|
|
50
|
+
const branchInfo = options.branch ? ` (branch: ${options.branch})` : '';
|
|
51
|
+
const cloneSpinner = ora(`Cloning manifest from ${manifestUrl}${branchInfo}...`).start();
|
|
52
|
+
try {
|
|
53
|
+
await cloneRepo(manifestUrl, manifestsDir, options.branch);
|
|
54
|
+
cloneSpinner.succeed('Cloned manifest repository');
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
cloneSpinner.fail('Failed to clone manifest repository');
|
|
58
|
+
timing?.endPhase('clone manifest');
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
timing?.endPhase('clone manifest');
|
|
62
|
+
// Load the manifest
|
|
63
|
+
timing?.startPhase('load manifest');
|
|
64
|
+
let manifest;
|
|
65
|
+
let rootDir;
|
|
66
|
+
try {
|
|
67
|
+
const result = await loadManifest();
|
|
68
|
+
manifest = result.manifest;
|
|
69
|
+
rootDir = result.rootDir;
|
|
70
|
+
console.log(chalk.green(`Loaded manifest with ${Object.keys(manifest.repos).length} repositories`));
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error(chalk.red('Failed to load manifest.yaml from cloned repository.'));
|
|
74
|
+
console.error(chalk.dim('Ensure the manifest repository contains a manifest.yaml file.'));
|
|
75
|
+
timing?.endPhase('load manifest');
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
timing?.endPhase('load manifest');
|
|
79
|
+
// Clone all repositories defined in manifest
|
|
80
|
+
timing?.startPhase('clone repos');
|
|
81
|
+
const repos = getAllRepoInfo(manifest, rootDir);
|
|
82
|
+
console.log(chalk.blue(`\nCloning ${repos.length} repositories...\n`));
|
|
83
|
+
for (const repo of repos) {
|
|
84
|
+
const exists = await pathExists(repo.absolutePath);
|
|
85
|
+
if (exists) {
|
|
86
|
+
console.log(chalk.dim(` ${repo.name}: already exists at ${repo.path}`));
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
timing?.startPhase(repo.name);
|
|
90
|
+
const repoSpinner = ora(`Cloning ${repo.name}...`).start();
|
|
91
|
+
try {
|
|
92
|
+
await cloneRepo(repo.url, repo.absolutePath, repo.default_branch);
|
|
93
|
+
repoSpinner.succeed(`Cloned ${repo.name} to ${repo.path}`);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
repoSpinner.fail(`Failed to clone ${repo.name}`);
|
|
97
|
+
console.error(chalk.red(` Error: ${error instanceof Error ? error.message : error}`));
|
|
98
|
+
}
|
|
99
|
+
timing?.endPhase(repo.name);
|
|
100
|
+
}
|
|
101
|
+
timing?.endPhase('clone repos');
|
|
102
|
+
console.log('');
|
|
103
|
+
console.log(chalk.green('Workspace initialized successfully!'));
|
|
104
|
+
console.log(chalk.dim('Run `gr status` to see the status of all repositories.'));
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface LinkOptions {
|
|
2
|
+
status?: boolean;
|
|
3
|
+
clean?: boolean;
|
|
4
|
+
force?: boolean;
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Main link command handler
|
|
9
|
+
*/
|
|
10
|
+
export declare function link(options?: LinkOptions): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAgND;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnE"}
|