Merge 5b61398e30af089f8a69c2fcc9ee075e46f5289f into 9a9194f87191a7e9055e3e9b95b8cfb13023bb08

This commit is contained in:
CHANX 2024-07-30 10:00:25 +03:00 committed by GitHub
commit 8a5cb8f33e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 72 additions and 12 deletions

View File

@ -123,8 +123,9 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
# 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
# running from unless specified. Also support URL pathname except SSH (`ssh-key`
# not specified). Example URLs are https://github.com or
# https://my-ghes-server.example.com or https://my-ghes-server.example.com/git/
github-server-url: ''
```
<!-- end usage -->

View File

@ -0,0 +1,46 @@
import * as urlHelper from '../lib/url-helper'
import { IGitSourceSettings } from '../lib/git-source-settings';
function getSettings(u: string): IGitSourceSettings {
return {
githubServerUrl: u,
repositoryPath: '',
repositoryOwner: 'some-owner',
repositoryName: 'some-name',
ref: '', commit: '', clean: false, filter: undefined,
sparseCheckout: [], sparseCheckoutConeMode: false,
fetchDepth: 0, fetchTags: false, showProgress: false,
lfs: false, submodules: false, nestedSubmodules: false,
authToken: '', sshKey: '', sshKnownHosts: '', sshStrict: false,
persistCredentials: false, workflowOrganizationId: undefined,
setSafeDirectory: false
}
}
describe('url-helper tests', () => {
it('getFetchUrl works on GitHub repos', async () => {
expect(urlHelper.getFetchUrl(getSettings('https://github.com'))).toBe(
"https://github.com/some-owner/some-name"
)
})
it('getFetchUrl works on 3rd party repos with sub-path', async () => {
expect(urlHelper.getFetchUrl(getSettings('https://other.com/subpath'))).toBe(
'https://other.com/subpath/some-owner/some-name'
)
})
it('getFetchUrl works on 3rd party repos with ssh keys', async () => {
expect(urlHelper.getFetchUrl(getSettings('https://other.com/subpath'))).toBe(
'https://other.com/subpath/some-owner/some-name'
)
})
it('getFetchUrl works with ssh credentials', async () => {
let settings = getSettings('https://other.com/subpath');
settings.sshKey = 'not-empty'
expect(urlHelper.getFetchUrl(settings)).toBe(
'git@other.com:some-owner/some-name.git'
)
})
})

View File

@ -96,7 +96,7 @@ inputs:
description: Add repository path as safe.directory for Git global config by running `git config --global --add safe.directory <path>`
default: true
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
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. Also support URL pathname except SSH (`ssh-key` not specified). Example URLs are https://github.com or https://my-ghes-server.example.com or https://my-ghes-server.example.com/git/
required: false
runs:
using: node20

17
dist/index.js vendored
View File

@ -168,13 +168,14 @@ class GitAuthHelper {
this.settings = gitSourceSettings || {};
// Token auth header
const serverUrl = urlHelper.getServerUrl(this.settings.githubServerUrl);
this.tokenConfigKey = `http.${serverUrl.origin}/.extraheader`; // "origin" is SCHEME://HOSTNAME[:PORT]
const baseURL = urlHelper.getBaseUrl(serverUrl.href);
this.tokenConfigKey = `http.${baseURL}/.extraheader`; // "origin" is SCHEME://HOSTNAME[:PORT]
const basicCredential = Buffer.from(`x-access-token:${this.settings.authToken}`, 'utf8').toString('base64');
core.setSecret(basicCredential);
this.tokenPlaceholderConfigValue = `AUTHORIZATION: basic ***`;
this.tokenConfigValue = `AUTHORIZATION: basic ${basicCredential}`;
// Instead of SSH URL
this.insteadOfKey = `url.${serverUrl.origin}/.insteadOf`; // "origin" is SCHEME://HOSTNAME[:PORT]
this.insteadOfKey = `url.${baseURL}/.insteadOf`; // "origin" is SCHEME://HOSTNAME[:PORT]
this.insteadOfValues.push(`git@${serverUrl.hostname}:`);
if (this.settings.workflowOrganizationId) {
this.insteadOfValues.push(`org-${this.settings.workflowOrganizationId}@github.com:`);
@ -2439,7 +2440,7 @@ 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.isGhes = exports.getServerApiUrl = exports.getBaseUrl = exports.getServerUrl = exports.getFetchUrl = void 0;
const assert = __importStar(__nccwpck_require__(9491));
const url_1 = __nccwpck_require__(7310);
function getFetchUrl(settings) {
@ -2453,16 +2454,22 @@ function getFetchUrl(settings) {
return `${user}@${serviceUrl.hostname}:${encodedOwner}/${encodedName}.git`;
}
// "origin" is SCHEME://HOSTNAME[:PORT]
return `${serviceUrl.origin}/${encodedOwner}/${encodedName}`;
const baseURL = getBaseUrl(serviceUrl.href);
return `${baseURL}/${encodedOwner}/${encodedName}`;
}
exports.getFetchUrl = getFetchUrl;
function getServerUrl(url) {
let urlValue = url && url.trim().length > 0
const 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 getBaseUrl(url) {
const matcher = url.match(/^[^?]+/);
return (matcher && matcher[0].replace(/\/+$/g, '')) || '';
}
exports.getBaseUrl = getBaseUrl;
function getServerApiUrl(url) {
let apiUrl = 'https://api.github.com';
if (isGhes(url)) {

View File

@ -53,7 +53,8 @@ class GitAuthHelper {
// Token auth header
const serverUrl = urlHelper.getServerUrl(this.settings.githubServerUrl)
this.tokenConfigKey = `http.${serverUrl.origin}/.extraheader` // "origin" is SCHEME://HOSTNAME[:PORT]
const baseURL = urlHelper.getBaseUrl(serverUrl.href)
this.tokenConfigKey = `http.${baseURL}/.extraheader` // "origin" is SCHEME://HOSTNAME[:PORT]
const basicCredential = Buffer.from(
`x-access-token:${this.settings.authToken}`,
'utf8'
@ -63,7 +64,7 @@ class GitAuthHelper {
this.tokenConfigValue = `AUTHORIZATION: basic ${basicCredential}`
// Instead of SSH URL
this.insteadOfKey = `url.${serverUrl.origin}/.insteadOf` // "origin" is SCHEME://HOSTNAME[:PORT]
this.insteadOfKey = `url.${baseURL}/.insteadOf` // "origin" is SCHEME://HOSTNAME[:PORT]
this.insteadOfValues.push(`git@${serverUrl.hostname}:`)
if (this.settings.workflowOrganizationId) {
this.insteadOfValues.push(

View File

@ -17,17 +17,22 @@ export function getFetchUrl(settings: IGitSourceSettings): string {
}
// "origin" is SCHEME://HOSTNAME[:PORT]
return `${serviceUrl.origin}/${encodedOwner}/${encodedName}`
const baseURL = getBaseUrl(serviceUrl)
return `${baseURL}/${encodedOwner}/${encodedName}`
}
export function getServerUrl(url?: string): URL {
let urlValue =
const urlValue =
url && url.trim().length > 0
? url
: process.env['GITHUB_SERVER_URL'] || 'https://github.com'
return new URL(urlValue)
}
function getBaseUrl(u: URL) {
return u.protocol + "//" + u.host + u.pathname.replace(/\/+$/g, '');
}
export function getServerApiUrl(url?: string): string {
let apiUrl = 'https://api.github.com'