From 7413b400cb1175d4fff04321d3ca5cec3fa1b034 Mon Sep 17 00:00:00 2001 From: Andrew Lisowski Date: Fri, 19 Mar 2021 11:23:37 -0700 Subject: [PATCH] add canary target flag/option --- packages/cli/src/parse-args.ts | 9 ++++ .../core/src/__tests__/auto-in-pr-ci.test.ts | 50 ++++++++++++++++++- packages/core/src/auto.ts | 33 ++++++++++-- packages/core/src/types.ts | 6 +++ 4 files changed, 92 insertions(+), 6 deletions(-) diff --git a/packages/cli/src/parse-args.ts b/packages/cli/src/parse-args.ts index 7191537ae..c4f4919fa 100644 --- a/packages/cli/src/parse-args.ts +++ b/packages/cli/src/parse-args.ts @@ -566,6 +566,15 @@ export const commands: AutoCommand[] = [ description: "Build number to use to create the canary version. Detected in CI env", }, + { + name: "target", + type: String, + group: "main", + defaultValue: "pr-body", + description: "How the canary version should be attached to a PR", + typeLabel: "pr-body | comment | status", + config: true, + }, { ...message, description: diff --git a/packages/core/src/__tests__/auto-in-pr-ci.test.ts b/packages/core/src/__tests__/auto-in-pr-ci.test.ts index 25598b535..89cdc4c9b 100644 --- a/packages/core/src/__tests__/auto-in-pr-ci.test.ts +++ b/packages/core/src/__tests__/auto-in-pr-ci.test.ts @@ -37,6 +37,8 @@ jest.mock("@octokit/rest", () => { }; issues = { + createComment: jest.fn().mockReturnValue({ data: [] }), + listComments: jest.fn().mockReturnValue({ data: [] }), listLabelsOnIssue: jest.fn().mockReturnValue({ data: [] }), }; @@ -73,7 +75,7 @@ describe("canary in ci", () => { ); }); - test("comments on PR in CI", async () => { + test("add to pr-body on PR in CI", async () => { const auto = new Auto({ ...defaults, plugins: [] }); // @ts-ignore auto.checkClean = () => Promise.resolve(true); @@ -93,6 +95,52 @@ describe("canary in ci", () => { expect(version!.newVersion).toBe("1.2.4-canary.123.1"); }); + test("adds comment on PR in CI", async () => { + const auto = new Auto({ ...defaults, plugins: [] }); + // @ts-ignore + auto.checkClean = () => Promise.resolve(true); + + auto.logger = dummyLog(); + await auto.loadConfig(); + auto.git!.getLatestRelease = () => Promise.resolve("1.2.3"); + auto.release!.getCommitsInRelease = () => + Promise.resolve([makeCommitFromMsg("Test Commit")]); + const addToPrBody = jest.fn(); + auto.git!.addToPrBody = addToPrBody; + const comment = jest.fn(); + auto.comment = comment; + jest.spyOn(auto.release!, "getCommits").mockImplementation(); + auto.hooks.canary.tap("test", () => "1.2.4-canary.123.1"); + + const version = await auto.canary({ pr: 123, build: 1, target: "comment" }); + expect(addToPrBody).not.toHaveBeenCalled(); + expect(comment).toHaveBeenCalled(); + expect(version!.newVersion).toBe("1.2.4-canary.123.1"); + }); + + test("adds status on PR in CI", async () => { + const auto = new Auto({ ...defaults, plugins: [] }); + // @ts-ignore + auto.checkClean = () => Promise.resolve(true); + + auto.logger = dummyLog(); + await auto.loadConfig(); + auto.git!.getLatestRelease = () => Promise.resolve("1.2.3"); + auto.release!.getCommitsInRelease = () => + Promise.resolve([makeCommitFromMsg("Test Commit")]); + const addToPrBody = jest.fn(); + auto.git!.addToPrBody = addToPrBody; + const prStatus = jest.fn(); + auto.prStatus = prStatus; + jest.spyOn(auto.release!, "getCommits").mockImplementation(); + auto.hooks.canary.tap("test", () => "1.2.4-canary.123.1"); + + const version = await auto.canary({ pr: 123, build: 1, target: "status" }); + expect(addToPrBody).not.toHaveBeenCalled(); + expect(prStatus).toHaveBeenCalled(); + expect(version!.newVersion).toBe("1.2.4-canary.123.1"); + }); + test("should fail when canaries not implemented", async () => { const auto = new Auto({ ...defaults, plugins: [] }); // @ts-ignore diff --git a/packages/core/src/auto.ts b/packages/core/src/auto.ts index 5f5802230..b86559e59 100644 --- a/packages/core/src/auto.ts +++ b/packages/core/src/auto.ts @@ -1295,16 +1295,39 @@ export default class Auto { ); if (options.message !== "false" && pr) { + const prNumber = Number(pr); const message = typeof result === "string" ? messageHeader : makeDetail(messageHeader, result.details); - await this.prBody({ - pr: Number(pr), - context: "canary-version", - message, - }); + switch (options.target) { + case "comment": + await this.comment({ + pr: prNumber, + context: "canary-version", + message, + }); + break; + + case "status": + await this.prStatus({ + pr: prNumber, + context: "canary-version", + description: messageHeader, + state: "success", + url: "buildUrl" in env ? env.buildUrl : "", + }); + break; + + default: + await this.prBody({ + pr: prNumber, + context: "canary-version", + message, + }); + break; + } } this.logger.log.success( diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index a6e28cfa0..a671fe953 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -117,6 +117,12 @@ export const globalOptions = t.partial({ force: t.boolean, /** The message used when attaching the canary version to a PR */ message: t.union([t.literal(false), t.string]), + /** How the canary version should be attached to a PR */ + target: t.union([ + t.literal("pr-body"), + t.literal("comment"), + t.literal("status"), + ]), }), /** Options to pass to "auto next" */ next: t.partial({