Compare commits

...
Author SHA1 Message Date
github-actions[bot] 8f7aee55a0 v2.0.0-next.2 2026-06-24 10:38:52 +00:00
changesets-org-version-bot[bot]andgithub-actions[bot] b12c36a7bf Version Packages (next) (#671)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-24 10:28:35 +00:00
Mateusz Burzyński 5a8b9b721b Avoid putting the github token in the global .netrc file (#670)
* Avoid putting the github token in the global `.netrc` file

* fix wording
2026-06-24 10:07:11 +00:00
23 changed files with 537 additions and 107 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"@changesets/action": patch
---
Authenticate git CLI pushes with the configured GitHub token using Git extra headers instead of writing to a global `.netrc` file.
+5
View File
@@ -0,0 +1,5 @@
---
"@changesets/action": patch
---
Derive the Git server URL from the GitHub Actions context when configuring git CLI authentication to support GitHub Enterprise Server setups.
+2
View File
@@ -8,6 +8,8 @@
"all-cars-grin",
"eight-clocks-pull",
"eighty-doors-swim",
"git-cli-auth-header",
"git-cli-server-url",
"lemon-turtles-itch",
"ready-mangos-boil",
"silent-tips-dance"
+8
View File
@@ -1,5 +1,13 @@
# @changesets/action
## 2.0.0-next.2
### Patch Changes
- [#670](https://github.com/changesets/action/pull/670) [`5a8b9b7`](https://github.com/changesets/action/commit/5a8b9b721bf683e3bf9bd72ea92a685dc024147b) Thanks [@Andarist](https://github.com/Andarist)! - Authenticate git CLI pushes with the configured GitHub token using Git extra headers instead of writing to a global `.netrc` file.
- [#670](https://github.com/changesets/action/pull/670) [`5a8b9b7`](https://github.com/changesets/action/commit/5a8b9b721bf683e3bf9bd72ea92a685dc024147b) Thanks [@Andarist](https://github.com/Andarist)! - Derive the Git server URL from the GitHub Actions context when configuring git CLI authentication to support GitHub Enterprise Server setups.
## 2.0.0-next.1
### Patch Changes
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
View File
@@ -0,0 +1,2 @@
import{_ as e,g as t,h as n,m as r,p as i,v as a}from"./get-packages.cjs-Dvdg-NAr.js";import{n as o,r as s,t as c}from"./run-Cekyj2rz.js";import{r as l,s as u}from"./utils-DQTbg3yF.js";import{t as d}from"./readChangesetState-D8jsqLyj.js";import f from"node:fs/promises";(async()=>{let p=process.env.GITHUB_TOKEN||n(`github-token`);if(!p){e(`Please add the GITHUB_TOKEN to the changesets action`);return}let m=process.cwd(),h=u(`commitMode`)??`git-cli`,g=u(`prDraft`);if(h!==`git-cli`&&h!==`github-api`){e(`Invalid commit mode: ${h}`);return}if(g!==void 0&&g!==`always`&&g!==`create`){e(`Invalid prDraft: ${g}`);return}let _=new s({cwd:m,githubToken:p,commitMode:h});r(`setupGitUser`)&&(t(`setting git user`),await _.setupUser());let{changesets:v}=await d(m),y=n(`publish`),b=v.length!==0,x=v.some(e=>e.releases.length>0),S=!!y;switch(a(`published`,`false`),a(`publishedPackages`,`[]`),a(`hasChangesets`,String(b)),!0){case!b&&!S:t(`No changesets present or were removed by merging release PR. Not publishing because no publish script found.`);return;case!b&&S:{if(t(`No changesets found. Attempting to publish any unpublished packages to npm`),process.env.NPM_TOKEN){let e=`${process.env.HOME}/.npmrc`;await l(e)?(t(`Found existing user .npmrc file`),(await f.readFile(e,`utf8`)).split(`
`).find(e=>/^\s*\/\/registry\.npmjs\.org\/:[_-]authToken=/i.test(e))?t(`Found existing auth token for the npm registry in the user .npmrc file`):(t(`Didn't find existing auth token for the npm registry in the user .npmrc file, creating one`),await f.appendFile(e,`\n//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}\n`))):(t(`No user .npmrc file found, creating one with NPM_TOKEN used as auth token`),await f.writeFile(e,`//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}\n`))}else process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN&&process.env.ACTIONS_ID_TOKEN_REQUEST_URL?t(`No NPM_TOKEN found, but OIDC is available - using npm trusted publishing`):t(`No NPM_TOKEN or OIDC available - assuming npm is already authenticated`);let e=await c({script:y,github:_,createGithubReleases:r(`createGithubReleases`),cwd:m});e.published&&(a(`published`,`true`),a(`publishedPackages`,JSON.stringify(e.publishedPackages))),e.exitCode!==0&&(i(`Publish command exited with code ${e.exitCode}${e.published?`, but some packages were published: ${e.publishedPackages.map(e=>`${e.name}@${e.version}`).join(`, `)}`:``}`),process.exit(e.exitCode));return}case b&&!x:t(`All changesets are empty; not creating PR`);return;case b:{let{pullRequestNumber:e}=await o({script:u(`version`),github:_,cwd:m,prTitle:u(`title`),commitMessage:u(`commit`),hasPublishScript:S,prDraft:g,branch:u(`branch`)});a(`pullRequestNumber`,String(e));return}}})().catch(t=>{i(t),e(t.message)});export{};
+1
View File
@@ -0,0 +1 @@
import{_ as e,v as t}from"./get-packages.cjs-Dvdg-NAr.js";import{f as n,n as r,s as i,t as a}from"./utils-DQTbg3yF.js";import o from"node:fs/promises";import s from"node:path";import c from"node:os";try{await l()}catch(t){e(t.message)}async function l(){let e=i(`publish-plan-artifact-id`),r=process.cwd(),a=process.env.RUNNER_TEMP??await o.realpath(c.tmpdir()),l=s.join(a,`changeset-pack-${Date.now()}`);await u(r,{outDir:l,publishPlanPath:e?await d(a,Number(e)):void 0});let p=await n.uploadArtifact(`changeset-pack-${Date.now()}`,await f(l),l,{retentionDays:30});if(p.id===void 0)throw Error(`Packed artifact upload did not return an artifact id`);t(`pack-dir-artifact-id`,String(p.id))}async function u(e,t){let n=[`pack`,`--out-dir`,t.outDir];t.publishPlanPath&&n.push(`--from-publish-plan`,t.publishPlanPath),await r(n,{cwd:e,env:process.env})}async function d(e,t){let n=await a(e,t,`changeset-publish-plan`);return s.join(n,`publish-plan.json`)}async function f(e){let t=await o.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let n=s.join(e,t.name);return t.isDirectory()?f(n):[n]}))).flat()}export{};
+1
View File
@@ -0,0 +1 @@
import{_ as e,c as t,g as n,l as r,v as i}from"./get-packages.cjs-Dvdg-NAr.js";import{c as a,s as o}from"./utils-DQTbg3yF.js";try{await s()}catch(t){e(t.message)}async function s(){let e=t.payload.pull_request;if(!e)throw Error("This action should only be run on `pull_request_target` or `pull_request` events");let s=a(`github-token`),l=a(`body`),u=o(`update-id`),d=u?c(u):null,f=d?`${d}\n\n${l}`:l,p={repo:e.base.repo.name,owner:e.base.repo.owner.login,issue_number:e.number,body:f},m=r(s),h;d&&(n(`Checking for existing comment...`),h=await m.rest.issues.listComments({repo:e.base.repo.name,owner:e.base.repo.owner.login,issue_number:e.number}).then(e=>e.data.find(e=>e.body?.includes(d))?.id)),h?(n(`Updating existing comment (id: ${h})...`),await m.rest.issues.updateComment({...p,comment_id:h}),i(`comment-id`,h)):(n(`Creating new comment...`),i(`comment-id`,(await m.rest.issues.createComment(p)).data.id)),n(`Done!`)}function c(e){let t=`changesets-action-pr-comment`;return t===e?`<!-- ${t} -->`:`<!-- ${t}:${e} -->`}export{};
+39
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{_ as e,m as t,v as n}from"./get-packages.cjs-Dvdg-NAr.js";import{r,t as i}from"./run-Cekyj2rz.js";import{c as a,s as o,t as s}from"./utils-DQTbg3yF.js";import c from"node:fs/promises";import l from"node:os";try{await u()}catch(t){e(t.message)}async function u(){let e=a(`github-token`),u=o(`script`),d=o(`pack-dir-artifact-id`),f=t(`create-github-releases`),p=process.cwd(),m=await i({script:u,github:new r({cwd:p,githubToken:e,commitMode:`github-api`}),createGithubReleases:f,cwd:p,fromPackDir:d?await s(process.env.RUNNER_TEMP??await c.realpath(l.tmpdir()),Number(d),`changeset-pack`):void 0});if(m.published?(n(`published`,`true`),n(`published-packages`,JSON.stringify(m.publishedPackages))):n(`published`,`false`),m.exitCode!==0)throw Error(`Publish command exited with code ${m.exitCode}${m.published?`, but some packages were published: ${m.publishedPackages.map(e=>`${e.name}@${e.version}`).join(`, `)}`:``}`)}export{};
+1
View File
@@ -0,0 +1 @@
import{o as e,t}from"./changesets-read.esm-D6fW_L6x.js";async function n(n=process.cwd()){let r=await e(n),i=await t(n);if(r!==void 0&&r.mode===`pre`){let e=new Set(r.changesets);return{preState:r,changesets:i.filter(t=>!e.has(t.id))}}return{preState:void 0,changesets:i}}export{n as t};
+149
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{_ as e,v as t}from"./get-packages.cjs-Dvdg-NAr.js";import{f as n,n as r}from"./utils-DQTbg3yF.js";import{t as i}from"./readChangesetState-D8jsqLyj.js";import a from"node:fs/promises";import o from"node:path";import s from"node:os";try{await c()}catch(t){e(t.message)}async function c(){let e=await l();if(t(`mode`,e.mode),e.mode===`publish`){let r=await n.uploadArtifact(o.basename(e.publishPlanPath,`.json`),[e.publishPlanPath],o.dirname(e.publishPlanPath),{skipArchive:!0,retentionDays:30});if(r.id===void 0)throw Error(`Publish plan artifact upload did not return an artifact id`);t(`publish-plan-artifact-id`,String(r.id))}}async function l(){let{changesets:e}=await i();if(e.length>0)return e.some(e=>e.releases.length>0)?{mode:`version`}:{mode:`none`};let t=process.cwd(),n=o.join(process.env.RUNNER_TEMP??await a.realpath(s.tmpdir()),`changeset-publish-plan-${Date.now()}`,`publish-plan.json`);return await r([`publish-plan`,`--output`,n],{cwd:t,env:process.env}),(await u(n)).length===0?{mode:`none`}:{mode:`publish`,publishPlanPath:n}}async function u(e){let t;try{t=await a.readFile(e,`utf8`)}catch(t){throw Error(`Failed to read publish plan at ${e}`,{cause:t})}let n;try{n=JSON.parse(t)}catch(t){throw Error(`Failed to parse publish plan at ${e}`,{cause:t})}if(typeof n!=`object`||!n||!(`version`in n)||typeof n.version!=`number`||!(`plan`in n)||!Array.isArray(n.plan))throw Error(`Invalid publish plan at ${e}: expected { version: number; plan: unknown[] }`);return n.plan}export{};
+80
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{_ as e,g as t,m as n,v as r}from"./get-packages.cjs-Dvdg-NAr.js";import{n as i,r as a}from"./run-Cekyj2rz.js";import{c as o,s}from"./utils-DQTbg3yF.js";try{await c()}catch(t){e(t.message)}async function c(){let e=o(`github-token`),c=s(`script`),l=o(`commit-message`),u=o(`pr-title`),d=s(`pr-draft`),f=s(`pr-base-branch`),p=s(`commit-mode`)??`git-cli`,m=n(`setup-git-user`);if(d!==void 0&&d!==`always`&&d!==`create`)throw Error(`Invalid pr-draft input: ${d}`);if(p!==`git-cli`&&p!==`github-api`)throw Error(`Invalid commit-mode input: ${p}`);let h=process.cwd(),g=new a({cwd:h,githubToken:e,commitMode:p});m&&(t(`setting git user`),await g.setupUser());let{pullRequestNumber:_}=await i({script:c,github:g,cwd:h,prTitle:u,commitMessage:l,hasPublishScript:!0,prDraft:d,branch:f});r(`pr-number`,String(_))}export{};
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@changesets/action",
"version": "2.0.0-next.1",
"version": "2.0.0-next.2",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
+68 -18
View File
@@ -1,11 +1,15 @@
import { Buffer } from "node:buffer";
import * as core from "@actions/core";
import { exec, getExecOutput } from "@actions/exec";
import * as github from "@actions/github";
import { context } from "@actions/github";
import { commitChangesFromRepo } from "@changesets/ghcommit/git";
import type { Octokit } from "./octokit.ts";
import { setupOctokit, type Octokit } from "./octokit.ts";
export type CommitMode = "git-cli" | "github-api";
type GitOptions = {
cwd: string;
env?: Record<string, string>;
};
const push = async (branch: string, options: GitOptions) => {
@@ -46,17 +50,51 @@ const checkIfClean = async (options: GitOptions): Promise<boolean> => {
return !stdout.length;
};
export class Git {
readonly octokit: Octokit | null;
export class GitHub {
readonly #githubToken: string;
readonly octokit: Octokit;
readonly cwd: string;
readonly commitMode: CommitMode;
constructor(args: { octokit?: Octokit; cwd: string }) {
this.octokit = args.octokit ?? null;
this.cwd = args.cwd;
constructor(options: {
githubToken: string;
cwd: string;
commitMode?: CommitMode;
}) {
this.#githubToken = options.githubToken;
this.cwd = options.cwd;
this.commitMode = options.commitMode ?? "git-cli";
this.octokit = setupOctokit(options.githubToken);
}
getToken() {
return this.#githubToken;
}
#getCliAuthEnv(): Record<string, string> {
const basic = Buffer.from(`x-access-token:${this.#githubToken}`).toString(
"base64",
);
const serverUrl = (
context.serverUrl ??
process.env.GITHUB_SERVER_URL ??
"https://github.com"
).replace(/\/+$/, "");
const gitConfigCount = Number(process.env.GIT_CONFIG_COUNT ?? 0);
if (!Number.isInteger(gitConfigCount) || gitConfigCount < 0) {
throw new Error(
`Invalid GIT_CONFIG_COUNT value: ${process.env.GIT_CONFIG_COUNT}`,
);
}
return {
GIT_CONFIG_COUNT: String(gitConfigCount + 1),
[`GIT_CONFIG_KEY_${gitConfigCount}`]: `http.${serverUrl}/.extraheader`,
[`GIT_CONFIG_VALUE_${gitConfigCount}`]: `AUTHORIZATION: basic ${basic}`,
};
}
async setupUser() {
if (this.octokit) {
if (this.commitMode === "github-api") {
return;
}
await exec("git", ["config", "user.name", `"github-actions[bot]"`], {
@@ -76,32 +114,38 @@ export class Git {
}
async pushTag(tag: string) {
if (this.octokit) {
if (this.commitMode === "github-api") {
return this.octokit.rest.git
.createRef({
...github.context.repo,
...context.repo,
ref: `refs/tags/${tag}`,
sha: github.context.sha,
sha: context.sha,
})
.catch((err) => {
// Assuming tag was manually pushed in custom publish script
core.warning(`Failed to create tag ${tag}: ${err.message}`);
});
}
await exec("git", ["push", "origin", tag], { cwd: this.cwd });
await exec("git", ["push", "origin", tag], {
cwd: this.cwd,
env: {
...process.env,
...this.#getCliAuthEnv(),
} as Record<string, string>,
});
}
async prepareBranch(branch: string) {
if (this.octokit) {
if (this.commitMode === "github-api") {
// Preparing a new local branch is not necessary when using the API
return;
}
await switchToMaybeExistingBranch(branch, { cwd: this.cwd });
await reset(github.context.sha, { cwd: this.cwd });
await reset(context.sha, { cwd: this.cwd });
}
async pushChanges({ branch, message }: { branch: string; message: string }) {
if (this.octokit) {
if (this.commitMode === "github-api") {
/**
* Only add files form the current working directory
*
@@ -111,11 +155,11 @@ export class Git {
const addFromDirectory = this.cwd;
return commitChangesFromRepo({
octokit: this.octokit,
...github.context.repo,
...context.repo,
branch,
message,
base: {
commit: github.context.sha,
commit: context.sha,
},
cwd: this.cwd,
force: true,
@@ -124,6 +168,12 @@ export class Git {
if (!(await checkIfClean({ cwd: this.cwd }))) {
await commitAll(message, { cwd: this.cwd });
}
await push(branch, { cwd: this.cwd });
await push(branch, {
cwd: this.cwd,
env: {
...process.env,
...this.#getCliAuthEnv(),
} as Record<string, string>,
});
}
}
+7 -19
View File
@@ -1,7 +1,6 @@
import fs from "node:fs/promises";
import * as core from "@actions/core";
import { Git } from "./git.ts";
import { setupOctokit } from "./octokit.ts";
import { GitHub } from "./github.ts";
import readChangesetState from "./readChangesetState.ts";
import { runPublish, runVersion } from "./run.ts";
import { fileExists, getOptionalInput } from "./utils.ts";
@@ -19,7 +18,6 @@ import { fileExists, getOptionalInput } from "./utils.ts";
// If the user needs to change the cwd, set `working-directory` in the step instead
const cwd = process.cwd();
const octokit = setupOctokit(githubToken);
const commitMode = getOptionalInput("commitMode") ?? "git-cli";
const prDraft = getOptionalInput("prDraft");
if (commitMode !== "git-cli" && commitMode !== "github-api") {
@@ -30,24 +28,19 @@ import { fileExists, getOptionalInput } from "./utils.ts";
core.setFailed(`Invalid prDraft: ${prDraft}`);
return;
}
const git = new Git({
octokit: commitMode === "github-api" ? octokit : undefined,
const github = new GitHub({
cwd,
githubToken,
commitMode,
});
let setupGitUser = core.getBooleanInput("setupGitUser");
if (setupGitUser) {
core.info("setting git user");
await git.setupUser();
await github.setupUser();
}
core.info("setting GitHub credentials");
await fs.writeFile(
`${process.env.HOME}/.netrc`,
`machine github.com\nlogin github-actions[bot]\npassword ${githubToken}`,
);
let { changesets } = await readChangesetState(cwd);
let publishScript = core.getInput("publish");
@@ -119,9 +112,7 @@ import { fileExists, getOptionalInput } from "./utils.ts";
const result = await runPublish({
script: publishScript,
githubToken,
git,
octokit,
github,
createGithubReleases: core.getBooleanInput("createGithubReleases"),
cwd,
});
@@ -152,12 +143,9 @@ import { fileExists, getOptionalInput } from "./utils.ts";
core.info("All changesets are empty; not creating PR");
return;
case hasChangesets: {
const octokit = setupOctokit(githubToken);
const { pullRequestNumber } = await runVersion({
script: getOptionalInput("version"),
githubToken,
git,
octokit,
github,
cwd,
prTitle: getOptionalInput("title"),
commitMessage: getOptionalInput("commit"),
+4 -8
View File
@@ -1,8 +1,7 @@
import fs from "node:fs/promises";
import os from "node:os";
import * as core from "@actions/core";
import { Git } from "../git.ts";
import { setupOctokit } from "../octokit.ts";
import { GitHub } from "../github.ts";
import { runPublish } from "../run.ts";
import {
downloadArtifact,
@@ -25,9 +24,8 @@ async function main() {
// If the user needs to change the cwd, set `working-directory` in the step instead
const cwd = process.cwd();
const octokit = setupOctokit(githubToken);
// NOTE: Always pass octokit here as publish does not need a commit-mode
const git = new Git({ octokit, cwd });
// NOTE: Always use API mode here as publish does not need a commit-mode.
const github = new GitHub({ cwd, githubToken, commitMode: "github-api" });
const fromPackDir = packDirArtifactId
? await downloadArtifact(
@@ -39,9 +37,7 @@ async function main() {
const result = await runPublish({
script,
githubToken,
git,
octokit,
github,
createGithubReleases,
cwd,
fromPackDir,
+16 -27
View File
@@ -3,8 +3,7 @@ import type { Changeset } from "@changesets/types";
import writeChangeset from "@changesets/write";
import { createFixture } from "fs-fixture";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { Git } from "./git.ts";
import { setupOctokit } from "./octokit.ts";
import { GitHub } from "./github.ts";
import { runVersion } from "./run.ts";
vi.mock("@actions/github", () => ({
@@ -21,7 +20,6 @@ vi.mock("@actions/github", () => ({
graphql: mockedGraphql,
}),
}));
vi.mock("./git.ts");
vi.mock("@changesets/ghcommit/git");
let mockedGithubMethods = {
@@ -91,6 +89,13 @@ const writeChangesets = (changesets: Changeset[], cwd: string) => {
return Promise.all(changesets.map((commit) => writeChangeset(commit, cwd)));
};
const createGithub = (cwd: string) =>
new GitHub({
cwd,
githubToken: "@@GITHUB_TOKEN",
commitMode: "github-api",
});
beforeEach(() => {
vi.clearAllMocks();
});
@@ -126,9 +131,7 @@ describe("version", () => {
);
await runVersion({
octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
github: createGithub(cwd),
cwd,
});
@@ -161,9 +164,7 @@ describe("version", () => {
);
await runVersion({
octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
github: createGithub(cwd),
cwd,
prDraft: "create",
});
@@ -197,9 +198,7 @@ describe("version", () => {
);
await runVersion({
octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
github: createGithub(cwd),
cwd,
});
@@ -232,9 +231,7 @@ describe("version", () => {
);
await runVersion({
octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
github: createGithub(cwd),
cwd,
});
@@ -287,9 +284,7 @@ fluminis divesque vulnere aquis parce lapsis rabie si visa fulmineis.
);
await runVersion({
octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
github: createGithub(cwd),
cwd,
prBodyMaxCharacters: 1000,
});
@@ -346,9 +341,7 @@ fluminis divesque vulnere aquis parce lapsis rabie si visa fulmineis.
);
await runVersion({
octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
github: createGithub(cwd),
cwd,
prBodyMaxCharacters: 500,
});
@@ -383,9 +376,7 @@ fluminis divesque vulnere aquis parce lapsis rabie si visa fulmineis.
);
await runVersion({
octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
github: createGithub(cwd),
cwd,
prDraft: "create",
});
@@ -417,9 +408,7 @@ fluminis divesque vulnere aquis parce lapsis rabie si visa fulmineis.
);
await runVersion({
octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
github: createGithub(cwd),
cwd,
prDraft: "always",
});
+22 -25
View File
@@ -7,10 +7,10 @@ import {
type ExecOptions,
type ExecOutput,
} from "@actions/exec";
import * as github from "@actions/github";
import { context } from "@actions/github";
import type { PreState } from "@changesets/types";
import { type Package, getPackages } from "@manypkg/get-packages";
import { Git } from "./git.ts";
import type { GitHub } from "./github.ts";
import type { Octokit } from "./octokit.ts";
import readChangesetState from "./readChangesetState.ts";
import {
@@ -57,17 +57,15 @@ const createRelease = async (
tag_name: tagName,
body: changelogEntry.content,
prerelease: pkg.packageJson.version.includes("-"),
...github.context.repo,
...context.repo,
});
};
type PublishOptions = {
script?: string;
fromPackDir?: string;
githubToken: string;
octokit: Octokit;
createGithubReleases: boolean;
git: Git;
github: GitHub;
cwd: string;
};
@@ -87,17 +85,16 @@ type PublishResult =
export async function runPublish({
script,
fromPackDir,
githubToken,
git,
octokit,
github,
createGithubReleases,
cwd,
}: PublishOptions): Promise<PublishResult> {
const { octokit } = github;
let changesetPublishOutput: ExecOutput;
const execOptions: ExecOptions = {
cwd,
ignoreReturnCode: true,
env: { ...process.env, GITHUB_TOKEN: githubToken },
env: { ...process.env, GITHUB_TOKEN: github.getToken() },
};
if (script) {
@@ -144,7 +141,7 @@ export async function runPublish({
await Promise.all(
releasedPackages.map(async (pkg) => {
const tagName = `${pkg.packageJson.name}@${pkg.packageJson.version}`;
await git.pushTag(tagName);
await github.pushTag(tagName);
await createRelease(octokit, { pkg, tagName });
}),
);
@@ -166,7 +163,7 @@ export async function runPublish({
releasedPackages.push(pkg);
if (createGithubReleases) {
const tagName = `v${pkg.packageJson.version}`;
await git.pushTag(tagName);
await github.pushTag(tagName);
await createRelease(octokit, { pkg, tagName });
}
break;
@@ -259,9 +256,7 @@ export async function getVersionPrBody({
type VersionOptions = {
script?: string;
githubToken: string;
git: Git;
octokit: Octokit;
github: GitHub;
cwd?: string;
prTitle?: string;
commitMessage?: string;
@@ -277,26 +272,25 @@ type RunVersionResult = {
export async function runVersion({
script,
githubToken,
git,
octokit,
github,
cwd = process.cwd(),
prTitle = "Version Packages",
commitMessage = "Version Packages",
hasPublishScript = false,
prBodyMaxCharacters = MAX_CHARACTERS_PER_MESSAGE,
branch = github.context.ref.replace("refs/heads/", ""),
branch = context.ref.replace("refs/heads/", ""),
prDraft,
}: VersionOptions): Promise<RunVersionResult> {
const { octokit } = github;
let versionBranch = `changeset-release/${branch}`;
let { preState } = await readChangesetState(cwd);
await git.prepareBranch(versionBranch);
await github.prepareBranch(versionBranch);
let versionsByDirectory = await getVersionsByDirectory(cwd);
const env = { ...process.env, GITHUB_TOKEN: githubToken };
const env = { ...process.env, GITHUB_TOKEN: github.getToken() };
if (script) {
await exec(script, undefined, { cwd, env });
@@ -335,9 +329,9 @@ export async function runVersion({
* which GitHub will then react to by closing the PRs)
*/
const existingPullRequests = await octokit.rest.pulls.list({
...github.context.repo,
...context.repo,
state: "open",
head: `${github.context.repo.owner}:${versionBranch}`,
head: `${context.repo.owner}:${versionBranch}`,
base: branch,
});
core.info(
@@ -348,7 +342,10 @@ export async function runVersion({
)}`,
);
await git.pushChanges({ branch: versionBranch, message: finalCommitMessage });
await github.pushChanges({
branch: versionBranch,
message: finalCommitMessage,
});
const changedPackagesInfo = (await changedPackagesInfoPromises)
.filter((x) => x)
@@ -370,7 +367,7 @@ export async function runVersion({
title: finalPrTitle,
body: prBody,
draft: prDraft !== undefined,
...github.context.repo,
...context.repo,
});
return {
+9 -9
View File
@@ -1,6 +1,5 @@
import * as core from "@actions/core";
import { Git } from "../git.ts";
import { setupOctokit } from "../octokit.ts";
import { GitHub } from "../github.ts";
import { runVersion } from "../run.ts";
import { getOptionalInput, getRequiredInput } from "../utils.ts";
@@ -24,26 +23,27 @@ async function main() {
if (prDraft !== undefined && prDraft !== "always" && prDraft !== "create") {
throw new Error(`Invalid pr-draft input: ${prDraft}`);
}
if (commitMode !== "git-cli" && commitMode !== "github-api") {
throw new Error(`Invalid commit-mode input: ${commitMode}`);
}
// If the user needs to change the cwd, set `working-directory` in the step instead
const cwd = process.cwd();
const octokit = setupOctokit(githubToken);
const git = new Git({
octokit: commitMode === "github-api" ? octokit : undefined,
const github = new GitHub({
cwd,
githubToken,
commitMode,
});
if (setupGitUser) {
core.info("setting git user");
await git.setupUser();
await github.setupUser();
}
const { pullRequestNumber } = await runVersion({
script,
githubToken,
git,
octokit,
github,
cwd,
prTitle,
commitMessage,