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.
Files changed (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +211 -0
  3. package/actions/cross-repo-sync/action.yml +55 -0
  4. package/assets/banner.svg +73 -0
  5. package/assets/icon.svg +30 -0
  6. package/assets/logo-dark.svg +36 -0
  7. package/assets/logo.svg +36 -0
  8. package/dist/commands/add.d.ts +9 -0
  9. package/dist/commands/add.d.ts.map +1 -0
  10. package/dist/commands/add.js +80 -0
  11. package/dist/commands/add.js.map +1 -0
  12. package/dist/commands/bench.d.ts +12 -0
  13. package/dist/commands/bench.d.ts.map +1 -0
  14. package/dist/commands/bench.js +136 -0
  15. package/dist/commands/bench.js.map +1 -0
  16. package/dist/commands/branch.d.ts +15 -0
  17. package/dist/commands/branch.d.ts.map +1 -0
  18. package/dist/commands/branch.js +159 -0
  19. package/dist/commands/branch.js.map +1 -0
  20. package/dist/commands/checkout.d.ts +10 -0
  21. package/dist/commands/checkout.d.ts.map +1 -0
  22. package/dist/commands/checkout.js +85 -0
  23. package/dist/commands/checkout.js.map +1 -0
  24. package/dist/commands/commit.d.ts +10 -0
  25. package/dist/commands/commit.d.ts.map +1 -0
  26. package/dist/commands/commit.js +94 -0
  27. package/dist/commands/commit.js.map +1 -0
  28. package/dist/commands/diff.d.ts +11 -0
  29. package/dist/commands/diff.d.ts.map +1 -0
  30. package/dist/commands/diff.js +105 -0
  31. package/dist/commands/diff.js.map +1 -0
  32. package/dist/commands/env.d.ts +8 -0
  33. package/dist/commands/env.d.ts.map +1 -0
  34. package/dist/commands/env.js +35 -0
  35. package/dist/commands/env.js.map +1 -0
  36. package/dist/commands/forall.d.ts +13 -0
  37. package/dist/commands/forall.d.ts.map +1 -0
  38. package/dist/commands/forall.js +116 -0
  39. package/dist/commands/forall.js.map +1 -0
  40. package/dist/commands/init.d.ts +15 -0
  41. package/dist/commands/init.d.ts.map +1 -0
  42. package/dist/commands/init.js +106 -0
  43. package/dist/commands/init.js.map +1 -0
  44. package/dist/commands/link.d.ts +11 -0
  45. package/dist/commands/link.d.ts.map +1 -0
  46. package/dist/commands/link.js +205 -0
  47. package/dist/commands/link.js.map +1 -0
  48. package/dist/commands/migrate.d.ts +17 -0
  49. package/dist/commands/migrate.d.ts.map +1 -0
  50. package/dist/commands/migrate.js +180 -0
  51. package/dist/commands/migrate.js.map +1 -0
  52. package/dist/commands/pr/create.d.ts +13 -0
  53. package/dist/commands/pr/create.d.ts.map +1 -0
  54. package/dist/commands/pr/create.js +202 -0
  55. package/dist/commands/pr/create.js.map +1 -0
  56. package/dist/commands/pr/index.d.ts +4 -0
  57. package/dist/commands/pr/index.d.ts.map +1 -0
  58. package/dist/commands/pr/index.js +4 -0
  59. package/dist/commands/pr/index.js.map +1 -0
  60. package/dist/commands/pr/merge.d.ts +11 -0
  61. package/dist/commands/pr/merge.d.ts.map +1 -0
  62. package/dist/commands/pr/merge.js +168 -0
  63. package/dist/commands/pr/merge.js.map +1 -0
  64. package/dist/commands/pr/status.d.ts +9 -0
  65. package/dist/commands/pr/status.d.ts.map +1 -0
  66. package/dist/commands/pr/status.js +139 -0
  67. package/dist/commands/pr/status.js.map +1 -0
  68. package/dist/commands/push.d.ts +10 -0
  69. package/dist/commands/push.d.ts.map +1 -0
  70. package/dist/commands/push.js +101 -0
  71. package/dist/commands/push.js.map +1 -0
  72. package/dist/commands/run.d.ts +8 -0
  73. package/dist/commands/run.d.ts.map +1 -0
  74. package/dist/commands/run.js +75 -0
  75. package/dist/commands/run.js.map +1 -0
  76. package/dist/commands/status.d.ts +9 -0
  77. package/dist/commands/status.d.ts.map +1 -0
  78. package/dist/commands/status.js +201 -0
  79. package/dist/commands/status.js.map +1 -0
  80. package/dist/commands/sync.d.ts +13 -0
  81. package/dist/commands/sync.d.ts.map +1 -0
  82. package/dist/commands/sync.js +183 -0
  83. package/dist/commands/sync.js.map +1 -0
  84. package/dist/index.d.ts +3 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +352 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/lib/__bench__/files.bench.d.ts +2 -0
  89. package/dist/lib/__bench__/files.bench.d.ts.map +1 -0
  90. package/dist/lib/__bench__/files.bench.js +52 -0
  91. package/dist/lib/__bench__/files.bench.js.map +1 -0
  92. package/dist/lib/__bench__/manifest.bench.d.ts +2 -0
  93. package/dist/lib/__bench__/manifest.bench.d.ts.map +1 -0
  94. package/dist/lib/__bench__/manifest.bench.js +74 -0
  95. package/dist/lib/__bench__/manifest.bench.js.map +1 -0
  96. package/dist/lib/files.d.ts +84 -0
  97. package/dist/lib/files.d.ts.map +1 -0
  98. package/dist/lib/files.js +492 -0
  99. package/dist/lib/files.js.map +1 -0
  100. package/dist/lib/git.d.ts +125 -0
  101. package/dist/lib/git.d.ts.map +1 -0
  102. package/dist/lib/git.js +370 -0
  103. package/dist/lib/git.js.map +1 -0
  104. package/dist/lib/github.d.ts +92 -0
  105. package/dist/lib/github.d.ts.map +1 -0
  106. package/dist/lib/github.js +284 -0
  107. package/dist/lib/github.js.map +1 -0
  108. package/dist/lib/hooks.d.ts +19 -0
  109. package/dist/lib/hooks.d.ts.map +1 -0
  110. package/dist/lib/hooks.js +63 -0
  111. package/dist/lib/hooks.js.map +1 -0
  112. package/dist/lib/linker.d.ts +56 -0
  113. package/dist/lib/linker.d.ts.map +1 -0
  114. package/dist/lib/linker.js +185 -0
  115. package/dist/lib/linker.js.map +1 -0
  116. package/dist/lib/manifest.d.ts +73 -0
  117. package/dist/lib/manifest.d.ts.map +1 -0
  118. package/dist/lib/manifest.js +400 -0
  119. package/dist/lib/manifest.js.map +1 -0
  120. package/dist/lib/scripts.d.ts +26 -0
  121. package/dist/lib/scripts.d.ts.map +1 -0
  122. package/dist/lib/scripts.js +123 -0
  123. package/dist/lib/scripts.js.map +1 -0
  124. package/dist/lib/timing.d.ts +100 -0
  125. package/dist/lib/timing.d.ts.map +1 -0
  126. package/dist/lib/timing.js +293 -0
  127. package/dist/lib/timing.js.map +1 -0
  128. package/dist/types.d.ts +312 -0
  129. package/dist/types.d.ts.map +1 -0
  130. package/dist/types.js +2 -0
  131. package/dist/types.js.map +1 -0
  132. 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,8 @@
1
+ export interface EnvOptions {
2
+ json?: boolean;
3
+ }
4
+ /**
5
+ * Show workspace environment variables
6
+ */
7
+ export declare function env(options?: EnvOptions): Promise<void>;
8
+ //# sourceMappingURL=env.d.ts.map
@@ -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"}