@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.
- package/README.md +397 -0
- package/dist/commands/cherry-pick.d.ts +14 -0
- package/dist/commands/cherry-pick.d.ts.map +1 -0
- package/dist/commands/cherry-pick.js +337 -0
- package/dist/commands/cherry-pick.js.map +1 -0
- package/dist/commands/cherry-pick.test.d.ts +2 -0
- package/dist/commands/cherry-pick.test.d.ts.map +1 -0
- package/dist/commands/cherry-pick.test.js +377 -0
- package/dist/commands/cherry-pick.test.js.map +1 -0
- package/dist/commands/completion.d.ts +11 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +195 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/completion.test.d.ts +2 -0
- package/dist/commands/completion.test.d.ts.map +1 -0
- package/dist/commands/completion.test.js +142 -0
- package/dist/commands/completion.test.js.map +1 -0
- package/dist/commands/create.d.ts +15 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +107 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/create.test.d.ts +2 -0
- package/dist/commands/create.test.d.ts.map +1 -0
- package/dist/commands/create.test.js +274 -0
- package/dist/commands/create.test.js.map +1 -0
- package/dist/commands/list.d.ts +14 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +69 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/notes.d.ts +15 -0
- package/dist/commands/notes.d.ts.map +1 -0
- package/dist/commands/notes.js +374 -0
- package/dist/commands/notes.js.map +1 -0
- package/dist/commands/publish.d.ts +14 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +220 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/publish.test.d.ts +2 -0
- package/dist/commands/publish.test.d.ts.map +1 -0
- package/dist/commands/publish.test.js +371 -0
- package/dist/commands/publish.test.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +258 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/context.d.ts +35 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +48 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +152 -0
- package/dist/index.js.map +1 -0
- package/dist/output/formatter.d.ts +161 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +398 -0
- package/dist/output/formatter.js.map +1 -0
- package/dist/output/formatter.test.d.ts +2 -0
- package/dist/output/formatter.test.d.ts.map +1 -0
- package/dist/output/formatter.test.js +223 -0
- package/dist/output/formatter.test.js.map +1 -0
- package/dist/services/ai.d.ts +69 -0
- package/dist/services/ai.d.ts.map +1 -0
- package/dist/services/ai.js +235 -0
- package/dist/services/ai.js.map +1 -0
- package/dist/services/ai.test.d.ts +2 -0
- package/dist/services/ai.test.d.ts.map +1 -0
- package/dist/services/ai.test.js +101 -0
- package/dist/services/ai.test.js.map +1 -0
- package/dist/services/github.d.ts +200 -0
- package/dist/services/github.d.ts.map +1 -0
- package/dist/services/github.js +465 -0
- package/dist/services/github.js.map +1 -0
- package/dist/services/github.test.d.ts +2 -0
- package/dist/services/github.test.d.ts.map +1 -0
- package/dist/services/github.test.js +64 -0
- package/dist/services/github.test.js.map +1 -0
- package/dist/services/version.d.ts +106 -0
- package/dist/services/version.d.ts.map +1 -0
- package/dist/services/version.js +158 -0
- package/dist/services/version.js.map +1 -0
- package/dist/services/version.test.d.ts +2 -0
- package/dist/services/version.test.d.ts.map +1 -0
- package/dist/services/version.test.js +136 -0
- package/dist/services/version.test.js.map +1 -0
- package/dist/utils/errors.d.ts +66 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +154 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/errors.test.d.ts +2 -0
- package/dist/utils/errors.test.d.ts.map +1 -0
- package/dist/utils/errors.test.js +147 -0
- package/dist/utils/errors.test.js.map +1 -0
- package/dist/utils/prompts.d.ts +54 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +108 -0
- package/dist/utils/prompts.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
// ABOUTME: Publish command that merges a prepare-release PR to publish a release.
|
|
2
|
+
// ABOUTME: Validates PR has correct label and passing checks before merging.
|
|
3
|
+
import { NotFoundError, ValidationError, GitHubError } from "../utils/errors.js";
|
|
4
|
+
import { parseFullVersion, formatPrepBranch, formatReleaseTag, extractMajorMinor, } from "../services/version.js";
|
|
5
|
+
import { confirm } from "../utils/prompts.js";
|
|
6
|
+
/**
|
|
7
|
+
* Prepare-release label that triggers the promote pipeline on merge.
|
|
8
|
+
*/
|
|
9
|
+
const PREPARE_RELEASE_LABEL = "prepare-release";
|
|
10
|
+
/**
|
|
11
|
+
* Executes the publish command.
|
|
12
|
+
* Merges a prepare-release PR to trigger the promote pipeline.
|
|
13
|
+
*/
|
|
14
|
+
export async function publishCommand(ctx, versionInput, options) {
|
|
15
|
+
const { github, formatter } = ctx;
|
|
16
|
+
// Parse and validate version format (must be major.minor.patch)
|
|
17
|
+
const version = parseFullVersion(versionInput);
|
|
18
|
+
const prepBranchName = formatPrepBranch(version);
|
|
19
|
+
const releaseTag = formatReleaseTag(version);
|
|
20
|
+
const spinner = formatter.spinner(`Finding prepare-release PR for ${versionInput}...`);
|
|
21
|
+
spinner.start();
|
|
22
|
+
// Find the prepare-release PR
|
|
23
|
+
const pr = await github.findPullRequestByHead(prepBranchName);
|
|
24
|
+
if (!pr) {
|
|
25
|
+
spinner.stop();
|
|
26
|
+
throw new NotFoundError(`Prepare-release PR`, `No open PR found for branch '${prepBranchName}'.\n` +
|
|
27
|
+
`The prepare-release pipeline may not have run yet.\n` +
|
|
28
|
+
`Run 'gitops-release status ${extractMajorMinor(version).major}.${extractMajorMinor(version).minor}' to check.`);
|
|
29
|
+
}
|
|
30
|
+
// Validate PR has the prepare-release label
|
|
31
|
+
if (!pr.labels.includes(PREPARE_RELEASE_LABEL)) {
|
|
32
|
+
spinner.stop();
|
|
33
|
+
throw new ValidationError(`PR #${pr.number} does not have the '${PREPARE_RELEASE_LABEL}' label.\n` +
|
|
34
|
+
`This label is required to trigger the promote pipeline on merge.\n` +
|
|
35
|
+
`Add the label manually or wait for the prepare-release pipeline to complete.`);
|
|
36
|
+
}
|
|
37
|
+
// Get check status
|
|
38
|
+
const checks = await github.getCommitChecks(pr.headBranch);
|
|
39
|
+
// Get draft release info (if exists)
|
|
40
|
+
const draftRelease = await github.getDraftRelease(releaseTag);
|
|
41
|
+
spinner.stop();
|
|
42
|
+
// Validate checks are passing
|
|
43
|
+
if (!checks.allPassing) {
|
|
44
|
+
const failMessage = buildChecksFailureMessage(checks, pr);
|
|
45
|
+
if (!options.force) {
|
|
46
|
+
throw new ValidationError(failMessage);
|
|
47
|
+
}
|
|
48
|
+
formatter.warning("Proceeding despite failing checks due to --force flag");
|
|
49
|
+
formatter.text(failMessage);
|
|
50
|
+
}
|
|
51
|
+
// Dry run mode - just show what would happen
|
|
52
|
+
if (options.dryRun) {
|
|
53
|
+
outputDryRun(formatter, versionInput, pr, checks, draftRelease);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Show PR info and confirm
|
|
57
|
+
if (!formatter.isJsonMode()) {
|
|
58
|
+
outputPublishPreview(formatter, versionInput, pr, checks, draftRelease);
|
|
59
|
+
}
|
|
60
|
+
// Confirm before merging
|
|
61
|
+
await confirm(`Merge PR #${pr.number} to publish release ${versionInput}?`, {
|
|
62
|
+
force: options.force,
|
|
63
|
+
});
|
|
64
|
+
// Merge the PR
|
|
65
|
+
const mergeSpinner = formatter.spinner(`Merging PR #${pr.number}...`);
|
|
66
|
+
mergeSpinner.start();
|
|
67
|
+
try {
|
|
68
|
+
await github.mergePullRequest(pr.number);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
mergeSpinner.stop();
|
|
72
|
+
if (error instanceof GitHubError) {
|
|
73
|
+
throw new GitHubError(`Failed to merge PR #${pr.number}: ${error.message}\n` +
|
|
74
|
+
`The PR may have merge conflicts or required checks may not have passed.`);
|
|
75
|
+
}
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
mergeSpinner.stop();
|
|
79
|
+
// Handle JSON output
|
|
80
|
+
if (formatter.isJsonMode()) {
|
|
81
|
+
const jsonOutput = {
|
|
82
|
+
version: versionInput,
|
|
83
|
+
pr: {
|
|
84
|
+
number: pr.number,
|
|
85
|
+
title: pr.title,
|
|
86
|
+
url: pr.url,
|
|
87
|
+
headBranch: pr.headBranch,
|
|
88
|
+
baseBranch: pr.baseBranch,
|
|
89
|
+
},
|
|
90
|
+
checks: {
|
|
91
|
+
total: checks.totalCount,
|
|
92
|
+
passing: checks.passing,
|
|
93
|
+
failing: checks.failing,
|
|
94
|
+
pending: checks.pending,
|
|
95
|
+
allPassing: checks.allPassing,
|
|
96
|
+
},
|
|
97
|
+
release: draftRelease
|
|
98
|
+
? {
|
|
99
|
+
tag: draftRelease.tag,
|
|
100
|
+
url: draftRelease.url,
|
|
101
|
+
draft: draftRelease.draft,
|
|
102
|
+
}
|
|
103
|
+
: null,
|
|
104
|
+
merged: true,
|
|
105
|
+
dryRun: false,
|
|
106
|
+
};
|
|
107
|
+
formatter.json(jsonOutput);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// Human-readable success output
|
|
111
|
+
formatter.success(`Merged PR #${pr.number}`);
|
|
112
|
+
formatter.newline();
|
|
113
|
+
formatter.section("Next steps");
|
|
114
|
+
formatter.text(" The promote pipeline will now:");
|
|
115
|
+
formatter.text(` • Publish chart to quay.io/codefresh/gitops-runtime:${releaseTag}`);
|
|
116
|
+
formatter.text(" • Publish GitHub release (draft → published)");
|
|
117
|
+
formatter.text(" • Sign container images");
|
|
118
|
+
formatter.newline();
|
|
119
|
+
if (draftRelease) {
|
|
120
|
+
formatter.text(` Release URL: ${draftRelease.url}`);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const repo = github.getRepo();
|
|
124
|
+
formatter.text(` Release URL: https://github.com/${repo.owner}/${repo.repo}/releases/tag/${releaseTag}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Builds a detailed error message when checks are not passing.
|
|
129
|
+
*/
|
|
130
|
+
function buildChecksFailureMessage(checks, pr) {
|
|
131
|
+
const lines = [`CI checks are not passing on PR #${pr.number}`];
|
|
132
|
+
if (checks.failing > 0) {
|
|
133
|
+
lines.push(` ${checks.failing} check(s) failing`);
|
|
134
|
+
}
|
|
135
|
+
if (checks.pending > 0) {
|
|
136
|
+
lines.push(` ${checks.pending} check(s) still running`);
|
|
137
|
+
}
|
|
138
|
+
const failedChecks = checks.checks.filter((c) => c.status === "completed" &&
|
|
139
|
+
c.conclusion !== "success" &&
|
|
140
|
+
c.conclusion !== "skipped" &&
|
|
141
|
+
c.conclusion !== "neutral");
|
|
142
|
+
if (failedChecks.length > 0) {
|
|
143
|
+
lines.push("");
|
|
144
|
+
lines.push("Failed checks:");
|
|
145
|
+
for (const check of failedChecks.slice(0, 5)) {
|
|
146
|
+
lines.push(` • ${check.name}: ${check.conclusion}`);
|
|
147
|
+
}
|
|
148
|
+
if (failedChecks.length > 5) {
|
|
149
|
+
lines.push(` ... and ${failedChecks.length - 5} more`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
lines.push("");
|
|
153
|
+
lines.push(`Review the PR at: ${pr.url}`);
|
|
154
|
+
return lines.join("\n");
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Outputs dry run information.
|
|
158
|
+
*/
|
|
159
|
+
function outputDryRun(formatter, version, pr, checks, release) {
|
|
160
|
+
if (formatter.isJsonMode()) {
|
|
161
|
+
const jsonOutput = {
|
|
162
|
+
version,
|
|
163
|
+
pr: {
|
|
164
|
+
number: pr.number,
|
|
165
|
+
title: pr.title,
|
|
166
|
+
url: pr.url,
|
|
167
|
+
headBranch: pr.headBranch,
|
|
168
|
+
baseBranch: pr.baseBranch,
|
|
169
|
+
},
|
|
170
|
+
checks: {
|
|
171
|
+
total: checks.totalCount,
|
|
172
|
+
passing: checks.passing,
|
|
173
|
+
failing: checks.failing,
|
|
174
|
+
pending: checks.pending,
|
|
175
|
+
allPassing: checks.allPassing,
|
|
176
|
+
},
|
|
177
|
+
release: release
|
|
178
|
+
? {
|
|
179
|
+
tag: release.tag,
|
|
180
|
+
url: release.url,
|
|
181
|
+
draft: release.draft,
|
|
182
|
+
}
|
|
183
|
+
: null,
|
|
184
|
+
merged: false,
|
|
185
|
+
dryRun: true,
|
|
186
|
+
};
|
|
187
|
+
formatter.json(jsonOutput);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
formatter.header("Dry Run - No changes will be made");
|
|
191
|
+
formatter.newline();
|
|
192
|
+
formatter.section("Prepare-Release PR");
|
|
193
|
+
formatter.text(` #${pr.number} ${pr.headBranch} → ${pr.baseBranch}`);
|
|
194
|
+
formatter.text(` Title: ${pr.title}`);
|
|
195
|
+
formatter.text(` URL: ${pr.url}`);
|
|
196
|
+
formatter.text(` Checks: ${formatter.status(formatter.checksStatusLabel(checks))}`);
|
|
197
|
+
if (release) {
|
|
198
|
+
formatter.section("Draft Release");
|
|
199
|
+
formatter.text(` Tag: ${release.tag}`);
|
|
200
|
+
formatter.text(` URL: ${release.url}`);
|
|
201
|
+
}
|
|
202
|
+
formatter.newline();
|
|
203
|
+
formatter.info("Run without --dry-run to merge the PR and publish the release");
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Outputs publish preview before confirmation.
|
|
207
|
+
*/
|
|
208
|
+
function outputPublishPreview(formatter, version, pr, checks, draftRelease) {
|
|
209
|
+
formatter.text(`Publishing release ${version}...`);
|
|
210
|
+
formatter.newline();
|
|
211
|
+
formatter.section("Prepare-Release PR");
|
|
212
|
+
formatter.text(` #${pr.number} ${pr.headBranch} → ${pr.baseBranch}`);
|
|
213
|
+
formatter.text(` Status: ${formatter.status(formatter.checksStatusLabel(checks))}`);
|
|
214
|
+
if (draftRelease) {
|
|
215
|
+
formatter.section("Draft Release");
|
|
216
|
+
formatter.text(` ${draftRelease.tag} ${draftRelease.url}`);
|
|
217
|
+
}
|
|
218
|
+
formatter.newline();
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,6EAA6E;AAG7E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjF,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C;;GAEG;AACH,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAsChD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAmB,EACnB,YAAoB,EACpB,OAAuB;IAEvB,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC;IAElC,gEAAgE;IAChE,MAAM,OAAO,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,kCAAkC,YAAY,KAAK,CAAC,CAAC;IACvF,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,8BAA8B;IAC9B,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAC9D,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CACrB,oBAAoB,EACpB,gCAAgC,cAAc,MAAM;YAClD,sDAAsD;YACtD,8BAA8B,iBAAiB,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC,KAAK,aAAa,CAClH,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CACvB,OAAO,EAAE,CAAC,MAAM,uBAAuB,qBAAqB,YAAY;YACtE,oEAAoE;YACpE,8EAA8E,CACjF,CAAC;IACJ,CAAC;IAED,mBAAmB;IACnB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IAE3D,qCAAqC;IACrC,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IAE9D,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,8BAA8B;IAC9B,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,yBAAyB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;QACzC,CAAC;QACD,SAAS,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC;QAC3E,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9B,CAAC;IAED,6CAA6C;IAC7C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,CAAC;QAC5B,oBAAoB,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAC1E,CAAC;IAED,yBAAyB;IACzB,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,MAAM,uBAAuB,YAAY,GAAG,EAAE;QAC1E,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,eAAe;IACf,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;IACtE,YAAY,CAAC,KAAK,EAAE,CAAC;IAErB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAY,CAAC,IAAI,EAAE,CAAC;QACpB,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,WAAW,CACnB,uBAAuB,EAAE,CAAC,MAAM,KAAK,KAAK,CAAC,OAAO,IAAI;gBACpD,yEAAyE,CAC5E,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,YAAY,CAAC,IAAI,EAAE,CAAC;IAEpB,qBAAqB;IACrB,IAAI,SAAS,CAAC,UAAU,EAAE,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAsB;YACpC,OAAO,EAAE,YAAY;YACrB,EAAE,EAAE;gBACF,MAAM,EAAE,EAAE,CAAC,MAAM;gBACjB,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,GAAG,EAAE,EAAE,CAAC,GAAG;gBACX,UAAU,EAAE,EAAE,CAAC,UAAU;gBACzB,UAAU,EAAE,EAAE,CAAC,UAAU;aAC1B;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,MAAM,CAAC,UAAU;gBACxB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B;YACD,OAAO,EAAE,YAAY;gBACnB,CAAC,CAAC;oBACE,GAAG,EAAE,YAAY,CAAC,GAAG;oBACrB,GAAG,EAAE,YAAY,CAAC,GAAG;oBACrB,KAAK,EAAE,YAAY,CAAC,KAAK;iBAC1B;gBACH,CAAC,CAAC,IAAI;YACR,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,KAAK;SACd,CAAC;QACF,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,gCAAgC;IAChC,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,SAAS,CAAC,OAAO,EAAE,CAAC;IAEpB,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAChC,SAAS,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACnD,SAAS,CAAC,IAAI,CAAC,yDAAyD,UAAU,EAAE,CAAC,CAAC;IACtF,SAAS,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IACjE,SAAS,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC5C,SAAS,CAAC,OAAO,EAAE,CAAC;IAEpB,IAAI,YAAY,EAAE,CAAC;QACjB,SAAS,CAAC,IAAI,CAAC,kBAAkB,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAC9B,SAAS,CAAC,IAAI,CACZ,qCAAqC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,iBAAiB,UAAU,EAAE,CAC1F,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,yBAAyB,CAAC,MAAmB,EAAE,EAAmB;IACzE,MAAM,KAAK,GAAa,CAAC,oCAAoC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1E,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,OAAO,yBAAyB,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,KAAK,WAAW;QACxB,CAAC,CAAC,UAAU,KAAK,SAAS;QAC1B,CAAC,CAAC,UAAU,KAAK,SAAS;QAC1B,CAAC,CAAC,UAAU,KAAK,SAAS,CAC7B,CAAC;IAEF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7B,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,aAAa,YAAY,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IAE1C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CACnB,SAAgF,EAChF,OAAe,EACf,EAAmB,EACnB,MAAmB,EACnB,OAA2B;IAE3B,IAAI,SAAS,CAAC,UAAU,EAAE,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAsB;YACpC,OAAO;YACP,EAAE,EAAE;gBACF,MAAM,EAAE,EAAE,CAAC,MAAM;gBACjB,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,GAAG,EAAE,EAAE,CAAC,GAAG;gBACX,UAAU,EAAE,EAAE,CAAC,UAAU;gBACzB,UAAU,EAAE,EAAE,CAAC,UAAU;aAC1B;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,MAAM,CAAC,UAAU;gBACxB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B;YACD,OAAO,EAAE,OAAO;gBACd,CAAC,CAAC;oBACE,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,KAAK,EAAE,OAAO,CAAC,KAAK;iBACrB;gBACH,CAAC,CAAC,IAAI;YACR,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,IAAI;SACb,CAAC;QACF,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,SAAS,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC;IACtD,SAAS,CAAC,OAAO,EAAE,CAAC;IAEpB,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACxC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,UAAU,MAAM,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;IACvE,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IACvC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IAEnC,SAAS,CAAC,IAAI,CAAC,aAAa,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAErF,IAAI,OAAO,EAAE,CAAC;QACZ,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACnC,SAAS,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACxC,SAAS,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,SAAS,CAAC,OAAO,EAAE,CAAC;IACpB,SAAS,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,SAAgF,EAChF,OAAe,EACf,EAAmB,EACnB,MAAmB,EACnB,YAAgC;IAEhC,SAAS,CAAC,IAAI,CAAC,sBAAsB,OAAO,KAAK,CAAC,CAAC;IACnD,SAAS,CAAC,OAAO,EAAE,CAAC;IAEpB,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACxC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,UAAU,MAAM,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;IAEvE,SAAS,CAAC,IAAI,CAAC,aAAa,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAErF,IAAI,YAAY,EAAE,CAAC;QACjB,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACnC,SAAS,CAAC,IAAI,CAAC,KAAK,YAAY,CAAC,GAAG,KAAK,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,SAAS,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.test.d.ts","sourceRoot":"","sources":["../../src/commands/publish.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
// ABOUTME: Unit tests for the publish command.
|
|
2
|
+
// ABOUTME: Tests version validation, PR discovery, check validation, and merge behavior.
|
|
3
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
4
|
+
import { publishCommand } from "./publish.js";
|
|
5
|
+
import { ValidationError, NotFoundError } from "../utils/errors.js";
|
|
6
|
+
// Mock the prompts module
|
|
7
|
+
vi.mock("../utils/prompts.js", () => ({
|
|
8
|
+
confirm: vi.fn().mockResolvedValue(true),
|
|
9
|
+
}));
|
|
10
|
+
/**
|
|
11
|
+
* Creates a mock PullRequestInfo.
|
|
12
|
+
*/
|
|
13
|
+
function createMockPR(overrides = {}) {
|
|
14
|
+
return {
|
|
15
|
+
number: 456,
|
|
16
|
+
title: "prepare-version(0.27.0): prepare chart content for release",
|
|
17
|
+
state: "open",
|
|
18
|
+
draft: false,
|
|
19
|
+
headBranch: "prep/v0.27.0",
|
|
20
|
+
baseBranch: "stable/0.27",
|
|
21
|
+
url: "https://github.com/test-owner/test-repo/pull/456",
|
|
22
|
+
labels: ["prepare-release"],
|
|
23
|
+
mergeable: true,
|
|
24
|
+
createdAt: "2025-01-01T00:00:00Z",
|
|
25
|
+
updatedAt: "2025-01-01T00:00:00Z",
|
|
26
|
+
...overrides,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Creates a mock CheckStatus.
|
|
31
|
+
*/
|
|
32
|
+
function createMockChecks(overrides = {}) {
|
|
33
|
+
return {
|
|
34
|
+
totalCount: 3,
|
|
35
|
+
passing: 3,
|
|
36
|
+
failing: 0,
|
|
37
|
+
pending: 0,
|
|
38
|
+
allPassing: true,
|
|
39
|
+
checks: [
|
|
40
|
+
{ name: "lint", status: "completed", conclusion: "success" },
|
|
41
|
+
{ name: "test", status: "completed", conclusion: "success" },
|
|
42
|
+
{ name: "build", status: "completed", conclusion: "success" },
|
|
43
|
+
],
|
|
44
|
+
...overrides,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Creates a mock ReleaseInfo.
|
|
49
|
+
*/
|
|
50
|
+
function createMockRelease(overrides = {}) {
|
|
51
|
+
return {
|
|
52
|
+
id: 123,
|
|
53
|
+
tag: "0.27.0",
|
|
54
|
+
name: "0.27.0",
|
|
55
|
+
draft: true,
|
|
56
|
+
prerelease: false,
|
|
57
|
+
publishedAt: null,
|
|
58
|
+
url: "https://github.com/test-owner/test-repo/releases/tag/0.27.0",
|
|
59
|
+
body: null,
|
|
60
|
+
...overrides,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Creates a mock GitHubService with default implementations.
|
|
65
|
+
*/
|
|
66
|
+
function createMockGitHub() {
|
|
67
|
+
const findPullRequestByHead = vi.fn();
|
|
68
|
+
const getCommitChecks = vi.fn();
|
|
69
|
+
const getDraftRelease = vi.fn();
|
|
70
|
+
const mergePullRequest = vi.fn();
|
|
71
|
+
const getRepo = vi.fn().mockReturnValue({ owner: "test-owner", repo: "test-repo" });
|
|
72
|
+
const github = {
|
|
73
|
+
findPullRequestByHead,
|
|
74
|
+
getCommitChecks,
|
|
75
|
+
getDraftRelease,
|
|
76
|
+
mergePullRequest,
|
|
77
|
+
getRepo,
|
|
78
|
+
};
|
|
79
|
+
return {
|
|
80
|
+
github,
|
|
81
|
+
mocks: { findPullRequestByHead, getCommitChecks, getDraftRelease, mergePullRequest, getRepo },
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Creates a mock Formatter that captures output.
|
|
86
|
+
*/
|
|
87
|
+
function createMockFormatter() {
|
|
88
|
+
const output = {
|
|
89
|
+
json: null,
|
|
90
|
+
texts: [],
|
|
91
|
+
successes: [],
|
|
92
|
+
warnings: [],
|
|
93
|
+
};
|
|
94
|
+
const formatter = {
|
|
95
|
+
spinner: vi.fn().mockReturnValue({
|
|
96
|
+
start: vi.fn(),
|
|
97
|
+
stop: vi.fn(),
|
|
98
|
+
}),
|
|
99
|
+
isJsonMode: vi.fn().mockReturnValue(false),
|
|
100
|
+
json: vi.fn((data) => {
|
|
101
|
+
output.json = data;
|
|
102
|
+
}),
|
|
103
|
+
header: vi.fn(),
|
|
104
|
+
newline: vi.fn(),
|
|
105
|
+
keyValue: vi.fn(),
|
|
106
|
+
info: vi.fn(),
|
|
107
|
+
text: vi.fn((msg) => {
|
|
108
|
+
output.texts.push(msg);
|
|
109
|
+
}),
|
|
110
|
+
section: vi.fn(),
|
|
111
|
+
success: vi.fn((msg) => {
|
|
112
|
+
output.successes.push(msg);
|
|
113
|
+
}),
|
|
114
|
+
warning: vi.fn((msg) => {
|
|
115
|
+
output.warnings.push(msg);
|
|
116
|
+
}),
|
|
117
|
+
status: vi.fn((s) => `[${s}]`),
|
|
118
|
+
checksStatusLabel: vi.fn((checks) => {
|
|
119
|
+
if (checks.allPassing)
|
|
120
|
+
return "passing";
|
|
121
|
+
if (checks.pending > 0)
|
|
122
|
+
return "pending";
|
|
123
|
+
return "failing";
|
|
124
|
+
}),
|
|
125
|
+
};
|
|
126
|
+
return { formatter, output };
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Creates a CommandContext with mocked services.
|
|
130
|
+
*/
|
|
131
|
+
function createMockContext() {
|
|
132
|
+
const { github, mocks } = createMockGitHub();
|
|
133
|
+
const { formatter, output } = createMockFormatter();
|
|
134
|
+
const ctx = {
|
|
135
|
+
github,
|
|
136
|
+
formatter,
|
|
137
|
+
options: {
|
|
138
|
+
repo: "test-owner/test-repo",
|
|
139
|
+
json: false,
|
|
140
|
+
quiet: false,
|
|
141
|
+
verbose: false,
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
return { ctx, mocks, output };
|
|
145
|
+
}
|
|
146
|
+
describe("publishCommand", () => {
|
|
147
|
+
beforeEach(() => {
|
|
148
|
+
vi.clearAllMocks();
|
|
149
|
+
});
|
|
150
|
+
describe("version validation", () => {
|
|
151
|
+
it("rejects major.minor format (requires patch)", async () => {
|
|
152
|
+
const { ctx } = createMockContext();
|
|
153
|
+
const options = { force: false, dryRun: false };
|
|
154
|
+
await expect(publishCommand(ctx, "0.27", options)).rejects.toThrow(ValidationError);
|
|
155
|
+
await expect(publishCommand(ctx, "0.27", options)).rejects.toThrow("Expected: major.minor.patch");
|
|
156
|
+
});
|
|
157
|
+
it("rejects invalid version formats", async () => {
|
|
158
|
+
const { ctx } = createMockContext();
|
|
159
|
+
const options = { force: false, dryRun: false };
|
|
160
|
+
await expect(publishCommand(ctx, "27", options)).rejects.toThrow(ValidationError);
|
|
161
|
+
await expect(publishCommand(ctx, "v0.27.0", options)).rejects.toThrow(ValidationError);
|
|
162
|
+
await expect(publishCommand(ctx, "0.27.0.1", options)).rejects.toThrow(ValidationError);
|
|
163
|
+
});
|
|
164
|
+
it("accepts valid major.minor.patch format", async () => {
|
|
165
|
+
const { ctx, mocks } = createMockContext();
|
|
166
|
+
const options = { force: false, dryRun: true };
|
|
167
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR());
|
|
168
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks());
|
|
169
|
+
mocks.getDraftRelease.mockResolvedValue(createMockRelease());
|
|
170
|
+
await expect(publishCommand(ctx, "0.27.0", options)).resolves.not.toThrow();
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
describe("PR discovery", () => {
|
|
174
|
+
it("throws error when PR not found", async () => {
|
|
175
|
+
const { ctx, mocks } = createMockContext();
|
|
176
|
+
const options = { force: false, dryRun: false };
|
|
177
|
+
mocks.findPullRequestByHead.mockResolvedValue(null);
|
|
178
|
+
await expect(publishCommand(ctx, "0.27.0", options)).rejects.toThrow(NotFoundError);
|
|
179
|
+
await expect(publishCommand(ctx, "0.27.0", options)).rejects.toThrow("No open PR found");
|
|
180
|
+
});
|
|
181
|
+
it("searches for PR with correct prep branch name", async () => {
|
|
182
|
+
const { ctx, mocks } = createMockContext();
|
|
183
|
+
const options = { force: false, dryRun: true };
|
|
184
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR());
|
|
185
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks());
|
|
186
|
+
mocks.getDraftRelease.mockResolvedValue(null);
|
|
187
|
+
await publishCommand(ctx, "0.27.0", options);
|
|
188
|
+
expect(mocks.findPullRequestByHead).toHaveBeenCalledWith("prep/v0.27.0");
|
|
189
|
+
});
|
|
190
|
+
it("searches for correct prep branch for different versions", async () => {
|
|
191
|
+
const { ctx, mocks } = createMockContext();
|
|
192
|
+
const options = { force: false, dryRun: true };
|
|
193
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR({ headBranch: "prep/v1.2.3" }));
|
|
194
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks());
|
|
195
|
+
mocks.getDraftRelease.mockResolvedValue(null);
|
|
196
|
+
await publishCommand(ctx, "1.2.3", options);
|
|
197
|
+
expect(mocks.findPullRequestByHead).toHaveBeenCalledWith("prep/v1.2.3");
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
describe("prepare-release label validation", () => {
|
|
201
|
+
it("throws error when PR missing prepare-release label", async () => {
|
|
202
|
+
const { ctx, mocks } = createMockContext();
|
|
203
|
+
const options = { force: false, dryRun: false };
|
|
204
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR({ labels: [] }));
|
|
205
|
+
await expect(publishCommand(ctx, "0.27.0", options)).rejects.toThrow(ValidationError);
|
|
206
|
+
await expect(publishCommand(ctx, "0.27.0", options)).rejects.toThrow("prepare-release");
|
|
207
|
+
});
|
|
208
|
+
it("proceeds when PR has prepare-release label", async () => {
|
|
209
|
+
const { ctx, mocks } = createMockContext();
|
|
210
|
+
const options = { force: false, dryRun: true };
|
|
211
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR({ labels: ["prepare-release", "other-label"] }));
|
|
212
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks());
|
|
213
|
+
mocks.getDraftRelease.mockResolvedValue(null);
|
|
214
|
+
await expect(publishCommand(ctx, "0.27.0", options)).resolves.not.toThrow();
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
describe("check status validation", () => {
|
|
218
|
+
it("throws error when checks are failing without --force", async () => {
|
|
219
|
+
const { ctx, mocks } = createMockContext();
|
|
220
|
+
const options = { force: false, dryRun: false };
|
|
221
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR());
|
|
222
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks({
|
|
223
|
+
allPassing: false,
|
|
224
|
+
failing: 1,
|
|
225
|
+
checks: [{ name: "lint", status: "completed", conclusion: "failure" }],
|
|
226
|
+
}));
|
|
227
|
+
mocks.getDraftRelease.mockResolvedValue(null);
|
|
228
|
+
await expect(publishCommand(ctx, "0.27.0", options)).rejects.toThrow(ValidationError);
|
|
229
|
+
await expect(publishCommand(ctx, "0.27.0", options)).rejects.toThrow("checks are not passing");
|
|
230
|
+
});
|
|
231
|
+
it("throws error when checks are pending without --force", async () => {
|
|
232
|
+
const { ctx, mocks } = createMockContext();
|
|
233
|
+
const options = { force: false, dryRun: false };
|
|
234
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR());
|
|
235
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks({
|
|
236
|
+
allPassing: false,
|
|
237
|
+
pending: 1,
|
|
238
|
+
passing: 2,
|
|
239
|
+
checks: [
|
|
240
|
+
{ name: "lint", status: "completed", conclusion: "success" },
|
|
241
|
+
{ name: "test", status: "in_progress", conclusion: null },
|
|
242
|
+
{ name: "build", status: "completed", conclusion: "success" },
|
|
243
|
+
],
|
|
244
|
+
}));
|
|
245
|
+
mocks.getDraftRelease.mockResolvedValue(null);
|
|
246
|
+
await expect(publishCommand(ctx, "0.27.0", options)).rejects.toThrow(ValidationError);
|
|
247
|
+
});
|
|
248
|
+
it("proceeds when checks are passing", async () => {
|
|
249
|
+
const { ctx, mocks } = createMockContext();
|
|
250
|
+
const options = { force: false, dryRun: true };
|
|
251
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR());
|
|
252
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks());
|
|
253
|
+
mocks.getDraftRelease.mockResolvedValue(null);
|
|
254
|
+
await expect(publishCommand(ctx, "0.27.0", options)).resolves.not.toThrow();
|
|
255
|
+
});
|
|
256
|
+
it("allows merge with failing checks when --force is used", async () => {
|
|
257
|
+
const { ctx, mocks, output } = createMockContext();
|
|
258
|
+
const options = { force: true, dryRun: true };
|
|
259
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR());
|
|
260
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks({ allPassing: false, failing: 1 }));
|
|
261
|
+
mocks.getDraftRelease.mockResolvedValue(null);
|
|
262
|
+
await publishCommand(ctx, "0.27.0", options);
|
|
263
|
+
expect(output.warnings.length).toBeGreaterThan(0);
|
|
264
|
+
expect(output.warnings[0]).toContain("--force");
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
describe("dry run mode", () => {
|
|
268
|
+
it("does not merge PR in dry run mode", async () => {
|
|
269
|
+
const { ctx, mocks } = createMockContext();
|
|
270
|
+
const options = { force: false, dryRun: true };
|
|
271
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR());
|
|
272
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks());
|
|
273
|
+
mocks.getDraftRelease.mockResolvedValue(createMockRelease());
|
|
274
|
+
await publishCommand(ctx, "0.27.0", options);
|
|
275
|
+
expect(mocks.mergePullRequest).not.toHaveBeenCalled();
|
|
276
|
+
});
|
|
277
|
+
it("outputs dry run header in human mode", async () => {
|
|
278
|
+
const { ctx, mocks } = createMockContext();
|
|
279
|
+
const options = { force: false, dryRun: true };
|
|
280
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR());
|
|
281
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks());
|
|
282
|
+
mocks.getDraftRelease.mockResolvedValue(null);
|
|
283
|
+
await publishCommand(ctx, "0.27.0", options);
|
|
284
|
+
expect(ctx.formatter.header).toHaveBeenCalledWith(expect.stringContaining("Dry Run"));
|
|
285
|
+
});
|
|
286
|
+
it("outputs JSON with dryRun=true and merged=false in JSON mode", async () => {
|
|
287
|
+
const { ctx, mocks, output } = createMockContext();
|
|
288
|
+
const options = { force: false, dryRun: true };
|
|
289
|
+
ctx.formatter.isJsonMode.mockReturnValue(true);
|
|
290
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR());
|
|
291
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks());
|
|
292
|
+
mocks.getDraftRelease.mockResolvedValue(createMockRelease());
|
|
293
|
+
await publishCommand(ctx, "0.27.0", options);
|
|
294
|
+
expect(output.json).toMatchObject({
|
|
295
|
+
version: "0.27.0",
|
|
296
|
+
merged: false,
|
|
297
|
+
dryRun: true,
|
|
298
|
+
pr: { number: 456 },
|
|
299
|
+
checks: { allPassing: true },
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
describe("PR merge", () => {
|
|
304
|
+
it("merges PR with correct PR number", async () => {
|
|
305
|
+
const { ctx, mocks } = createMockContext();
|
|
306
|
+
const options = { force: true, dryRun: false };
|
|
307
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR({ number: 789 }));
|
|
308
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks());
|
|
309
|
+
mocks.getDraftRelease.mockResolvedValue(null);
|
|
310
|
+
mocks.mergePullRequest.mockResolvedValue(undefined);
|
|
311
|
+
await publishCommand(ctx, "0.27.0", options);
|
|
312
|
+
expect(mocks.mergePullRequest).toHaveBeenCalledWith(789);
|
|
313
|
+
});
|
|
314
|
+
it("outputs success message after merge", async () => {
|
|
315
|
+
const { ctx, mocks, output } = createMockContext();
|
|
316
|
+
const options = { force: true, dryRun: false };
|
|
317
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR());
|
|
318
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks());
|
|
319
|
+
mocks.getDraftRelease.mockResolvedValue(null);
|
|
320
|
+
mocks.mergePullRequest.mockResolvedValue(undefined);
|
|
321
|
+
await publishCommand(ctx, "0.27.0", options);
|
|
322
|
+
expect(output.successes).toContainEqual(expect.stringContaining("Merged PR #456"));
|
|
323
|
+
});
|
|
324
|
+
it("outputs JSON with merged=true after merge in JSON mode", async () => {
|
|
325
|
+
const { ctx, mocks, output } = createMockContext();
|
|
326
|
+
const options = { force: true, dryRun: false };
|
|
327
|
+
ctx.formatter.isJsonMode.mockReturnValue(true);
|
|
328
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR());
|
|
329
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks());
|
|
330
|
+
mocks.getDraftRelease.mockResolvedValue(createMockRelease());
|
|
331
|
+
mocks.mergePullRequest.mockResolvedValue(undefined);
|
|
332
|
+
await publishCommand(ctx, "0.27.0", options);
|
|
333
|
+
expect(output.json).toMatchObject({
|
|
334
|
+
version: "0.27.0",
|
|
335
|
+
merged: true,
|
|
336
|
+
dryRun: false,
|
|
337
|
+
pr: { number: 456 },
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
describe("draft release handling", () => {
|
|
342
|
+
it("includes draft release info in output when available", async () => {
|
|
343
|
+
const { ctx, mocks, output } = createMockContext();
|
|
344
|
+
const options = { force: false, dryRun: true };
|
|
345
|
+
ctx.formatter.isJsonMode.mockReturnValue(true);
|
|
346
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR());
|
|
347
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks());
|
|
348
|
+
mocks.getDraftRelease.mockResolvedValue(createMockRelease());
|
|
349
|
+
await publishCommand(ctx, "0.27.0", options);
|
|
350
|
+
expect(output.json).toMatchObject({
|
|
351
|
+
release: {
|
|
352
|
+
tag: "0.27.0",
|
|
353
|
+
draft: true,
|
|
354
|
+
},
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
it("handles missing draft release gracefully", async () => {
|
|
358
|
+
const { ctx, mocks, output } = createMockContext();
|
|
359
|
+
const options = { force: false, dryRun: true };
|
|
360
|
+
ctx.formatter.isJsonMode.mockReturnValue(true);
|
|
361
|
+
mocks.findPullRequestByHead.mockResolvedValue(createMockPR());
|
|
362
|
+
mocks.getCommitChecks.mockResolvedValue(createMockChecks());
|
|
363
|
+
mocks.getDraftRelease.mockResolvedValue(null);
|
|
364
|
+
await publishCommand(ctx, "0.27.0", options);
|
|
365
|
+
expect(output.json).toMatchObject({
|
|
366
|
+
release: null,
|
|
367
|
+
});
|
|
368
|
+
});
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
//# sourceMappingURL=publish.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.test.js","sourceRoot":"","sources":["../../src/commands/publish.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CommandContext } from "../context.js";
|
|
2
|
+
/**
|
|
3
|
+
* Executes the status command.
|
|
4
|
+
* If version is provided, shows status for that specific version.
|
|
5
|
+
* Otherwise, shows an overview of all active releases.
|
|
6
|
+
*/
|
|
7
|
+
export declare function statusCommand(ctx: CommandContext, version?: string): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AA6E/C;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMxF"}
|