@codefresh-io/gitops-release 0.1.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 (98) hide show
  1. package/README.md +397 -0
  2. package/dist/commands/cherry-pick.d.ts +14 -0
  3. package/dist/commands/cherry-pick.d.ts.map +1 -0
  4. package/dist/commands/cherry-pick.js +337 -0
  5. package/dist/commands/cherry-pick.js.map +1 -0
  6. package/dist/commands/cherry-pick.test.d.ts +2 -0
  7. package/dist/commands/cherry-pick.test.d.ts.map +1 -0
  8. package/dist/commands/cherry-pick.test.js +377 -0
  9. package/dist/commands/cherry-pick.test.js.map +1 -0
  10. package/dist/commands/completion.d.ts +11 -0
  11. package/dist/commands/completion.d.ts.map +1 -0
  12. package/dist/commands/completion.js +195 -0
  13. package/dist/commands/completion.js.map +1 -0
  14. package/dist/commands/completion.test.d.ts +2 -0
  15. package/dist/commands/completion.test.d.ts.map +1 -0
  16. package/dist/commands/completion.test.js +142 -0
  17. package/dist/commands/completion.test.js.map +1 -0
  18. package/dist/commands/create.d.ts +15 -0
  19. package/dist/commands/create.d.ts.map +1 -0
  20. package/dist/commands/create.js +107 -0
  21. package/dist/commands/create.js.map +1 -0
  22. package/dist/commands/create.test.d.ts +2 -0
  23. package/dist/commands/create.test.d.ts.map +1 -0
  24. package/dist/commands/create.test.js +274 -0
  25. package/dist/commands/create.test.js.map +1 -0
  26. package/dist/commands/list.d.ts +14 -0
  27. package/dist/commands/list.d.ts.map +1 -0
  28. package/dist/commands/list.js +69 -0
  29. package/dist/commands/list.js.map +1 -0
  30. package/dist/commands/notes.d.ts +15 -0
  31. package/dist/commands/notes.d.ts.map +1 -0
  32. package/dist/commands/notes.js +374 -0
  33. package/dist/commands/notes.js.map +1 -0
  34. package/dist/commands/publish.d.ts +14 -0
  35. package/dist/commands/publish.d.ts.map +1 -0
  36. package/dist/commands/publish.js +220 -0
  37. package/dist/commands/publish.js.map +1 -0
  38. package/dist/commands/publish.test.d.ts +2 -0
  39. package/dist/commands/publish.test.d.ts.map +1 -0
  40. package/dist/commands/publish.test.js +371 -0
  41. package/dist/commands/publish.test.js.map +1 -0
  42. package/dist/commands/status.d.ts +8 -0
  43. package/dist/commands/status.d.ts.map +1 -0
  44. package/dist/commands/status.js +258 -0
  45. package/dist/commands/status.js.map +1 -0
  46. package/dist/context.d.ts +35 -0
  47. package/dist/context.d.ts.map +1 -0
  48. package/dist/context.js +48 -0
  49. package/dist/context.js.map +1 -0
  50. package/dist/index.d.ts +4 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +152 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/output/formatter.d.ts +161 -0
  55. package/dist/output/formatter.d.ts.map +1 -0
  56. package/dist/output/formatter.js +398 -0
  57. package/dist/output/formatter.js.map +1 -0
  58. package/dist/output/formatter.test.d.ts +2 -0
  59. package/dist/output/formatter.test.d.ts.map +1 -0
  60. package/dist/output/formatter.test.js +223 -0
  61. package/dist/output/formatter.test.js.map +1 -0
  62. package/dist/services/ai.d.ts +69 -0
  63. package/dist/services/ai.d.ts.map +1 -0
  64. package/dist/services/ai.js +235 -0
  65. package/dist/services/ai.js.map +1 -0
  66. package/dist/services/ai.test.d.ts +2 -0
  67. package/dist/services/ai.test.d.ts.map +1 -0
  68. package/dist/services/ai.test.js +101 -0
  69. package/dist/services/ai.test.js.map +1 -0
  70. package/dist/services/github.d.ts +200 -0
  71. package/dist/services/github.d.ts.map +1 -0
  72. package/dist/services/github.js +465 -0
  73. package/dist/services/github.js.map +1 -0
  74. package/dist/services/github.test.d.ts +2 -0
  75. package/dist/services/github.test.d.ts.map +1 -0
  76. package/dist/services/github.test.js +64 -0
  77. package/dist/services/github.test.js.map +1 -0
  78. package/dist/services/version.d.ts +106 -0
  79. package/dist/services/version.d.ts.map +1 -0
  80. package/dist/services/version.js +158 -0
  81. package/dist/services/version.js.map +1 -0
  82. package/dist/services/version.test.d.ts +2 -0
  83. package/dist/services/version.test.d.ts.map +1 -0
  84. package/dist/services/version.test.js +136 -0
  85. package/dist/services/version.test.js.map +1 -0
  86. package/dist/utils/errors.d.ts +66 -0
  87. package/dist/utils/errors.d.ts.map +1 -0
  88. package/dist/utils/errors.js +154 -0
  89. package/dist/utils/errors.js.map +1 -0
  90. package/dist/utils/errors.test.d.ts +2 -0
  91. package/dist/utils/errors.test.d.ts.map +1 -0
  92. package/dist/utils/errors.test.js +147 -0
  93. package/dist/utils/errors.test.js.map +1 -0
  94. package/dist/utils/prompts.d.ts +54 -0
  95. package/dist/utils/prompts.d.ts.map +1 -0
  96. package/dist/utils/prompts.js +108 -0
  97. package/dist/utils/prompts.js.map +1 -0
  98. package/package.json +70 -0
@@ -0,0 +1,337 @@
1
+ // ABOUTME: Cherry-pick command that backports commits to a stable branch.
2
+ // ABOUTME: Uses local git for cherry-pick operations and creates a PR via GitHub API.
3
+ import { execSync, spawnSync } from "child_process";
4
+ import { GitHubError, ValidationError, NotFoundError } from "../utils/errors.js";
5
+ import { parseMajorMinor, formatStableBranch, formatVersion } from "../services/version.js";
6
+ import { confirm } from "../utils/prompts.js";
7
+ /**
8
+ * Checks if the current directory is a git repository.
9
+ */
10
+ function isGitRepo() {
11
+ try {
12
+ execSync("git rev-parse --is-inside-work-tree", { stdio: "pipe" });
13
+ return true;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ /**
20
+ * Gets the configured remote URL to check if it matches the target repo.
21
+ */
22
+ function getRemoteUrl(remoteName = "origin") {
23
+ try {
24
+ return execSync(`git remote get-url ${remoteName}`, { stdio: "pipe" }).toString().trim();
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ /**
31
+ * Checks if the remote URL matches the target repository.
32
+ */
33
+ function remoteMatchesRepo(remoteUrl, owner, repo) {
34
+ if (!remoteUrl)
35
+ return false;
36
+ // Match various git URL formats
37
+ const patterns = [
38
+ new RegExp(`github\\.com[:/]${owner}/${repo}(\\.git)?$`, "i"),
39
+ new RegExp(`github\\.com[:/]${owner}/${repo}/?$`, "i"),
40
+ ];
41
+ return patterns.some((p) => p.test(remoteUrl));
42
+ }
43
+ /**
44
+ * Executes a git command and returns the output.
45
+ */
46
+ function git(args) {
47
+ const result = spawnSync("git", args.split(" "), {
48
+ encoding: "utf-8",
49
+ stdio: ["pipe", "pipe", "pipe"],
50
+ });
51
+ if (result.status !== 0) {
52
+ const errorMsg = result.stderr?.trim() || result.stdout?.trim() || "Git command failed";
53
+ throw new GitHubError(`Git error: ${errorMsg}`);
54
+ }
55
+ return result.stdout?.trim() || "";
56
+ }
57
+ /**
58
+ * Silently executes a git command, ignoring errors.
59
+ * Useful for cleanup operations that may fail.
60
+ */
61
+ function gitSilent(args) {
62
+ try {
63
+ git(args);
64
+ }
65
+ catch {
66
+ // Intentionally ignore errors
67
+ }
68
+ }
69
+ /**
70
+ * Gets the short SHA and first line of commit message for a commit.
71
+ */
72
+ function getCommitInfo(sha) {
73
+ const output = git(`log -1 --format=%h|%s ${sha}`);
74
+ const [shortSha, ...messageParts] = output.split("|");
75
+ return {
76
+ shortSha: shortSha || sha.substring(0, 7),
77
+ message: messageParts.join("|") || "No message",
78
+ };
79
+ }
80
+ /**
81
+ * Checks if a local branch exists.
82
+ */
83
+ function localBranchExists(name) {
84
+ try {
85
+ git(`rev-parse --verify refs/heads/${name}`);
86
+ return true;
87
+ }
88
+ catch {
89
+ return false;
90
+ }
91
+ }
92
+ /**
93
+ * Gets the current branch name.
94
+ */
95
+ function getCurrentBranch() {
96
+ return git("rev-parse --abbrev-ref HEAD");
97
+ }
98
+ /**
99
+ * Generates a unique cherry-pick branch name.
100
+ */
101
+ function generateCherryPickBranchName(stableBranch) {
102
+ const timestamp = Date.now().toString(36);
103
+ const stableVersion = stableBranch.replace("stable/", "");
104
+ return `cherry-pick/${stableVersion}-${timestamp}`;
105
+ }
106
+ /**
107
+ * Executes the cherry-pick command.
108
+ * Cherry-picks commits to a stable branch and creates a PR.
109
+ */
110
+ export async function cherryPickCommand(ctx, versionInput, commits, options) {
111
+ const { github, formatter } = ctx;
112
+ const { owner, repo } = github.getRepo();
113
+ // Validate we have commits to cherry-pick
114
+ if (commits.length === 0) {
115
+ throw new ValidationError("At least one commit SHA is required.");
116
+ }
117
+ // Parse and validate version format (must be major.minor only)
118
+ const version = parseMajorMinor(versionInput);
119
+ const stableBranchName = formatStableBranch(version);
120
+ const versionStr = formatVersion(version);
121
+ // Check if we're in a git repo
122
+ if (!isGitRepo()) {
123
+ throw new ValidationError("Not in a git repository.\n" +
124
+ "The cherry-pick command requires a local git checkout.\n" +
125
+ "Please clone the repository and run this command from within it.");
126
+ }
127
+ // Check if remote matches target repo
128
+ const remoteUrl = getRemoteUrl();
129
+ if (!remoteMatchesRepo(remoteUrl, owner, repo)) {
130
+ throw new ValidationError(`Local repository remote does not match target repo '${owner}/${repo}'.\n` +
131
+ `Found remote: ${remoteUrl || "none"}\n` +
132
+ `Please ensure you're in the correct repository.`);
133
+ }
134
+ const spinner = formatter.spinner("Checking prerequisites...");
135
+ spinner.start();
136
+ // Verify the stable branch exists on remote
137
+ const stableBranch = await github.getBranch(stableBranchName);
138
+ if (!stableBranch) {
139
+ spinner.stop();
140
+ throw new NotFoundError(`Branch '${stableBranchName}' not found.\n` +
141
+ `Create it first with: gitops-release create ${versionStr}`);
142
+ }
143
+ // Validate all commit SHAs exist
144
+ const commitInfos = [];
145
+ for (const sha of commits) {
146
+ try {
147
+ await github.getRefSha(sha);
148
+ const info = getCommitInfo(sha);
149
+ commitInfos.push({ sha, ...info });
150
+ }
151
+ catch {
152
+ spinner.stop();
153
+ throw new ValidationError(`Commit '${sha}' not found in repository.`);
154
+ }
155
+ }
156
+ spinner.stop();
157
+ // Generate the cherry-pick branch name
158
+ const cherryPickBranch = generateCherryPickBranchName(stableBranchName);
159
+ // Show what we're about to do
160
+ if (!formatter.isJsonMode()) {
161
+ formatter.header(`Cherry-picking to ${stableBranchName}`);
162
+ formatter.newline();
163
+ formatter.section("Commits");
164
+ for (const commit of commitInfos) {
165
+ formatter.text(` ${commit.shortSha} - ${commit.message}`);
166
+ }
167
+ formatter.newline();
168
+ }
169
+ // Dry run mode
170
+ if (options.dryRun) {
171
+ if (formatter.isJsonMode()) {
172
+ const jsonOutput = {
173
+ version: versionStr,
174
+ stableBranch: stableBranchName,
175
+ cherryPickBranch,
176
+ commits: commitInfos,
177
+ dryRun: true,
178
+ created: false,
179
+ };
180
+ formatter.json(jsonOutput);
181
+ return;
182
+ }
183
+ formatter.header("Dry Run - No changes will be made");
184
+ formatter.newline();
185
+ formatter.keyValue("Target branch", stableBranchName);
186
+ formatter.keyValue("Cherry-pick branch", cherryPickBranch);
187
+ formatter.keyValue("Commits to cherry-pick", commits.length.toString());
188
+ formatter.newline();
189
+ formatter.info("Run without --dry-run to execute the cherry-pick");
190
+ return;
191
+ }
192
+ // Confirm before proceeding
193
+ await confirm(`Cherry-pick ${commits.length} commit(s) to ${stableBranchName}?`, { force: options.force });
194
+ // Save current branch to restore later
195
+ const originalBranch = getCurrentBranch();
196
+ // Fetch latest from origin
197
+ const fetchSpinner = formatter.spinner("Fetching latest from origin...");
198
+ fetchSpinner.start();
199
+ try {
200
+ git("fetch origin");
201
+ }
202
+ catch {
203
+ fetchSpinner.stop();
204
+ throw new GitHubError("Failed to fetch from origin. Check your network connection.");
205
+ }
206
+ fetchSpinner.stop();
207
+ // Create cherry-pick branch from stable
208
+ const createSpinner = formatter.spinner(`Creating ${cherryPickBranch}...`);
209
+ createSpinner.start();
210
+ try {
211
+ // Make sure we don't have a local branch with that name
212
+ if (localBranchExists(cherryPickBranch)) {
213
+ git(`branch -D ${cherryPickBranch}`);
214
+ }
215
+ // Create branch from remote stable
216
+ git(`checkout -b ${cherryPickBranch} origin/${stableBranchName}`);
217
+ }
218
+ catch {
219
+ createSpinner.stop();
220
+ throw new GitHubError(`Failed to create branch from ${stableBranchName}`);
221
+ }
222
+ createSpinner.stop();
223
+ // Cherry-pick each commit
224
+ const cherryPickSpinner = formatter.spinner("Cherry-picking commits...");
225
+ cherryPickSpinner.start();
226
+ const cherryPickedCommits = [];
227
+ let cherryPickFailed = false;
228
+ let failedCommit = null;
229
+ for (const commit of commits) {
230
+ try {
231
+ git(`cherry-pick ${commit}`);
232
+ cherryPickedCommits.push(commit);
233
+ }
234
+ catch {
235
+ cherryPickFailed = true;
236
+ failedCommit = commit;
237
+ break;
238
+ }
239
+ }
240
+ cherryPickSpinner.stop();
241
+ // Handle cherry-pick failure
242
+ if (cherryPickFailed) {
243
+ // Abort and clean up (best effort)
244
+ gitSilent("cherry-pick --abort");
245
+ gitSilent(`checkout ${originalBranch}`);
246
+ gitSilent(`branch -D ${cherryPickBranch}`);
247
+ throw new GitHubError(`Cherry-pick failed for commit ${failedCommit}.\n` +
248
+ "This usually means there are conflicts that require manual resolution.\n\n" +
249
+ "To cherry-pick manually:\n" +
250
+ ` 1. git checkout -b ${cherryPickBranch} origin/${stableBranchName}\n` +
251
+ ` 2. git cherry-pick ${commits.join(" ")}\n` +
252
+ " 3. Resolve any conflicts\n" +
253
+ " 4. git push -u origin ${cherryPickBranch}\n" +
254
+ ` 5. Create a PR from ${cherryPickBranch} to ${stableBranchName}`);
255
+ }
256
+ // Push the branch
257
+ const pushSpinner = formatter.spinner(`Pushing ${cherryPickBranch}...`);
258
+ pushSpinner.start();
259
+ try {
260
+ git(`push -u origin ${cherryPickBranch}`);
261
+ }
262
+ catch {
263
+ pushSpinner.stop();
264
+ gitSilent(`checkout ${originalBranch}`);
265
+ throw new GitHubError(`Failed to push branch ${cherryPickBranch}.\n` +
266
+ "Check that you have push access to the repository.");
267
+ }
268
+ pushSpinner.stop();
269
+ // Return to original branch (non-fatal if it fails)
270
+ try {
271
+ git(`checkout ${originalBranch}`);
272
+ }
273
+ catch {
274
+ if (!formatter.isJsonMode()) {
275
+ formatter.warning(`Could not return to ${originalBranch}. You are now on ${cherryPickBranch}.`);
276
+ }
277
+ }
278
+ // Create PR
279
+ const prSpinner = formatter.spinner("Creating pull request...");
280
+ prSpinner.start();
281
+ const commitList = commitInfos.map((c) => `- ${c.shortSha} ${c.message}`).join("\n");
282
+ const prTitle = commits.length === 1
283
+ ? `[Backport ${versionStr}] ${commitInfos[0].message}`
284
+ : `[Backport ${versionStr}] Cherry-pick ${commits.length} commits`;
285
+ const prBody = `## Backport to ${stableBranchName}
286
+
287
+ This PR cherry-picks the following commit(s) to ${stableBranchName}:
288
+
289
+ ${commitList}
290
+
291
+ ---
292
+ Created by \`gitops-release cherry-pick\``;
293
+ let pr;
294
+ try {
295
+ pr = await github.createPullRequest({
296
+ title: prTitle,
297
+ head: cherryPickBranch,
298
+ base: stableBranchName,
299
+ body: prBody,
300
+ });
301
+ }
302
+ catch {
303
+ prSpinner.stop();
304
+ throw new GitHubError(`Failed to create pull request.\n` +
305
+ `Branch ${cherryPickBranch} was pushed successfully.\n` +
306
+ `Create the PR manually: https://github.com/${owner}/${repo}/compare/${stableBranchName}...${cherryPickBranch}`);
307
+ }
308
+ prSpinner.stop();
309
+ // Handle JSON output
310
+ if (formatter.isJsonMode()) {
311
+ const jsonOutput = {
312
+ version: versionStr,
313
+ stableBranch: stableBranchName,
314
+ cherryPickBranch,
315
+ commits: commitInfos,
316
+ pr: {
317
+ number: pr.number,
318
+ url: pr.url,
319
+ },
320
+ dryRun: false,
321
+ created: true,
322
+ };
323
+ formatter.json(jsonOutput);
324
+ return;
325
+ }
326
+ // Human-readable success output
327
+ formatter.success(`Cherry-picked ${commits.length} commit(s)`);
328
+ formatter.newline();
329
+ formatter.text(`Created PR #${pr.number}: ${pr.title}`);
330
+ formatter.text(` URL: ${pr.url}`);
331
+ formatter.newline();
332
+ formatter.section("Next steps");
333
+ formatter.text(` • Review and merge PR #${pr.number}`);
334
+ formatter.text(" • After merge, a new prepare-release PR will be created automatically");
335
+ formatter.text(` • Run 'gitops-release status ${versionStr}' to check progress`);
336
+ }
337
+ //# sourceMappingURL=cherry-pick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cherry-pick.js","sourceRoot":"","sources":["../../src/commands/cherry-pick.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cherry-pick.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cherry-pick.test.d.ts","sourceRoot":"","sources":["../../src/commands/cherry-pick.test.ts"],"names":[],"mappings":""}