mirror of
https://github.com/changesets/action
synced 2026-10-26 16:39:56 +08:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2d9f7af640 |
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+1
@@ -0,0 +1 @@
|
||||
import{A as e,D as t,E as n,O as r,f as i,j as a,k as o,m as s,o as c,p as l,s as u}from"./utils-C998F5Ty.js";import{n as d,r as f,t as p}from"./run-CZ7g-nsG.js";import{t as m}from"./readChangesetState-B7K4vGsO.js";(async()=>{let h=process.cwd();await s(h),l({publish:`publish-script`,version:`version-script`,commit:`commit-mesage`,title:`pr-title`,branch:`pr-base-branch`,prDraft:`pr-draft`,createGithubReleases:`create-github-releases`}),i();let g=u(`github-token`);if(process.env.GITHUB_TOKEN&&process.env.GITHUB_TOKEN!==g)throw Error(`The GITHUB_TOKEN environment variable is set and does not match the "github-token" input. Please pass the custom GitHub token to the "github-token" input and remove the GITHUB_TOKEN environment variable to avoid conflicts.`);let _=t(`push-with-git-cli`),v=c(`pr-draft`);if(v!==void 0&&v!==`always`&&v!==`create`){e(`Invalid pr-draft: ${v}`);return}let y=new f({cwd:h,githubToken:g,pushWithGitCli:_}),{changesets:b}=await m(h),x=r(`publish-script`),S=b.length!==0,C=b.some(e=>e.releases.length>0),w=!!x;switch(a(`published`,`false`),a(`published-packages`,`[]`),a(`has-changesets`,String(S)),!0){case!S&&!w:o(`No changesets present or were removed by merging release PR. Not publishing because no publish script found.`);return;case!S&&w:{o(`No changesets found. Attempting to publish any unpublished packages to npm`);let e=t(`create-github-releases`),r=t(`push-git-tags`);if(e&&!r)throw Error(`The input 'create-github-releases' is set to true, but 'push-git-tags' is set to false. Creating GitHub releases requires pushing git tags. Please set 'push-git-tags' to true or set 'create-github-releases' to false.`);let i=await p({script:x,github:y,createGithubReleases:e,pushGitTags:r,cwd:h});i.published&&(a(`published`,`true`),a(`published-packages`,JSON.stringify(i.publishedPackages))),i.exitCode!==0&&(n(`Publish command exited with code ${i.exitCode}${i.published?`, but some packages were published: ${i.publishedPackages.map(e=>`${e.name}@${e.version}`).join(`, `)}`:``}`),process.exit(i.exitCode));return}case S&&!C:o(`All changesets are empty; not creating PR`);return;case S:{let{pullRequestNumber:e}=await d({script:c(`version-script`),github:y,cwd:h,prTitle:c(`pr-title`),commitMessage:c(`commit-message`),hasPublishScript:w,prDraft:v,branch:c(`pr-base-branch`)});a(`pr-number`,String(e));return}}})().catch(t=>{n(t),e(t.message)});export{};
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
import{A as e,j as t,m as n,n as r,o as i,t as a,y as o}from"./utils-C998F5Ty.js";import s from"node:fs/promises";import c from"node:path";import l from"node:os";try{await u()}catch(t){e(t.message)}async function u(){let e=process.cwd();await n(e);let r=i(`publish-plan-artifact-id`),a=process.env.RUNNER_TEMP??await s.realpath(l.tmpdir()),u=c.join(a,`changeset-pack-${Date.now()}`);await d(e,{outDir:u,publishPlanPath:r?await f(a,Number(r)):void 0});let m=await o.uploadArtifact(`changeset-pack-${Date.now()}`,await p(u),u,{retentionDays:30});if(m.id===void 0)throw Error(`Packed artifact upload did not return an artifact id`);t(`pack-dir-artifact-id`,String(m.id))}async function d(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 f(e,t){let n=await a(e,t,`changeset-publish-plan`);return c.join(n,`publish-plan.json`)}async function p(e){let t=await s.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let n=c.join(e,t.name);return t.isDirectory()?p(n):[n]}))).flat()}export{};
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
import{A as e,T as t,j as n,k as r,o as i,s as a,w as o}from"./utils-C998F5Ty.js";try{await s()}catch(t){e(t.message)}async function s(){let e=o.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=i(`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=t(s),h;d&&(r(`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?(r(`Updating existing comment (id: ${h})...`),await m.rest.issues.updateComment({...p,comment_id:h}),n(`comment-id`,h)):(r(`Creating new comment...`),n(`comment-id`,(await m.rest.issues.createComment(p)).data.id)),r(`Done!`)}function c(e){let t=`changesets-action-pr-comment`;return t===e?`<!-- ${t} -->`:`<!-- ${t}:${e} -->`}export{};
|
||||
Vendored
+38
File diff suppressed because one or more lines are too long
Vendored
+1
@@ -0,0 +1 @@
|
||||
import{A as e,D as t,j as n,m as r,o as i,s as a,t as o}from"./utils-C998F5Ty.js";import{r as s,t as c}from"./run-CZ7g-nsG.js";import l from"node:fs/promises";import u from"node:os";try{await d()}catch(t){e(t.message)}async function d(){let e=process.cwd();await r(e);let d=a(`github-token`),f=i(`script`),p=i(`pack-dir-artifact-id`),m=t(`create-github-releases`),h=t(`push-git-tags`);if(m&&!h)throw Error(`The input 'create-github-releases' is set to true, but 'push-git-tags' is set to false. Creating GitHub releases requires pushing git tags. Please set 'push-git-tags' to true or set 'create-github-releases' to false.`);let g=await c({script:f,github:new s({cwd:e,githubToken:d}),createGithubReleases:m,pushGitTags:h,cwd:e,fromPackDir:p?await o(process.env.RUNNER_TEMP??await l.realpath(u.tmpdir()),Number(p),`changeset-pack`):void 0});if(g.published?(n(`published`,`true`),n(`published-packages`,JSON.stringify(g.publishedPackages))):n(`published`,`false`),g.exitCode!==0)throw Error(`Publish command exited with code ${g.exitCode}${g.published?`, but some packages were published: ${g.publishedPackages.map(e=>`${e.name}@${e.version}`).join(`, `)}`:``}`)}export{};
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
import{i as e,t}from"./dist-BMR3FRaJ.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};
|
||||
Vendored
+98
File diff suppressed because one or more lines are too long
Vendored
+1
@@ -0,0 +1 @@
|
||||
import{A as e,j as t,m as n,n as r,y as i}from"./utils-C998F5Ty.js";import{t as a}from"./readChangesetState-B7K4vGsO.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=process.cwd();await n(e);let r=await u(e);if(t(`mode`,r.mode),r.mode===`publish`){let e=await i.uploadArtifact(s.basename(r.publishPlanPath,`.json`),[r.publishPlanPath],s.dirname(r.publishPlanPath),{skipArchive:!0,retentionDays:30});if(e.id===void 0)throw Error(`Publish plan artifact upload did not return an artifact id`);t(`publish-plan-artifact-id`,String(e.id))}}async function u(e){let{changesets:t}=await a(e);if(t.length>0)return t.some(e=>e.releases.length>0)?{mode:`version`}:{mode:`none`};let n=s.join(process.env.RUNNER_TEMP??await o.realpath(c.tmpdir()),`changeset-publish-plan-${Date.now()}`,`publish-plan.json`);return await r([`publish-plan`,`--output`,n],{cwd:e,env:process.env}),(await d(n)).length===0?{mode:`none`}:{mode:`publish`,publishPlanPath:n}}async function d(e){let t;try{t=await o.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{};
|
||||
Vendored
+224
File diff suppressed because one or more lines are too long
Vendored
+1
@@ -0,0 +1 @@
|
||||
import{A as e,D as t,f as n,j as r,m as i,o as a,s as o}from"./utils-C998F5Ty.js";import{n as s,r as c}from"./run-CZ7g-nsG.js";try{await l()}catch(t){e(t.message)}async function l(){let e=process.cwd();await i(e),n();let l=o(`github-token`),u=a(`script`),d=o(`commit-message`),f=o(`pr-title`),p=a(`pr-draft`),m=a(`pr-base-branch`),h=t(`push-with-git-cli`);if(p!==void 0&&p!==`always`&&p!==`create`)throw Error(`Invalid pr-draft input: ${p}`);let{pullRequestNumber:g}=await s({script:u,github:new c({cwd:e,githubToken:l,pushWithGitCli:h}),cwd:e,prTitle:f,commitMessage:d,hasPublishScript:!0,prDraft:p,branch:m});r(`pr-number`,String(g))}export{};
|
||||
+22
-35
@@ -1,15 +1,11 @@
|
||||
import { Buffer } from "node:buffer";
|
||||
import path from "node:path";
|
||||
import { exec, getExecOutput } from "@actions/exec";
|
||||
import major from "semver/functions/major.js";
|
||||
import prerelease from "semver/functions/prerelease.js";
|
||||
import { exec } from "@actions/exec";
|
||||
import pkgJson from "../package.json" with { type: "json" };
|
||||
|
||||
const tag = `v${pkgJson.version}`;
|
||||
const prereleaseTag = prerelease(pkgJson.version)?.[0];
|
||||
const releaseLine = `v${major(pkgJson.version)}${
|
||||
prereleaseTag === undefined ? "" : `-${prereleaseTag}`
|
||||
}`;
|
||||
const releaseLine = `v${pkgJson.version.split(".")[0]}`;
|
||||
const isPrerelease = pkgJson.version.includes("-");
|
||||
const githubToken = process.env.GITHUB_TOKEN;
|
||||
if (!githubToken) {
|
||||
throw new Error("GITHUB_TOKEN is required");
|
||||
@@ -25,36 +21,27 @@ const gitEnv = {
|
||||
process.chdir(path.join(import.meta.dirname, ".."));
|
||||
|
||||
await exec("git", ["checkout", "--detach"]);
|
||||
// Stable timestamps make retries produce the same commit when dist is unchanged.
|
||||
const { stdout } = await getExecOutput("git", [
|
||||
"show",
|
||||
"--no-patch",
|
||||
"--format=%cI",
|
||||
"HEAD",
|
||||
]);
|
||||
const commitDate = stdout.trim();
|
||||
await exec("git", ["add", "--force", "dist"]);
|
||||
await exec("git", ["commit", "-m", tag], {
|
||||
env: {
|
||||
...process.env,
|
||||
GIT_AUTHOR_DATE: commitDate,
|
||||
GIT_COMMITTER_DATE: commitDate,
|
||||
},
|
||||
});
|
||||
await exec("git", ["commit", "-m", tag]);
|
||||
|
||||
await exec("changeset", ["git-tag"]);
|
||||
|
||||
await exec(
|
||||
"git",
|
||||
[
|
||||
"push",
|
||||
"--force",
|
||||
// The action pushes tags through the API; override any push.followTags config.
|
||||
"--no-follow-tags",
|
||||
"origin",
|
||||
`HEAD:refs/heads/${releaseLine}`,
|
||||
],
|
||||
{
|
||||
if (isPrerelease) {
|
||||
await exec("git", ["push", "origin", `refs/tags/${tag}`], {
|
||||
env: gitEnv,
|
||||
},
|
||||
);
|
||||
});
|
||||
} else {
|
||||
await exec(
|
||||
"git",
|
||||
[
|
||||
"push",
|
||||
"--force",
|
||||
"--follow-tags",
|
||||
"origin",
|
||||
`HEAD:refs/heads/${releaseLine}`,
|
||||
],
|
||||
{
|
||||
env: gitEnv,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
+8
-61
@@ -1,4 +1,3 @@
|
||||
import assert from "node:assert/strict";
|
||||
import { Buffer } from "node:buffer";
|
||||
import * as core from "@actions/core";
|
||||
import { exec, getExecOutput } from "@actions/exec";
|
||||
@@ -68,19 +67,6 @@ function getHttpUrl(remoteUrl: string): string | undefined {
|
||||
}
|
||||
}
|
||||
|
||||
function isAlreadyExistingRefError(error: unknown) {
|
||||
return (
|
||||
typeof error === "object" &&
|
||||
error !== null &&
|
||||
"status" in error &&
|
||||
"message" in error &&
|
||||
typeof error.status === "number" &&
|
||||
typeof error.message === "string" &&
|
||||
error.status === 422 &&
|
||||
error.message.includes("Reference already exists")
|
||||
);
|
||||
}
|
||||
|
||||
export class GitHub {
|
||||
readonly #githubToken: string;
|
||||
readonly octokit: Octokit;
|
||||
@@ -226,57 +212,18 @@ export class GitHub {
|
||||
);
|
||||
}
|
||||
|
||||
async #getRemoteTagCommit(tag: string) {
|
||||
const { data: ref } = await this.octokit.rest.git.getRef({
|
||||
...context.repo,
|
||||
ref: `tags/${tag}`,
|
||||
});
|
||||
let target: { type: string; sha: string } = ref.object;
|
||||
while (target.type === "tag") {
|
||||
const { data: tagObject } = await this.octokit.rest.git.getTag({
|
||||
...context.repo,
|
||||
tag_sha: target.sha,
|
||||
});
|
||||
target = tagObject.object;
|
||||
}
|
||||
assert.equal(
|
||||
target.type,
|
||||
"commit",
|
||||
`Tag ${tag} points to a ${target.type}, not a commit`,
|
||||
);
|
||||
return target.sha;
|
||||
}
|
||||
|
||||
async pushTag(tag: string, commit = context.sha) {
|
||||
async pushTag(tag: string) {
|
||||
if (!this.pushWithGitCli) {
|
||||
try {
|
||||
const { data: tagObject } = await this.octokit.rest.git.createTag({
|
||||
...context.repo,
|
||||
tag,
|
||||
message: tag,
|
||||
object: commit,
|
||||
type: "commit",
|
||||
});
|
||||
await this.octokit.rest.git.createRef({
|
||||
return this.octokit.rest.git
|
||||
.createRef({
|
||||
...context.repo,
|
||||
ref: `refs/tags/${tag}`,
|
||||
sha: tagObject.sha,
|
||||
sha: context.sha,
|
||||
})
|
||||
.catch((err) => {
|
||||
// Assuming tag was manually pushed in custom publish script
|
||||
core.warning(`Failed to create tag ${tag}: ${err.message}`);
|
||||
});
|
||||
} catch (err) {
|
||||
if (isAlreadyExistingRefError(err)) {
|
||||
const remoteCommit = await this.#getRemoteTagCommit(tag);
|
||||
assert.equal(
|
||||
remoteCommit,
|
||||
commit,
|
||||
`Tag ${tag} points to commit ${remoteCommit}, expected ${commit}`,
|
||||
);
|
||||
// The tag was likely pushed by a custom publish script.
|
||||
core.info(`Tag ${tag} already exists`);
|
||||
return;
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
return;
|
||||
}
|
||||
await exec("git", ["push", "origin", tag], {
|
||||
cwd: this.cwd,
|
||||
|
||||
+3
-55
@@ -1,5 +1,3 @@
|
||||
import assert from "node:assert/strict";
|
||||
import { Buffer } from "node:buffer";
|
||||
import { randomUUID } from "node:crypto";
|
||||
import fs from "node:fs/promises";
|
||||
import os from "node:os";
|
||||
@@ -157,45 +155,6 @@ async function readChangesetsOutput(outputPath: string) {
|
||||
return events;
|
||||
}
|
||||
|
||||
type Release = {
|
||||
pkg: Package;
|
||||
tag: string;
|
||||
commit?: string;
|
||||
};
|
||||
|
||||
async function getTagCommits(cwd: string, tags: string[]) {
|
||||
if (tags.length === 0) {
|
||||
return [];
|
||||
}
|
||||
const refs = tags.map((tag) => `refs/tags/${tag}^{}`);
|
||||
const { stdout } = await getExecOutput(
|
||||
"git",
|
||||
["cat-file", "--batch-check=%(objectname) %(objecttype)"],
|
||||
{
|
||||
cwd,
|
||||
input: Buffer.from(`${refs.join("\n")}\n`),
|
||||
},
|
||||
);
|
||||
const lines = stdout.trim().split(/\r?\n/);
|
||||
assert.equal(
|
||||
lines.length,
|
||||
tags.length,
|
||||
"Git returned an unexpected number of tag targets",
|
||||
);
|
||||
return lines.map((line, index) => {
|
||||
if (line === `${refs[index]} missing`) {
|
||||
return undefined;
|
||||
}
|
||||
const [commit, type] = line.split(" ");
|
||||
assert.equal(
|
||||
type,
|
||||
"commit",
|
||||
`Tag ${tags[index]} does not point to a commit`,
|
||||
);
|
||||
return commit;
|
||||
});
|
||||
}
|
||||
|
||||
export async function runPublish({
|
||||
script,
|
||||
fromPackDir,
|
||||
@@ -255,7 +214,7 @@ export async function runPublish({
|
||||
);
|
||||
output = [];
|
||||
}
|
||||
let releases: Release[] = output.map((event) => {
|
||||
let releases = output.map((event) => {
|
||||
let pkg = packagesByName.get(event.packageName);
|
||||
if (pkg === undefined) {
|
||||
throw new Error(
|
||||
@@ -273,22 +232,11 @@ export async function runPublish({
|
||||
);
|
||||
}
|
||||
|
||||
if (pushGitTags) {
|
||||
const commits = await getTagCommits(
|
||||
cwd,
|
||||
releases.map(({ tag }) => tag),
|
||||
);
|
||||
releases = releases.map((release, index) => ({
|
||||
...release,
|
||||
commit: commits[index],
|
||||
}));
|
||||
}
|
||||
|
||||
if (createGithubReleases || pushGitTags) {
|
||||
await Promise.all(
|
||||
releases.map(async ({ pkg, tag, commit }) => {
|
||||
releases.map(async ({ pkg, tag }) => {
|
||||
if (pushGitTags) {
|
||||
await github.pushTag(tag, commit);
|
||||
await github.pushTag(tag);
|
||||
}
|
||||
if (createGithubReleases) {
|
||||
await createRelease(octokit, { pkg, tagName: tag });
|
||||
|
||||
Reference in New Issue
Block a user