mirror of
				https://github.com/actions/checkout.git
				synced 2025-11-04 15:58:09 +08:00 
			
		
		
		
	Compare commits
	
		
			3 Commits
		
	
	
		
			68a03db899
			...
			v4.2.2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					11bd71901b | ||
| 
						 | 
					e3d2460bbb | ||
| 
						 | 
					163217dfcd | 
@@ -1,5 +1,9 @@
 | 
				
			|||||||
# Changelog
 | 
					# 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
 | 
					## 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
 | 
					* Check out other refs/* by commit if provided, fall back to ref by @orhantoy in https://github.com/actions/checkout/pull/1924
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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')
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
							
								
								
									
										48
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										48
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							@@ -2454,22 +2454,50 @@ function getFetchUrl(settings) {
 | 
				
			|||||||
    return `${serviceUrl.origin}/${encodedOwner}/${encodedName}`;
 | 
					    return `${serviceUrl.origin}/${encodedOwner}/${encodedName}`;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
function getServerUrl(url) {
 | 
					function getServerUrl(url) {
 | 
				
			||||||
    let urlValue = url && url.trim().length > 0
 | 
					    let resolvedUrl = process.env['GITHUB_SERVER_URL'] || 'https://github.com';
 | 
				
			||||||
        ? url
 | 
					    if (hasContent(url, WhitespaceMode.Trim)) {
 | 
				
			||||||
        : process.env['GITHUB_SERVER_URL'] || 'https://github.com';
 | 
					        resolvedUrl = url;
 | 
				
			||||||
    return new url_1.URL(urlValue);
 | 
					    }
 | 
				
			||||||
 | 
					    return new url_1.URL(resolvedUrl);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
function getServerApiUrl(url) {
 | 
					function getServerApiUrl(url) {
 | 
				
			||||||
    let apiUrl = 'https://api.github.com';
 | 
					    if (hasContent(url, WhitespaceMode.Trim)) {
 | 
				
			||||||
 | 
					        let serverUrl = getServerUrl(url);
 | 
				
			||||||
        if (isGhes(url)) {
 | 
					        if (isGhes(url)) {
 | 
				
			||||||
        const serverUrl = getServerUrl(url);
 | 
					            serverUrl.pathname = 'api/v3';
 | 
				
			||||||
        apiUrl = new url_1.URL(`${serverUrl.origin}/api/v3`).toString();
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    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) {
 | 
					function isGhes(url) {
 | 
				
			||||||
    const ghUrl = getServerUrl(url);
 | 
					    const ghUrl = new url_1.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, 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;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -1,12 +1,12 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "checkout",
 | 
					  "name": "checkout",
 | 
				
			||||||
  "version": "4.2.1",
 | 
					  "version": "4.2.2",
 | 
				
			||||||
  "lockfileVersion": 3,
 | 
					  "lockfileVersion": 3,
 | 
				
			||||||
  "requires": true,
 | 
					  "requires": true,
 | 
				
			||||||
  "packages": {
 | 
					  "packages": {
 | 
				
			||||||
    "": {
 | 
					    "": {
 | 
				
			||||||
      "name": "checkout",
 | 
					      "name": "checkout",
 | 
				
			||||||
      "version": "4.2.1",
 | 
					      "version": "4.2.2",
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@actions/core": "^1.10.1",
 | 
					        "@actions/core": "^1.10.1",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "checkout",
 | 
					  "name": "checkout",
 | 
				
			||||||
  "version": "4.2.1",
 | 
					  "version": "4.2.2",
 | 
				
			||||||
  "description": "checkout action",
 | 
					  "description": "checkout action",
 | 
				
			||||||
  "main": "lib/main.js",
 | 
					  "main": "lib/main.js",
 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,26 +21,61 @@ export function getFetchUrl(settings: IGitSourceSettings): string {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function getServerUrl(url?: string): URL {
 | 
					export function getServerUrl(url?: string): URL {
 | 
				
			||||||
  let urlValue =
 | 
					  let resolvedUrl = process.env['GITHUB_SERVER_URL'] || 'https://github.com'
 | 
				
			||||||
    url && url.trim().length > 0
 | 
					  if (hasContent(url, WhitespaceMode.Trim)) {
 | 
				
			||||||
      ? url
 | 
					    resolvedUrl = url!
 | 
				
			||||||
      : process.env['GITHUB_SERVER_URL'] || 'https://github.com'
 | 
					  }
 | 
				
			||||||
  return new URL(urlValue)
 | 
					
 | 
				
			||||||
 | 
					  return new URL(resolvedUrl)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function getServerApiUrl(url?: string): string {
 | 
					export function getServerApiUrl(url?: string): string {
 | 
				
			||||||
  let apiUrl = 'https://api.github.com'
 | 
					  if (hasContent(url, WhitespaceMode.Trim)) {
 | 
				
			||||||
 | 
					    let serverUrl = getServerUrl(url)
 | 
				
			||||||
    if (isGhes(url)) {
 | 
					    if (isGhes(url)) {
 | 
				
			||||||
    const serverUrl = getServerUrl(url)
 | 
					      serverUrl.pathname = 'api/v3'
 | 
				
			||||||
    apiUrl = new URL(`${serverUrl.origin}/api/v3`).toString()
 | 
					    } 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 {
 | 
					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