From d8d55467a3a890e9c1a42ad0293d9800583e1975 Mon Sep 17 00:00:00 2001 From: Thomas Boop <52323235+thboop@users.noreply.github.com> Date: Mon, 4 Nov 2019 14:40:15 -0500 Subject: [PATCH 01/18] Revert "Upgrade checkout to v1.1.0 to better support scripting git. (#56)" This reverts commit 0b496e91ec7ae4428c3ed2eeb4c3a40df431f2cc. --- .github/workflows/test.yml | 18 ----------------- README.md | 41 ++++++-------------------------------- action.yml | 2 +- 3 files changed, 7 insertions(+), 54 deletions(-) delete mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index bc481cb..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: "test-local" -on: - pull_request: - push: - branches: - - master - - 'releases/*' - -jobs: - test: - strategy: - matrix: - os: [windows-latest, ubuntu-latest, macOS-latest] - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@master - - uses: ./ - - run: git ls-remote --tags origin diff --git a/README.md b/README.md index fd5c031..2847aee 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,4 @@ -

- GitHub Actions status -

- -# Checkout +# checkout This action checks out your repository to `$GITHUB_WORKSPACE`, so that your workflow can access the contents of your repository. @@ -17,48 +13,23 @@ Basic: ```yaml steps: -- uses: actions/checkout@v1 -- uses: actions/setup-node@v1 +- uses: actions/checkout@master +- uses: actions/setup-node@master with: node-version: 10.x - run: npm install - run: npm test ``` -By default, the branch or tag ref that triggered the workflow will be checked out, `${{ github.token }}` will be used for any Git server authentication. If you wish to check out a different branch, a different repository or use different token to checkout, specify that using `with.ref`, `with.repository` and `with.token`: +By default, the branch or tag ref that triggered the workflow will be checked out. If you wish to check out a different branch, specify that using `with.ref`: -Checkout different branch from the workflow repository: ```yaml -- uses: actions/checkout@v1 +- uses: actions/checkout@master with: ref: some-branch ``` -Checkout different private repository: -```yaml -- uses: actions/checkout@v1 - with: - repository: myAccount/myRepository - ref: refs/heads/release - token: ${{ secrets.GitHub_PAT }} // `GitHub_PAT` is a secret contains your PAT. -``` - -Checkout private submodules: -```yaml -- uses: actions/checkout@v1 - with: - submodules: recursive - token: ${{ secrets.GitHub_PAT }} // `GitHub_PAT` is a secret contains your PAT. -``` -> - `with.token` will be used as `Basic` authentication header for https requests talk to https://github.com from `git(.exe)`, ensure those private submodules are configured via `https` not `ssh`. -> - `${{ github.token }}` only has permission to the workflow triggering repository. If the repository contains any submodules that comes from private repository, you will have to add your PAT as secret and use the secret in `with.token` to make `checkout` action work. - -For more details, see [Contexts and expression syntax for GitHub Actions](https://help.github.com/en/articles/contexts-and-expression-syntax-for-github-actions) and [Creating and using secrets (encrypted variables)](https://help.github.com/en/articles/virtual-environments-for-github-actions#creating-and-using-secrets-encrypted-variables) - -# Changelog - -## v1.1.0 (unreleased) -- Persist `with.token` or `${{ github.token }}` into checkout repository's git config as `http.https://github.com/.extraheader=AUTHORIZATION: basic ***` to better support scripting git +For more details, see [Contexts and expression syntax for GitHub Actions](https://help.github.com/en/articles/contexts-and-expression-syntax-for-github-actions) # License diff --git a/action.yml b/action.yml index 7562254..2b080c8 100644 --- a/action.yml +++ b/action.yml @@ -20,4 +20,4 @@ inputs: description: 'Optional path to check out source code' runs: # Plugins live on the runner and are only available to a certain set of first party actions. - plugin: 'checkoutV1_1' + plugin: 'checkout' From cd866a98fbf90f0c35f81de563bdd40b4155e4ff Mon Sep 17 00:00:00 2001 From: John Hill Date: Fri, 21 Oct 2022 11:06:00 -0700 Subject: [PATCH 02/18] Improve multi-repo checkout behavior --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index ddfc7ee..3170258 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,8 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl ## Checkout multiple repos (nested) +Note: the checkout order must be primary _then_ secondary repo checkout. + ```yaml - name: Checkout uses: actions/checkout@v3 @@ -171,6 +173,8 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl ## Checkout multiple repos (private) +Note: the checkout order must be primary _then_ secondary repo checkout. + ```yaml - name: Checkout uses: actions/checkout@v3 From 14f3cf06db736c5444f685ded9e6043adbbb4c5e Mon Sep 17 00:00:00 2001 From: Randy D White Date: Sun, 23 Oct 2022 09:55:08 -0400 Subject: [PATCH 03/18] gh pr checkout 708 From 2d7d9f7ff5b310f983d059b68785b3c74d8b8edd Mon Sep 17 00:00:00 2001 From: yasonk Date: Mon, 2 Sep 2024 06:53:38 -0700 Subject: [PATCH 04/18] Provide explanation for where user email came from (#1869) * Provide explanation for where user email came from * bringing back the newline --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9b6176d..e1ea032 100644 --- a/README.md +++ b/README.md @@ -286,6 +286,7 @@ jobs: git commit -m "generated" git push ``` +*NOTE:* The user email is `{user.id}+{user.login}@users.noreply.github.com`. See users API: https://api.github.com/users/github-actions%5Bbot%5D # License From b6849436894e144dbce29d7d7fda2ae3bf9d8365 Mon Sep 17 00:00:00 2001 From: Luca Comellini Date: Thu, 5 Sep 2024 08:57:13 -0700 Subject: [PATCH 05/18] Add Ref and Commit outputs (#1180) Signed-off-by: Luca Comellini --- .github/workflows/test.yml | 34 ++++++++++++++++++++++++++++++++++ action.yml | 5 +++++ dist/index.js | 4 +++- src/git-source-provider.ts | 3 ++- src/main.ts | 1 + 5 files changed, 45 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1ef3c31..cde9f06 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -295,3 +295,37 @@ jobs: uses: actions/checkout@v4.1.6 with: path: localClone + + test-output: + runs-on: ubuntu-latest + steps: + # Clone this repo + - name: Checkout + uses: actions/checkout@v4.1.6 + + # Basic checkout using git + - name: Checkout basic + id: checkout + uses: ./ + with: + ref: test-data/v2/basic + + # Verify output + - name: Verify output + run: | + echo "Commit: ${{ steps.checkout.outputs.commit }}" + echo "Ref: ${{ steps.checkout.outputs.ref }}" + + if [ "${{ steps.checkout.outputs.ref }}" != "test-data/v2/basic" ]; then + echo "Expected ref to be test-data/v2/basic" + exit 1 + fi + + if [ "${{ steps.checkout.outputs.commit }}" != "82f71901cf8c021332310dcc8cdba84c4193ff5d" ]; then + echo "Expected commit to be 82f71901cf8c021332310dcc8cdba84c4193ff5d" + exit 1 + fi + + # needed to make checkout post cleanup succeed + - name: Fix Checkout + uses: actions/checkout@v4.1.6 diff --git a/action.yml b/action.yml index 75d5ae2..6842eb8 100644 --- a/action.yml +++ b/action.yml @@ -98,6 +98,11 @@ inputs: github-server-url: description: The base URL for the GitHub instance that you are trying to clone from, will use environment defaults to fetch from the same instance that the workflow is running from unless specified. Example URLs are https://github.com or https://my-ghes-server.example.com required: false +outputs: + ref: + description: 'The branch, tag or SHA that was checked out' + commit: + description: 'The commit SHA that was checked out' runs: using: node20 main: dist/index.js diff --git a/dist/index.js b/dist/index.js index 9d959a9..ae427a4 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1355,7 +1355,8 @@ function getSource(settings) { // Get commit information const commitInfo = yield git.log1(); // Log commit sha - yield git.log1("--format='%H'"); + const commitSHA = yield git.log1('--format=%H'); + core.setOutput('commit', commitSHA.trim()); // Check for incorrect pull request merge commit yield refHelper.checkCommitInfo(settings.authToken, commitInfo, settings.repositoryOwner, settings.repositoryName, settings.ref, settings.commit, settings.githubServerUrl); } @@ -1897,6 +1898,7 @@ function run() { coreCommand.issueCommand('add-matcher', {}, path.join(__dirname, 'problem-matcher.json')); // Get sources yield gitSourceProvider.getSource(sourceSettings); + core.setOutput('ref', sourceSettings.ref); } finally { // Unregister problem matcher diff --git a/src/git-source-provider.ts b/src/git-source-provider.ts index f723d94..2d35138 100644 --- a/src/git-source-provider.ts +++ b/src/git-source-provider.ts @@ -261,7 +261,8 @@ export async function getSource(settings: IGitSourceSettings): Promise { const commitInfo = await git.log1() // Log commit sha - await git.log1("--format='%H'") + const commitSHA = await git.log1('--format=%H') + core.setOutput('commit', commitSHA.trim()) // Check for incorrect pull request merge commit await refHelper.checkCommitInfo( diff --git a/src/main.ts b/src/main.ts index 97a27af..0684c6f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -19,6 +19,7 @@ async function run(): Promise { // Get sources await gitSourceProvider.getSource(sourceSettings) + core.setOutput('ref', sourceSettings.ref) } finally { // Unregister problem matcher coreCommand.issueCommand('remove-matcher', {owner: 'checkout-git'}, '') From db0cee9a514becbbd4a101a5fbbbf47865ee316c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 15:04:17 -0400 Subject: [PATCH 06/18] Bump the minor-npm-dependencies group across 1 directory with 4 updates (#1872) * Bump the minor-npm-dependencies group across 1 directory with 4 updates Bumps the minor-npm-dependencies group with 4 updates in the / directory: [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest), [prettier](https://github.com/prettier/prettier), [ts-jest](https://github.com/kulshekhar/ts-jest) and [typescript](https://github.com/Microsoft/TypeScript). Updates `eslint-plugin-jest` from 28.5.0 to 28.8.2 - [Release notes](https://github.com/jest-community/eslint-plugin-jest/releases) - [Changelog](https://github.com/jest-community/eslint-plugin-jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/jest-community/eslint-plugin-jest/compare/v28.5.0...v28.8.2) Updates `prettier` from 3.2.5 to 3.3.3 - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.2.5...3.3.3) Updates `ts-jest` from 29.1.2 to 29.2.5 - [Release notes](https://github.com/kulshekhar/ts-jest/releases) - [Changelog](https://github.com/kulshekhar/ts-jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/kulshekhar/ts-jest/compare/v29.1.2...v29.2.5) Updates `typescript` from 5.4.5 to 5.5.4 - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml) - [Commits](https://github.com/Microsoft/TypeScript/compare/v5.4.5...v5.5.4) --- updated-dependencies: - dependency-name: eslint-plugin-jest dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-npm-dependencies - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-npm-dependencies - dependency-name: ts-jest dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-npm-dependencies - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-npm-dependencies ... Signed-off-by: dependabot[bot] * `npm run build` --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Josh Gross --- dist/index.js | 71 +++++++++----------- package-lock.json | 164 ++++++++++++++++++++++++++++++++-------------- package.json | 8 +-- 3 files changed, 150 insertions(+), 93 deletions(-) diff --git a/dist/index.js b/dist/index.js index ae427a4..2b7dd09 100644 --- a/dist/index.js +++ b/dist/index.js @@ -30,7 +30,9 @@ var __importStar = (this && this.__importStar) || function (mod) { return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.fileExistsSync = exports.existsSync = exports.directoryExistsSync = void 0; +exports.directoryExistsSync = directoryExistsSync; +exports.existsSync = existsSync; +exports.fileExistsSync = fileExistsSync; const fs = __importStar(__nccwpck_require__(7147)); function directoryExistsSync(path, required) { var _a; @@ -58,7 +60,6 @@ function directoryExistsSync(path, required) { } throw new Error(`Directory '${path}' does not exist`); } -exports.directoryExistsSync = directoryExistsSync; function existsSync(path) { var _a; if (!path) { @@ -75,7 +76,6 @@ function existsSync(path) { } return true; } -exports.existsSync = existsSync; function fileExistsSync(path) { var _a; if (!path) { @@ -96,7 +96,6 @@ function fileExistsSync(path) { } return false; } -exports.fileExistsSync = fileExistsSync; /***/ }), @@ -139,7 +138,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.createAuthHelper = void 0; +exports.createAuthHelper = createAuthHelper; const assert = __importStar(__nccwpck_require__(9491)); const core = __importStar(__nccwpck_require__(2186)); const exec = __importStar(__nccwpck_require__(1514)); @@ -156,7 +155,6 @@ const SSH_COMMAND_KEY = 'core.sshCommand'; function createAuthHelper(git, settings) { return new GitAuthHelper(git, settings); } -exports.createAuthHelper = createAuthHelper; class GitAuthHelper { constructor(gitCommandManager, gitSourceSettings) { this.insteadOfValues = []; @@ -475,7 +473,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.createCommandManager = exports.MinimumGitSparseCheckoutVersion = exports.MinimumGitVersion = void 0; +exports.MinimumGitSparseCheckoutVersion = exports.MinimumGitVersion = void 0; +exports.createCommandManager = createCommandManager; const core = __importStar(__nccwpck_require__(2186)); const exec = __importStar(__nccwpck_require__(1514)); const fs = __importStar(__nccwpck_require__(7147)); @@ -496,7 +495,6 @@ function createCommandManager(workingDirectory, lfs, doSparseCheckout) { return yield GitCommandManager.createCommandManager(workingDirectory, lfs, doSparseCheckout); }); } -exports.createCommandManager = createCommandManager; class GitCommandManager { // Private constructor; use createCommandManager() constructor() { @@ -1020,7 +1018,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.prepareExistingDirectory = void 0; +exports.prepareExistingDirectory = prepareExistingDirectory; const assert = __importStar(__nccwpck_require__(9491)); const core = __importStar(__nccwpck_require__(2186)); const fs = __importStar(__nccwpck_require__(7147)); @@ -1124,7 +1122,6 @@ function prepareExistingDirectory(git, repositoryPath, repositoryUrl, clean, ref } }); } -exports.prepareExistingDirectory = prepareExistingDirectory; /***/ }), @@ -1167,7 +1164,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.cleanup = exports.getSource = void 0; +exports.getSource = getSource; +exports.cleanup = cleanup; const core = __importStar(__nccwpck_require__(2186)); const fsHelper = __importStar(__nccwpck_require__(7219)); const gitAuthHelper = __importStar(__nccwpck_require__(2565)); @@ -1373,7 +1371,6 @@ function getSource(settings) { } }); } -exports.getSource = getSource; function cleanup(repositoryPath) { return __awaiter(this, void 0, void 0, function* () { // Repo exists? @@ -1409,7 +1406,6 @@ function cleanup(repositoryPath) { } }); } -exports.cleanup = cleanup; function getGitCommandManager(settings) { return __awaiter(this, void 0, void 0, function* () { core.info(`Working directory is '${settings.repositoryPath}'`); @@ -1548,7 +1544,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getDefaultBranch = exports.downloadRepository = void 0; +exports.downloadRepository = downloadRepository; +exports.getDefaultBranch = getDefaultBranch; const assert = __importStar(__nccwpck_require__(9491)); const core = __importStar(__nccwpck_require__(2186)); const fs = __importStar(__nccwpck_require__(7147)); @@ -1612,7 +1609,6 @@ function downloadRepository(authToken, owner, repo, ref, commit, repositoryPath, yield io.rmRF(extractPath); }); } -exports.downloadRepository = downloadRepository; /** * Looks up the default branch name */ @@ -1651,7 +1647,6 @@ function getDefaultBranch(authToken, owner, repo, baseUrl) { })); }); } -exports.getDefaultBranch = getDefaultBranch; function downloadArchive(authToken, owner, repo, ref, commit, baseUrl) { return __awaiter(this, void 0, void 0, function* () { const octokit = github.getOctokit(authToken, { @@ -1710,7 +1705,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getInputs = void 0; +exports.getInputs = getInputs; const core = __importStar(__nccwpck_require__(2186)); const fsHelper = __importStar(__nccwpck_require__(7219)); const github = __importStar(__nccwpck_require__(5438)); @@ -1839,7 +1834,6 @@ function getInputs() { return result; }); } -exports.getInputs = getInputs; /***/ }), @@ -1971,7 +1965,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.checkCommitInfo = exports.testRef = exports.getRefSpec = exports.getRefSpecForAllHistory = exports.getCheckoutInfo = exports.tagsRefSpec = void 0; +exports.tagsRefSpec = void 0; +exports.getCheckoutInfo = getCheckoutInfo; +exports.getRefSpecForAllHistory = getRefSpecForAllHistory; +exports.getRefSpec = getRefSpec; +exports.testRef = testRef; +exports.checkCommitInfo = checkCommitInfo; const core = __importStar(__nccwpck_require__(2186)); const github = __importStar(__nccwpck_require__(5438)); const url_helper_1 = __nccwpck_require__(9437); @@ -2025,7 +2024,6 @@ function getCheckoutInfo(git, ref, commit) { return result; }); } -exports.getCheckoutInfo = getCheckoutInfo; function getRefSpecForAllHistory(ref, commit) { const result = ['+refs/heads/*:refs/remotes/origin/*', exports.tagsRefSpec]; if (ref && ref.toUpperCase().startsWith('REFS/PULL/')) { @@ -2034,7 +2032,6 @@ function getRefSpecForAllHistory(ref, commit) { } return result; } -exports.getRefSpecForAllHistory = getRefSpecForAllHistory; function getRefSpec(ref, commit) { if (!ref && !commit) { throw new Error('Args ref and commit cannot both be empty'); @@ -2083,7 +2080,6 @@ function getRefSpec(ref, commit) { return [`+${ref}:${ref}`]; } } -exports.getRefSpec = getRefSpec; /** * Tests whether the initial fetch created the ref at the expected commit */ @@ -2127,7 +2123,6 @@ function testRef(git, ref, commit) { } }); } -exports.testRef = testRef; function checkCommitInfo(token, commitInfo, repositoryOwner, repositoryName, ref, commit, baseUrl) { return __awaiter(this, void 0, void 0, function* () { var _a; @@ -2193,7 +2188,6 @@ function checkCommitInfo(token, commitInfo, repositoryOwner, repositoryName, ref } }); } -exports.checkCommitInfo = checkCommitInfo; function fromPayload(path) { return select(github.context.payload, path); } @@ -2218,13 +2212,12 @@ function select(obj, path) { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.escape = void 0; +exports.escape = escape; function escape(value) { return value.replace(/[^a-zA-Z0-9_]/g, x => { return `\\${x}`; }); } -exports.escape = escape; /***/ }), @@ -2267,7 +2260,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.execute = exports.RetryHelper = void 0; +exports.RetryHelper = void 0; +exports.execute = execute; const core = __importStar(__nccwpck_require__(2186)); const defaultMaxAttempts = 3; const defaultMinSeconds = 10; @@ -2319,7 +2313,6 @@ function execute(action) { return yield retryHelper.execute(action); }); } -exports.execute = execute; /***/ }), @@ -2353,7 +2346,11 @@ var __importStar = (this && this.__importStar) || function (mod) { return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.setSafeDirectory = exports.setSshKnownHostsPath = exports.setSshKeyPath = exports.setRepositoryPath = exports.SshKnownHostsPath = exports.SshKeyPath = exports.PostSetSafeDirectory = exports.RepositoryPath = exports.IsPost = void 0; +exports.SshKnownHostsPath = exports.SshKeyPath = exports.PostSetSafeDirectory = exports.RepositoryPath = exports.IsPost = void 0; +exports.setRepositoryPath = setRepositoryPath; +exports.setSshKeyPath = setSshKeyPath; +exports.setSshKnownHostsPath = setSshKnownHostsPath; +exports.setSafeDirectory = setSafeDirectory; const core = __importStar(__nccwpck_require__(2186)); /** * Indicates whether the POST action is running @@ -2381,28 +2378,24 @@ exports.SshKnownHostsPath = core.getState('sshKnownHostsPath'); function setRepositoryPath(repositoryPath) { core.saveState('repositoryPath', repositoryPath); } -exports.setRepositoryPath = setRepositoryPath; /** * Save the SSH key path so the POST action can retrieve the value. */ function setSshKeyPath(sshKeyPath) { core.saveState('sshKeyPath', sshKeyPath); } -exports.setSshKeyPath = setSshKeyPath; /** * Save the SSH known hosts path so the POST action can retrieve the value. */ function setSshKnownHostsPath(sshKnownHostsPath) { core.saveState('sshKnownHostsPath', sshKnownHostsPath); } -exports.setSshKnownHostsPath = setSshKnownHostsPath; /** * Save the set-safe-directory input so the POST action can retrieve the value. */ function setSafeDirectory() { core.saveState('setSafeDirectory', 'true'); } -exports.setSafeDirectory = setSafeDirectory; // Publish a variable so that when the POST action runs, it can determine it should run the cleanup logic. // This is necessary since we don't have a separate entry point. if (!exports.IsPost) { @@ -2441,7 +2434,10 @@ var __importStar = (this && this.__importStar) || function (mod) { return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isGhes = exports.getServerApiUrl = exports.getServerUrl = exports.getFetchUrl = void 0; +exports.getFetchUrl = getFetchUrl; +exports.getServerUrl = getServerUrl; +exports.getServerApiUrl = getServerApiUrl; +exports.isGhes = isGhes; const assert = __importStar(__nccwpck_require__(9491)); const url_1 = __nccwpck_require__(7310); function getFetchUrl(settings) { @@ -2457,14 +2453,12 @@ function getFetchUrl(settings) { // "origin" is SCHEME://HOSTNAME[:PORT] return `${serviceUrl.origin}/${encodedOwner}/${encodedName}`; } -exports.getFetchUrl = getFetchUrl; function getServerUrl(url) { let urlValue = url && url.trim().length > 0 ? url : process.env['GITHUB_SERVER_URL'] || 'https://github.com'; return new url_1.URL(urlValue); } -exports.getServerUrl = getServerUrl; function getServerApiUrl(url) { let apiUrl = 'https://api.github.com'; if (isGhes(url)) { @@ -2473,12 +2467,10 @@ function getServerApiUrl(url) { } return apiUrl; } -exports.getServerApiUrl = getServerApiUrl; function isGhes(url) { const ghUrl = getServerUrl(url); return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; } -exports.isGhes = isGhes; /***/ }), @@ -2521,7 +2513,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getOrganizationId = void 0; +exports.getOrganizationId = getOrganizationId; const core = __importStar(__nccwpck_require__(2186)); const fs = __importStar(__nccwpck_require__(7147)); /** @@ -2550,7 +2542,6 @@ function getOrganizationId() { } }); } -exports.getOrganizationId = getOrganizationId; /***/ }), diff --git a/package-lock.json b/package-lock.json index 2742b5f..04ea2f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,13 +25,13 @@ "@vercel/ncc": "^0.38.1", "eslint": "^8.57.0", "eslint-plugin-github": "^4.10.2", - "eslint-plugin-jest": "^28.5.0", + "eslint-plugin-jest": "^28.8.2", "jest": "^29.7.0", "jest-circus": "^29.7.0", "js-yaml": "^4.1.0", - "prettier": "^3.2.5", - "ts-jest": "^29.1.2", - "typescript": "^5.4.5" + "prettier": "^3.3.3", + "ts-jest": "^29.2.5", + "typescript": "^5.5.4" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -2080,6 +2080,12 @@ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -2702,6 +2708,21 @@ "node": ">=6.0.0" } }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.747", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.747.tgz", @@ -3197,18 +3218,18 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "28.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.5.0.tgz", - "integrity": "sha512-6np6DGdmNq/eBbA7HOUNV8fkfL86PYwBfwyb8n23FXgJNTR8+ot3smRHjza9LGsBBZRypK3qyF79vMjohIL8eQ==", + "version": "28.8.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.8.2.tgz", + "integrity": "sha512-mC3OyklHmS5i7wYU1rGId9EnxRI8TVlnFG56AE+8U9iRy6zwaNygZR+DsdZuCL0gRG0wVeyzq+uWcPt6yJrrMA==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "^6.0.0 || ^7.0.0" + "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "engines": { "node": "^16.10.0 || ^18.12.0 || >=20.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0", + "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", "jest": "*" }, @@ -3573,6 +3594,27 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4574,6 +4616,46 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -5896,9 +5978,9 @@ } }, "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -6607,28 +6689,30 @@ } }, "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", "dev": true, "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", "jest-util": "^29.0.0", "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" }, "bin": { "ts-jest": "cli.js" }, "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", @@ -6638,6 +6722,9 @@ "@babel/core": { "optional": true }, + "@jest/transform": { + "optional": true + }, "@jest/types": { "optional": true }, @@ -6649,26 +6736,11 @@ } } }, - "node_modules/ts-jest/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -6676,12 +6748,6 @@ "node": ">=10" } }, - "node_modules/ts-jest/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -6836,9 +6902,9 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index b45b792..93121e4 100644 --- a/package.json +++ b/package.json @@ -44,12 +44,12 @@ "@vercel/ncc": "^0.38.1", "eslint": "^8.57.0", "eslint-plugin-github": "^4.10.2", - "eslint-plugin-jest": "^28.5.0", + "eslint-plugin-jest": "^28.8.2", "jest": "^29.7.0", "jest-circus": "^29.7.0", "js-yaml": "^4.1.0", - "prettier": "^3.2.5", - "ts-jest": "^29.1.2", - "typescript": "^5.4.5" + "prettier": "^3.3.3", + "ts-jest": "^29.2.5", + "typescript": "^5.5.4" } } From 6d193bf28034eafb982f37bd894289fe649468fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 15:04:42 -0400 Subject: [PATCH 07/18] Bump braces from 3.0.2 to 3.0.3 (#1777) Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 04ea2f4..b65cc27 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2247,12 +2247,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -3616,9 +3616,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" From d632683dd7b4114ad314bca15554477dd762a938 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Wed, 25 Sep 2024 13:51:15 -0400 Subject: [PATCH 08/18] Prepare 4.2.0 release (#1878) * Bump package version to 4.1.8 * Add v4.1.8 changelog * Bump version to `4.2.0` --- CHANGELOG.md | 5 +++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 914cab7..877a50f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v4.2.0 + +* Add Ref and Commit outputs by @lucacome in https://github.com/actions/checkout/pull/1180 +* Dependency updates by @dependabot- https://github.com/actions/checkout/pull/1777, https://github.com/actions/checkout/pull/1872 + ## v4.1.7 * Bump the minor-npm-dependencies group across 1 directory with 4 updates by @dependabot in https://github.com/actions/checkout/pull/1739 * Bump actions/checkout from 3 to 4 by @dependabot in https://github.com/actions/checkout/pull/1697 diff --git a/package-lock.json b/package-lock.json index b65cc27..a84d3bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "checkout", - "version": "4.1.7", + "version": "4.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "checkout", - "version": "4.1.7", + "version": "4.2.0", "license": "MIT", "dependencies": { "@actions/core": "^1.10.1", diff --git a/package.json b/package.json index 93121e4..cdccbfc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "checkout", - "version": "4.1.7", + "version": "4.2.0", "description": "checkout action", "main": "lib/main.js", "scripts": { From de5a000abf73b6f4965bd1bcdf8f8d94a56ea815 Mon Sep 17 00:00:00 2001 From: Orhan Toy Date: Wed, 2 Oct 2024 02:24:28 +0200 Subject: [PATCH 09/18] Check out other refs/* by commit if provided, fall back to ref (#1924) --- __test__/ref-helper.test.ts | 10 ++++++++++ dist/index.js | 4 ++-- src/ref-helper.ts | 4 ++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/__test__/ref-helper.test.ts b/__test__/ref-helper.test.ts index d3b00b7..5c8d76b 100644 --- a/__test__/ref-helper.test.ts +++ b/__test__/ref-helper.test.ts @@ -77,6 +77,16 @@ describe('ref-helper tests', () => { expect(checkoutInfo.startPoint).toBeFalsy() }) + it('getCheckoutInfo refs/ without commit', async () => { + const checkoutInfo = await refHelper.getCheckoutInfo( + git, + 'refs/non-standard-ref', + '' + ) + expect(checkoutInfo.ref).toBe('refs/non-standard-ref') + expect(checkoutInfo.startPoint).toBeFalsy() + }) + it('getCheckoutInfo unqualified branch only', async () => { git.branchExists = jest.fn(async (remote: boolean, pattern: string) => { return true diff --git a/dist/index.js b/dist/index.js index 2b7dd09..d86415e 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2005,8 +2005,8 @@ function getCheckoutInfo(git, ref, commit) { result.ref = ref; } // refs/ - else if (upperRef.startsWith('REFS/') && commit) { - result.ref = commit; + else if (upperRef.startsWith('REFS/')) { + result.ref = commit ? commit : ref; } // Unqualified ref, check for a matching branch or tag else { diff --git a/src/ref-helper.ts b/src/ref-helper.ts index 00a1d27..58f9290 100644 --- a/src/ref-helper.ts +++ b/src/ref-helper.ts @@ -46,8 +46,8 @@ export async function getCheckoutInfo( result.ref = ref } // refs/ - else if (upperRef.startsWith('REFS/') && commit) { - result.ref = commit + else if (upperRef.startsWith('REFS/')) { + result.ref = commit ? commit : ref } // Unqualified ref, check for a matching branch or tag else { From 6b42224f41ee5dfe5395e27c8b2746f1f9955030 Mon Sep 17 00:00:00 2001 From: Joel Ambass Date: Thu, 3 Oct 2024 11:03:35 +0200 Subject: [PATCH 10/18] Add workflow file for publishing releases to immutable action package (#1919) This workflow file publishes new action releases to the immutable action package of the same name as this repo. This is part of the Immutable Actions project which is not yet fully released to the public. First party actions like this one are part of our initial testing of this feature. --- .../workflows/publish-immutable-actions.yml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/publish-immutable-actions.yml diff --git a/.github/workflows/publish-immutable-actions.yml b/.github/workflows/publish-immutable-actions.yml new file mode 100644 index 0000000..87c0207 --- /dev/null +++ b/.github/workflows/publish-immutable-actions.yml @@ -0,0 +1,20 @@ +name: 'Publish Immutable Action Version' + +on: + release: + types: [published] + +jobs: + publish: + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + packages: write + + steps: + - name: Checking out + uses: actions/checkout@v4 + - name: Publish + id: publish + uses: actions/publish-immutable-action@0.0.3 From eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Mon, 7 Oct 2024 12:38:04 -0400 Subject: [PATCH 11/18] Prepare 4.2.1 release (#1925) --- CHANGELOG.md | 3 +++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 877a50f..b127df3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## v4.2.1 +* Check out other refs/* by commit if provided, fall back to ref by @orhantoy in https://github.com/actions/checkout/pull/1924 + ## v4.2.0 * Add Ref and Commit outputs by @lucacome in https://github.com/actions/checkout/pull/1180 diff --git a/package-lock.json b/package-lock.json index a84d3bd..281b2ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "checkout", - "version": "4.2.0", + "version": "4.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "checkout", - "version": "4.2.0", + "version": "4.2.1", "license": "MIT", "dependencies": { "@actions/core": "^1.10.1", diff --git a/package.json b/package.json index cdccbfc..e145004 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "checkout", - "version": "4.2.0", + "version": "4.2.1", "description": "checkout action", "main": "lib/main.js", "scripts": { From 163217dfcd28294438ea1c1c149cfaf66eec283e Mon Sep 17 00:00:00 2001 From: John Wesley Walker III <81404201+jww3@users.noreply.github.com> Date: Fri, 18 Oct 2024 10:07:17 +0200 Subject: [PATCH 12/18] `url-helper.ts` now leverages well-known environment variables. (#1941) * `utl-helper.ts` now leverages well-known environment variables. --------- Co-authored-by: Erez Testiler --- __test__/url-helper.test.ts | 55 ++++++++++++++++++++++++++++++++++ dist/index.js | 50 ++++++++++++++++++++++++------- src/url-helper.ts | 59 +++++++++++++++++++++++++++++-------- 3 files changed, 141 insertions(+), 23 deletions(-) create mode 100644 __test__/url-helper.test.ts diff --git a/__test__/url-helper.test.ts b/__test__/url-helper.test.ts new file mode 100644 index 0000000..27f6606 --- /dev/null +++ b/__test__/url-helper.test.ts @@ -0,0 +1,55 @@ +import * as urlHelper from '../src/url-helper' + +describe('getServerUrl tests', () => { + it('basics', async () => { + // Note that URL::toString will append a trailing / when passed just a domain name ... + expect(urlHelper.getServerUrl().toString()).toBe('https://github.com/') + expect(urlHelper.getServerUrl(' ').toString()).toBe('https://github.com/') + expect(urlHelper.getServerUrl(' ').toString()).toBe('https://github.com/') + expect(urlHelper.getServerUrl('http://contoso.com').toString()).toBe( + 'http://contoso.com/' + ) + expect(urlHelper.getServerUrl('https://contoso.com').toString()).toBe( + 'https://contoso.com/' + ) + expect(urlHelper.getServerUrl('https://contoso.com/').toString()).toBe( + 'https://contoso.com/' + ) + + // ... but can't make that same assumption when passed an URL that includes some deeper path. + expect(urlHelper.getServerUrl('https://contoso.com/a/b').toString()).toBe( + 'https://contoso.com/a/b' + ) + }) +}) + +describe('isGhes tests', () => { + it('basics', async () => { + expect(urlHelper.isGhes()).toBeFalsy() + expect(urlHelper.isGhes('https://github.com')).toBeFalsy() + expect(urlHelper.isGhes('https://contoso.ghe.com')).toBeFalsy() + expect(urlHelper.isGhes('https://test.github.localhost')).toBeFalsy() + expect(urlHelper.isGhes('https://src.onpremise.fabrikam.com')).toBeTruthy() + }) +}) + +describe('getServerApiUrl tests', () => { + it('basics', async () => { + expect(urlHelper.getServerApiUrl()).toBe('https://api.github.com') + expect(urlHelper.getServerApiUrl('https://github.com')).toBe( + 'https://api.github.com' + ) + expect(urlHelper.getServerApiUrl('https://GitHub.com')).toBe( + 'https://api.github.com' + ) + expect(urlHelper.getServerApiUrl('https://contoso.ghe.com')).toBe( + 'https://api.contoso.ghe.com' + ) + expect(urlHelper.getServerApiUrl('https://fabrikam.GHE.COM')).toBe( + 'https://api.fabrikam.ghe.com' + ) + expect( + urlHelper.getServerApiUrl('https://src.onpremise.fabrikam.com') + ).toBe('https://src.onpremise.fabrikam.com/api/v3') + }) +}) diff --git a/dist/index.js b/dist/index.js index d86415e..b0db713 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2454,22 +2454,50 @@ function getFetchUrl(settings) { return `${serviceUrl.origin}/${encodedOwner}/${encodedName}`; } function getServerUrl(url) { - let urlValue = url && url.trim().length > 0 - ? url - : process.env['GITHUB_SERVER_URL'] || 'https://github.com'; - return new url_1.URL(urlValue); + let resolvedUrl = process.env['GITHUB_SERVER_URL'] || 'https://github.com'; + if (hasContent(url, WhitespaceMode.Trim)) { + resolvedUrl = url; + } + return new url_1.URL(resolvedUrl); } function getServerApiUrl(url) { - let apiUrl = 'https://api.github.com'; - if (isGhes(url)) { - const serverUrl = getServerUrl(url); - apiUrl = new url_1.URL(`${serverUrl.origin}/api/v3`).toString(); + if (hasContent(url, WhitespaceMode.Trim)) { + let serverUrl = getServerUrl(url); + if (isGhes(url)) { + serverUrl.pathname = 'api/v3'; + } + else { + serverUrl.hostname = 'api.' + serverUrl.hostname; + } + return pruneSuffix(serverUrl.toString(), '/'); } - return apiUrl; + return process.env['GITHUB_API_URL'] || 'https://api.github.com'; } function isGhes(url) { - const ghUrl = getServerUrl(url); - return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; + const ghUrl = new url_1.URL(url || process.env['GITHUB_SERVER_URL'] || 'https://github.com'); + const hostname = ghUrl.hostname.trimEnd().toUpperCase(); + const isGitHubHost = hostname === 'GITHUB.COM'; + const isGitHubEnterpriseCloudHost = hostname.endsWith('.GHE.COM'); + const isLocalHost = hostname.endsWith('.LOCALHOST'); + return !isGitHubHost && !isGitHubEnterpriseCloudHost && !isLocalHost; +} +function pruneSuffix(text, suffix) { + if (hasContent(suffix, WhitespaceMode.Preserve) && (text === null || text === void 0 ? void 0 : text.endsWith(suffix))) { + return text.substring(0, text.length - suffix.length); + } + return text; +} +var WhitespaceMode; +(function (WhitespaceMode) { + WhitespaceMode[WhitespaceMode["Trim"] = 0] = "Trim"; + WhitespaceMode[WhitespaceMode["Preserve"] = 1] = "Preserve"; +})(WhitespaceMode || (WhitespaceMode = {})); +function hasContent(text, whitespaceMode) { + let refinedText = text !== null && text !== void 0 ? text : ''; + if (whitespaceMode == WhitespaceMode.Trim) { + refinedText = refinedText.trim(); + } + return refinedText.length > 0; } diff --git a/src/url-helper.ts b/src/url-helper.ts index 64ecbf3..17a0842 100644 --- a/src/url-helper.ts +++ b/src/url-helper.ts @@ -21,26 +21,61 @@ export function getFetchUrl(settings: IGitSourceSettings): string { } export function getServerUrl(url?: string): URL { - let urlValue = - url && url.trim().length > 0 - ? url - : process.env['GITHUB_SERVER_URL'] || 'https://github.com' - return new URL(urlValue) + let resolvedUrl = process.env['GITHUB_SERVER_URL'] || 'https://github.com' + if (hasContent(url, WhitespaceMode.Trim)) { + resolvedUrl = url! + } + + return new URL(resolvedUrl) } export function getServerApiUrl(url?: string): string { - let apiUrl = 'https://api.github.com' + if (hasContent(url, WhitespaceMode.Trim)) { + let serverUrl = getServerUrl(url) + if (isGhes(url)) { + serverUrl.pathname = 'api/v3' + } else { + serverUrl.hostname = 'api.' + serverUrl.hostname + } - if (isGhes(url)) { - const serverUrl = getServerUrl(url) - apiUrl = new URL(`${serverUrl.origin}/api/v3`).toString() + return pruneSuffix(serverUrl.toString(), '/') } - return apiUrl + return process.env['GITHUB_API_URL'] || 'https://api.github.com' } export function isGhes(url?: string): boolean { - const ghUrl = getServerUrl(url) + const ghUrl = new URL( + url || process.env['GITHUB_SERVER_URL'] || 'https://github.com' + ) - return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM' + const hostname = ghUrl.hostname.trimEnd().toUpperCase() + const isGitHubHost = hostname === 'GITHUB.COM' + const isGitHubEnterpriseCloudHost = hostname.endsWith('.GHE.COM') + const isLocalHost = hostname.endsWith('.LOCALHOST') + + return !isGitHubHost && !isGitHubEnterpriseCloudHost && !isLocalHost +} + +function pruneSuffix(text: string, suffix: string) { + if (hasContent(suffix, WhitespaceMode.Preserve) && text?.endsWith(suffix)) { + return text.substring(0, text.length - suffix.length) + } + return text +} + +enum WhitespaceMode { + Trim, + Preserve +} + +function hasContent( + text: string | undefined, + whitespaceMode: WhitespaceMode +): boolean { + let refinedText = text ?? '' + if (whitespaceMode == WhitespaceMode.Trim) { + refinedText = refinedText.trim() + } + return refinedText.length > 0 } From e3d2460bbb42d7710191569f88069044cfb9d8cf Mon Sep 17 00:00:00 2001 From: John Wesley Walker III <81404201+jww3@users.noreply.github.com> Date: Wed, 23 Oct 2024 15:59:08 +0200 Subject: [PATCH 13/18] Expand unit test coverage (#1946) --- __test__/url-helper.test.ts | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/__test__/url-helper.test.ts b/__test__/url-helper.test.ts index 27f6606..57cb28f 100644 --- a/__test__/url-helper.test.ts +++ b/__test__/url-helper.test.ts @@ -24,13 +24,50 @@ describe('getServerUrl tests', () => { }) describe('isGhes tests', () => { + const pristineEnv = process.env + + beforeEach(() => { + jest.resetModules() + process.env = {...pristineEnv} + }) + + afterAll(() => { + process.env = pristineEnv + }) + it('basics', async () => { + delete process.env['GITHUB_SERVER_URL'] expect(urlHelper.isGhes()).toBeFalsy() expect(urlHelper.isGhes('https://github.com')).toBeFalsy() expect(urlHelper.isGhes('https://contoso.ghe.com')).toBeFalsy() expect(urlHelper.isGhes('https://test.github.localhost')).toBeFalsy() expect(urlHelper.isGhes('https://src.onpremise.fabrikam.com')).toBeTruthy() }) + + it('returns false when the GITHUB_SERVER_URL environment variable is not defined', async () => { + delete process.env['GITHUB_SERVER_URL'] + expect(urlHelper.isGhes()).toBeFalsy() + }) + + it('returns false when the GITHUB_SERVER_URL environment variable is set to github.com', async () => { + process.env['GITHUB_SERVER_URL'] = 'https://github.com' + expect(urlHelper.isGhes()).toBeFalsy() + }) + + it('returns false when the GITHUB_SERVER_URL environment variable is set to a GitHub Enterprise Cloud-style URL', async () => { + process.env['GITHUB_SERVER_URL'] = 'https://contoso.ghe.com' + expect(urlHelper.isGhes()).toBeFalsy() + }) + + it('returns false when the GITHUB_SERVER_URL environment variable has a .localhost suffix', async () => { + process.env['GITHUB_SERVER_URL'] = 'https://mock-github.localhost' + expect(urlHelper.isGhes()).toBeFalsy() + }) + + it('returns true when the GITHUB_SERVER_URL environment variable is set to some other URL', async () => { + process.env['GITHUB_SERVER_URL'] = 'https://src.onpremise.fabrikam.com' + expect(urlHelper.isGhes()).toBeTruthy() + }) }) describe('getServerApiUrl tests', () => { From 11bd71901bbe5b1630ceea73d27597364c9af683 Mon Sep 17 00:00:00 2001 From: John Wesley Walker III <81404201+jww3@users.noreply.github.com> Date: Wed, 23 Oct 2024 16:24:28 +0200 Subject: [PATCH 14/18] Prepare 4.2.2 Release (#1953) * Prepare 4.2.2 Release --------- Co-authored-by: Josh Gross --- CHANGELOG.md | 4 ++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b127df3..a96c76e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v4.2.2 +* `url-helper.ts` now leverages well-known environment variables by @jww3 in https://github.com/actions/checkout/pull/1941 +* Expand unit test coverage for `isGhes` by @jww3 in https://github.com/actions/checkout/pull/1946 + ## v4.2.1 * Check out other refs/* by commit if provided, fall back to ref by @orhantoy in https://github.com/actions/checkout/pull/1924 diff --git a/package-lock.json b/package-lock.json index 281b2ea..25753a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "checkout", - "version": "4.2.1", + "version": "4.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "checkout", - "version": "4.2.1", + "version": "4.2.2", "license": "MIT", "dependencies": { "@actions/core": "^1.10.1", diff --git a/package.json b/package.json index e145004..5661d70 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "checkout", - "version": "4.2.1", + "version": "4.2.2", "description": "checkout action", "main": "lib/main.js", "scripts": { From 3b9b8c884f6b4bb4d5be2779c26374abadae0871 Mon Sep 17 00:00:00 2001 From: The web walker Date: Fri, 8 Nov 2024 23:32:54 +0800 Subject: [PATCH 15/18] docs: update README.md (#1971) Add a scenario where it is necessary to push a commit to a pull request. --- README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/README.md b/README.md index e1ea032..a43e887 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,7 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/ - [Checkout pull request HEAD commit instead of merge commit](#Checkout-pull-request-HEAD-commit-instead-of-merge-commit) - [Checkout pull request on closed event](#Checkout-pull-request-on-closed-event) - [Push a commit using the built-in token](#Push-a-commit-using-the-built-in-token) +- [Push a commit to a PR using the built-in token](#Push-a-commit-to-a-PR-using-the-built-in-token) ## Fetch only the root files @@ -288,6 +289,31 @@ jobs: ``` *NOTE:* The user email is `{user.id}+{user.login}@users.noreply.github.com`. See users API: https://api.github.com/users/github-actions%5Bbot%5D +## Push a commit to a PR using the built-in token + +In a pull request trigger, `ref` is required as GitHub Actions checks out in detached HEAD mode, meaning it doesn’t check out your branch by default. + +```yaml +on: pull_request +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + - run: | + date > generated.txt + # Note: the following account information will not work on GHES + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add . + git commit -m "generated" + git push +``` +*NOTE:* The user email is `{user.id}+{user.login}@users.noreply.github.com`. See users API: https://api.github.com/users/github-actions%5Bbot%5D + + # License The scripts and documentation in this project are released under the [MIT License](LICENSE) From cbb722410c2e876e24abbe8de2cc27693e501dcb Mon Sep 17 00:00:00 2001 From: Mohammad Ismail <96207520+mouismail@users.noreply.github.com> Date: Thu, 14 Nov 2024 16:41:00 +0100 Subject: [PATCH 16/18] Update README.md (#1977) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a43e887..b0f6224 100644 --- a/README.md +++ b/README.md @@ -212,7 +212,7 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/ repository: my-org/my-tools path: my-tools ``` -> - If your secondary repository is private you will need to add the option noted in [Checkout multiple repos (private)](#Checkout-multiple-repos-private) +> - If your secondary repository is private or internal you will need to add the option noted in [Checkout multiple repos (private)](#Checkout-multiple-repos-private) ## Checkout multiple repos (nested) @@ -226,7 +226,7 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/ repository: my-org/my-tools path: my-tools ``` -> - If your secondary repository is private you will need to add the option noted in [Checkout multiple repos (private)](#Checkout-multiple-repos-private) +> - If your secondary repository is private or internal you will need to add the option noted in [Checkout multiple repos (private)](#Checkout-multiple-repos-private) ## Checkout multiple repos (private) From 009b9ae9e446ad8d9b8c809870b0fbcc5e03573e Mon Sep 17 00:00:00 2001 From: Ben Wells Date: Thu, 16 Jan 2025 14:14:48 -0500 Subject: [PATCH 17/18] Documentation update - add recommended permissions to Readme (#2043) * Update README.md * Update README.md Co-authored-by: Josh Gross --------- Co-authored-by: Josh Gross --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index b0f6224..f28fec7 100644 --- a/README.md +++ b/README.md @@ -311,6 +311,16 @@ jobs: git commit -m "generated" git push ``` + +## Recommended permissions + +When using the `checkout` action in your GitHub Actions workflow, it is recommended to set the following `GITHUB_TOKEN` permissions to ensure proper functionality, unless alternative auth is provided via the `token` or `ssh-key` inputs: + +```yaml +permissions: + contents: read +``` + *NOTE:* The user email is `{user.id}+{user.login}@users.noreply.github.com`. See users API: https://api.github.com/users/github-actions%5Bbot%5D From 85e6279cec87321a52edac9c87bce653a07cf6c2 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Thu, 16 Jan 2025 15:56:18 -0500 Subject: [PATCH 18/18] Adjust positioning of user email note and permissions heading (#2044) --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f28fec7..64dc025 100644 --- a/README.md +++ b/README.md @@ -312,7 +312,9 @@ jobs: git push ``` -## Recommended permissions +*NOTE:* The user email is `{user.id}+{user.login}@users.noreply.github.com`. See users API: https://api.github.com/users/github-actions%5Bbot%5D + +# Recommended permissions When using the `checkout` action in your GitHub Actions workflow, it is recommended to set the following `GITHUB_TOKEN` permissions to ensure proper functionality, unless alternative auth is provided via the `token` or `ssh-key` inputs: @@ -321,9 +323,6 @@ permissions: contents: read ``` -*NOTE:* The user email is `{user.id}+{user.login}@users.noreply.github.com`. See users API: https://api.github.com/users/github-actions%5Bbot%5D - - # License The scripts and documentation in this project are released under the [MIT License](LICENSE)