mirror of
				https://github.com/actions/checkout.git
				synced 2025-11-04 07:48:09 +08:00 
			
		
		
		
	Compare commits
	
		
			9 Commits
		
	
	
		
			v4.2.0
			...
			dependabot
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					65935fcf40 | ||
| 
						 | 
					cbb722410c | ||
| 
						 | 
					3b9b8c884f | ||
| 
						 | 
					11bd71901b | ||
| 
						 | 
					e3d2460bbb | ||
| 
						 | 
					163217dfcd | ||
| 
						 | 
					eef61447b9 | ||
| 
						 | 
					6b42224f41 | ||
| 
						 | 
					de5a000abf | 
							
								
								
									
										20
									
								
								.github/workflows/publish-immutable-actions.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.github/workflows/publish-immutable-actions.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
@@ -1,5 +1,12 @@
 | 
			
		||||
# 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
 | 
			
		||||
 | 
			
		||||
## v4.2.0
 | 
			
		||||
 | 
			
		||||
* Add Ref and Commit outputs by @lucacome in https://github.com/actions/checkout/pull/1180
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										30
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								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
 | 
			
		||||
 | 
			
		||||
@@ -211,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)
 | 
			
		||||
 | 
			
		||||
@@ -225,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)
 | 
			
		||||
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										92
									
								
								__test__/url-helper.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								__test__/url-helper.test.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,92 @@
 | 
			
		||||
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', () => {
 | 
			
		||||
  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', () => {
 | 
			
		||||
  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')
 | 
			
		||||
  })
 | 
			
		||||
})
 | 
			
		||||
							
								
								
									
										52
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							@@ -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 {
 | 
			
		||||
@@ -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 (hasContent(url, WhitespaceMode.Trim)) {
 | 
			
		||||
        let serverUrl = getServerUrl(url);
 | 
			
		||||
        if (isGhes(url)) {
 | 
			
		||||
        const serverUrl = getServerUrl(url);
 | 
			
		||||
        apiUrl = new url_1.URL(`${serverUrl.origin}/api/v3`).toString();
 | 
			
		||||
            serverUrl.pathname = 'api/v3';
 | 
			
		||||
        }
 | 
			
		||||
    return apiUrl;
 | 
			
		||||
        else {
 | 
			
		||||
            serverUrl.hostname = 'api.' + serverUrl.hostname;
 | 
			
		||||
        }
 | 
			
		||||
        return pruneSuffix(serverUrl.toString(), '/');
 | 
			
		||||
    }
 | 
			
		||||
    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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										70
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										70
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -1,15 +1,15 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "checkout",
 | 
			
		||||
  "version": "4.2.0",
 | 
			
		||||
  "version": "4.2.2",
 | 
			
		||||
  "lockfileVersion": 3,
 | 
			
		||||
  "requires": true,
 | 
			
		||||
  "packages": {
 | 
			
		||||
    "": {
 | 
			
		||||
      "name": "checkout",
 | 
			
		||||
      "version": "4.2.0",
 | 
			
		||||
      "version": "4.2.2",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@actions/core": "^1.10.1",
 | 
			
		||||
        "@actions/core": "^1.11.1",
 | 
			
		||||
        "@actions/exec": "^1.1.1",
 | 
			
		||||
        "@actions/github": "^6.0.0",
 | 
			
		||||
        "@actions/io": "^1.1.3",
 | 
			
		||||
@@ -17,21 +17,21 @@
 | 
			
		||||
        "uuid": "^9.0.1"
 | 
			
		||||
      },
 | 
			
		||||
      "devDependencies": {
 | 
			
		||||
        "@types/jest": "^29.5.12",
 | 
			
		||||
        "@types/jest": "^29.5.14",
 | 
			
		||||
        "@types/node": "^20.12.12",
 | 
			
		||||
        "@types/uuid": "^9.0.8",
 | 
			
		||||
        "@typescript-eslint/eslint-plugin": "^7.9.0",
 | 
			
		||||
        "@typescript-eslint/parser": "^7.9.0",
 | 
			
		||||
        "@vercel/ncc": "^0.38.1",
 | 
			
		||||
        "@vercel/ncc": "^0.38.3",
 | 
			
		||||
        "eslint": "^8.57.0",
 | 
			
		||||
        "eslint-plugin-github": "^4.10.2",
 | 
			
		||||
        "eslint-plugin-jest": "^28.8.2",
 | 
			
		||||
        "eslint-plugin-jest": "^28.9.0",
 | 
			
		||||
        "jest": "^29.7.0",
 | 
			
		||||
        "jest-circus": "^29.7.0",
 | 
			
		||||
        "js-yaml": "^4.1.0",
 | 
			
		||||
        "prettier": "^3.3.3",
 | 
			
		||||
        "prettier": "^3.4.1",
 | 
			
		||||
        "ts-jest": "^29.2.5",
 | 
			
		||||
        "typescript": "^5.5.4"
 | 
			
		||||
        "typescript": "^5.7.2"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@aashutoshrathi/word-wrap": {
 | 
			
		||||
@@ -44,20 +44,13 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@actions/core": {
 | 
			
		||||
      "version": "1.10.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.1.tgz",
 | 
			
		||||
      "integrity": "sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==",
 | 
			
		||||
      "version": "1.11.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz",
 | 
			
		||||
      "integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@actions/http-client": "^2.0.1",
 | 
			
		||||
        "uuid": "^8.3.2"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@actions/core/node_modules/uuid": {
 | 
			
		||||
      "version": "8.3.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
 | 
			
		||||
      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "uuid": "dist/bin/uuid"
 | 
			
		||||
        "@actions/exec": "^1.1.1",
 | 
			
		||||
        "@actions/http-client": "^2.0.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@actions/exec": {
 | 
			
		||||
@@ -1572,10 +1565,11 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@types/jest": {
 | 
			
		||||
      "version": "29.5.12",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz",
 | 
			
		||||
      "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==",
 | 
			
		||||
      "version": "29.5.14",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz",
 | 
			
		||||
      "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "expect": "^29.0.0",
 | 
			
		||||
        "pretty-format": "^29.0.0"
 | 
			
		||||
@@ -1827,10 +1821,11 @@
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@vercel/ncc": {
 | 
			
		||||
      "version": "0.38.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.1.tgz",
 | 
			
		||||
      "integrity": "sha512-IBBb+iI2NLu4VQn3Vwldyi2QwaXt5+hTyh58ggAMoCGE6DJmPvwL3KPBWcJl1m9LYPChBLE980Jw+CS4Wokqxw==",
 | 
			
		||||
      "version": "0.38.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.3.tgz",
 | 
			
		||||
      "integrity": "sha512-rnK6hJBS6mwc+Bkab+PGPs9OiS0i/3kdTO+CkI8V0/VrW3vmz7O2Pxjw/owOlmo6PKEIxRSeZKv/kuL9itnpYA==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "ncc": "dist/ncc/cli.js"
 | 
			
		||||
      }
 | 
			
		||||
@@ -3218,10 +3213,11 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/eslint-plugin-jest": {
 | 
			
		||||
      "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==",
 | 
			
		||||
      "version": "28.9.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.9.0.tgz",
 | 
			
		||||
      "integrity": "sha512-rLu1s1Wf96TgUUxSw6loVIkNtUjq1Re7A9QdCCHSohnvXEBAjuL420h0T/fMmkQlNsQP2GhQzEUpYHPfxBkvYQ==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0"
 | 
			
		||||
      },
 | 
			
		||||
@@ -5978,10 +5974,11 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/prettier": {
 | 
			
		||||
      "version": "3.3.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
 | 
			
		||||
      "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
 | 
			
		||||
      "version": "3.4.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz",
 | 
			
		||||
      "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "prettier": "bin/prettier.cjs"
 | 
			
		||||
      },
 | 
			
		||||
@@ -6902,10 +6899,11 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/typescript": {
 | 
			
		||||
      "version": "5.5.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
 | 
			
		||||
      "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
 | 
			
		||||
      "version": "5.7.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz",
 | 
			
		||||
      "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "tsc": "bin/tsc",
 | 
			
		||||
        "tsserver": "bin/tsserver"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								package.json
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "checkout",
 | 
			
		||||
  "version": "4.2.0",
 | 
			
		||||
  "version": "4.2.2",
 | 
			
		||||
  "description": "checkout action",
 | 
			
		||||
  "main": "lib/main.js",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
@@ -28,7 +28,7 @@
 | 
			
		||||
  },
 | 
			
		||||
  "homepage": "https://github.com/actions/checkout#readme",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@actions/core": "^1.10.1",
 | 
			
		||||
    "@actions/core": "^1.11.1",
 | 
			
		||||
    "@actions/exec": "^1.1.1",
 | 
			
		||||
    "@actions/github": "^6.0.0",
 | 
			
		||||
    "@actions/io": "^1.1.3",
 | 
			
		||||
@@ -36,20 +36,20 @@
 | 
			
		||||
    "uuid": "^9.0.1"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@types/jest": "^29.5.12",
 | 
			
		||||
    "@types/jest": "^29.5.14",
 | 
			
		||||
    "@types/node": "^20.12.12",
 | 
			
		||||
    "@types/uuid": "^9.0.8",
 | 
			
		||||
    "@typescript-eslint/eslint-plugin": "^7.9.0",
 | 
			
		||||
    "@typescript-eslint/parser": "^7.9.0",
 | 
			
		||||
    "@vercel/ncc": "^0.38.1",
 | 
			
		||||
    "@vercel/ncc": "^0.38.3",
 | 
			
		||||
    "eslint": "^8.57.0",
 | 
			
		||||
    "eslint-plugin-github": "^4.10.2",
 | 
			
		||||
    "eslint-plugin-jest": "^28.8.2",
 | 
			
		||||
    "eslint-plugin-jest": "^28.9.0",
 | 
			
		||||
    "jest": "^29.7.0",
 | 
			
		||||
    "jest-circus": "^29.7.0",
 | 
			
		||||
    "js-yaml": "^4.1.0",
 | 
			
		||||
    "prettier": "^3.3.3",
 | 
			
		||||
    "prettier": "^3.4.1",
 | 
			
		||||
    "ts-jest": "^29.2.5",
 | 
			
		||||
    "typescript": "^5.5.4"
 | 
			
		||||
    "typescript": "^5.7.2"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -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)) {
 | 
			
		||||
    const serverUrl = getServerUrl(url)
 | 
			
		||||
    apiUrl = new URL(`${serverUrl.origin}/api/v3`).toString()
 | 
			
		||||
      serverUrl.pathname = 'api/v3'
 | 
			
		||||
    } else {
 | 
			
		||||
      serverUrl.hostname = 'api.' + serverUrl.hostname
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return apiUrl
 | 
			
		||||
    return pruneSuffix(serverUrl.toString(), '/')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user