mirror of
https://github.com/actions/checkout.git
synced 2025-07-02 00:10:46 +02:00
Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
28c7f3d2b5 | |||
fb6f360df2 | |||
b4483adec3 | |||
00a3be8934 | |||
453ee27fca | |||
65865e15a1 |
11
CHANGELOG.md
11
CHANGELOG.md
@ -1,9 +1,20 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## v2.3.1
|
||||||
|
|
||||||
|
- [Fix default branch resolution for .wiki and when using SSH](https://github.com/actions/checkout/pull/284)
|
||||||
|
|
||||||
|
|
||||||
|
## v2.3.0
|
||||||
|
|
||||||
|
- [Fallback to the default branch](https://github.com/actions/checkout/pull/278)
|
||||||
|
|
||||||
## v2.2.0
|
## v2.2.0
|
||||||
|
|
||||||
- [Fetch all history for all tags and branches when fetch-depth=0](https://github.com/actions/checkout/pull/258)
|
- [Fetch all history for all tags and branches when fetch-depth=0](https://github.com/actions/checkout/pull/258)
|
||||||
|
|
||||||
## v2.1.1
|
## v2.1.1
|
||||||
|
|
||||||
- Changes to support GHES ([here](https://github.com/actions/checkout/pull/236) and [here](https://github.com/actions/checkout/pull/248))
|
- Changes to support GHES ([here](https://github.com/actions/checkout/pull/236) and [here](https://github.com/actions/checkout/pull/248))
|
||||||
|
|
||||||
## v2.1.0
|
## v2.1.0
|
||||||
|
@ -42,7 +42,7 @@ Refer [here](https://github.com/actions/checkout/blob/v1/README.md) for previous
|
|||||||
|
|
||||||
# The branch, tag or SHA to checkout. When checking out the repository that
|
# The branch, tag or SHA to checkout. When checking out the repository that
|
||||||
# triggered a workflow, this defaults to the reference or SHA for that event.
|
# triggered a workflow, this defaults to the reference or SHA for that event.
|
||||||
# Otherwise, defaults to `master`.
|
# Otherwise, uses the default branch.
|
||||||
ref: ''
|
ref: ''
|
||||||
|
|
||||||
# Personal access token (PAT) used to fetch the repository. The PAT is configured
|
# Personal access token (PAT) used to fetch the repository. The PAT is configured
|
||||||
|
@ -714,6 +714,7 @@ async function setup(testName: string): Promise<void> {
|
|||||||
),
|
),
|
||||||
env: {},
|
env: {},
|
||||||
fetch: jest.fn(),
|
fetch: jest.fn(),
|
||||||
|
getDefaultBranch: jest.fn(),
|
||||||
getWorkingDirectory: jest.fn(() => workspace),
|
getWorkingDirectory: jest.fn(() => workspace),
|
||||||
init: jest.fn(),
|
init: jest.fn(),
|
||||||
isDetached: jest.fn(),
|
isDetached: jest.fn(),
|
||||||
|
@ -408,6 +408,7 @@ async function setup(testName: string): Promise<void> {
|
|||||||
config: jest.fn(),
|
config: jest.fn(),
|
||||||
configExists: jest.fn(),
|
configExists: jest.fn(),
|
||||||
fetch: jest.fn(),
|
fetch: jest.fn(),
|
||||||
|
getDefaultBranch: jest.fn(),
|
||||||
getWorkingDirectory: jest.fn(() => repositoryPath),
|
getWorkingDirectory: jest.fn(() => repositoryPath),
|
||||||
init: jest.fn(),
|
init: jest.fn(),
|
||||||
isDetached: jest.fn(),
|
isDetached: jest.fn(),
|
||||||
|
@ -110,13 +110,6 @@ describe('input-helper tests', () => {
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('sets correct default ref/sha for other repo', () => {
|
|
||||||
inputs.repository = 'some-owner/some-other-repo'
|
|
||||||
const settings: IGitSourceSettings = inputHelper.getInputs()
|
|
||||||
expect(settings.ref).toBe('refs/heads/master')
|
|
||||||
expect(settings.commit).toBeFalsy()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('sets ref to empty when explicit sha', () => {
|
it('sets ref to empty when explicit sha', () => {
|
||||||
inputs.ref = '1111111111222222222233333333334444444444'
|
inputs.ref = '1111111111222222222233333333334444444444'
|
||||||
const settings: IGitSourceSettings = inputHelper.getInputs()
|
const settings: IGitSourceSettings = inputHelper.getInputs()
|
||||||
|
@ -12,6 +12,6 @@ if [[ "$(git status --porcelain)" != "" ]]; then
|
|||||||
echo ----------------------------------------
|
echo ----------------------------------------
|
||||||
echo Troubleshooting
|
echo Troubleshooting
|
||||||
echo ----------------------------------------
|
echo ----------------------------------------
|
||||||
echo "::error::Unstaged changes detected. Locally try running: git clean -ffdx && npm ci && npm run all"
|
echo "::error::Unstaged changes detected. Locally try running: git clean -ffdx && npm ci && npm run format && npm run build"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
@ -8,7 +8,7 @@ inputs:
|
|||||||
description: >
|
description: >
|
||||||
The branch, tag or SHA to checkout. When checking out the repository that
|
The branch, tag or SHA to checkout. When checking out the repository that
|
||||||
triggered a workflow, this defaults to the reference or SHA for that
|
triggered a workflow, this defaults to the reference or SHA for that
|
||||||
event. Otherwise, defaults to `master`.
|
event. Otherwise, uses the default branch.
|
||||||
token:
|
token:
|
||||||
description: >
|
description: >
|
||||||
Personal access token (PAT) used to fetch the repository. The PAT is configured
|
Personal access token (PAT) used to fetch the repository. The PAT is configured
|
||||||
|
84
dist/index.js
vendored
84
dist/index.js
vendored
@ -5827,6 +5827,33 @@ class GitCommandManager {
|
|||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
getDefaultBranch(repositoryUrl) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
let output;
|
||||||
|
yield retryHelper.execute(() => __awaiter(this, void 0, void 0, function* () {
|
||||||
|
output = yield this.execGit([
|
||||||
|
'ls-remote',
|
||||||
|
'--quiet',
|
||||||
|
'--exit-code',
|
||||||
|
'--symref',
|
||||||
|
repositoryUrl,
|
||||||
|
'HEAD'
|
||||||
|
]);
|
||||||
|
}));
|
||||||
|
if (output) {
|
||||||
|
// Satisfy compiler, will always be set
|
||||||
|
for (let line of output.stdout.trim().split('\n')) {
|
||||||
|
line = line.trim();
|
||||||
|
if (line.startsWith('ref:') || line.endsWith('HEAD')) {
|
||||||
|
return line
|
||||||
|
.substr('ref:'.length, line.length - 'ref:'.length - 'HEAD'.length)
|
||||||
|
.trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new Error('Unexpected output when retrieving default branch');
|
||||||
|
});
|
||||||
|
}
|
||||||
getWorkingDirectory() {
|
getWorkingDirectory() {
|
||||||
return this.workingDirectory;
|
return this.workingDirectory;
|
||||||
}
|
}
|
||||||
@ -6166,6 +6193,17 @@ function getSource(settings) {
|
|||||||
core.startGroup('Setting up auth');
|
core.startGroup('Setting up auth');
|
||||||
yield authHelper.configureAuth();
|
yield authHelper.configureAuth();
|
||||||
core.endGroup();
|
core.endGroup();
|
||||||
|
// Determine the default branch
|
||||||
|
if (!settings.ref && !settings.commit) {
|
||||||
|
core.startGroup('Determining the default branch');
|
||||||
|
if (settings.sshKey) {
|
||||||
|
settings.ref = yield git.getDefaultBranch(repositoryUrl);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
settings.ref = yield githubApiHelper.getDefaultBranch(settings.authToken, settings.repositoryOwner, settings.repositoryName);
|
||||||
|
}
|
||||||
|
core.endGroup();
|
||||||
|
}
|
||||||
// LFS install
|
// LFS install
|
||||||
if (settings.lfs) {
|
if (settings.lfs) {
|
||||||
yield git.lfsInstall();
|
yield git.lfsInstall();
|
||||||
@ -9525,6 +9563,11 @@ const v4_1 = __importDefault(__webpack_require__(826));
|
|||||||
const IS_WINDOWS = process.platform === 'win32';
|
const IS_WINDOWS = process.platform === 'win32';
|
||||||
function downloadRepository(authToken, owner, repo, ref, commit, repositoryPath) {
|
function downloadRepository(authToken, owner, repo, ref, commit, repositoryPath) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
// Determine the default branch
|
||||||
|
if (!ref && !commit) {
|
||||||
|
core.info('Determining the default branch');
|
||||||
|
ref = yield getDefaultBranch(authToken, owner, repo);
|
||||||
|
}
|
||||||
// Download the archive
|
// Download the archive
|
||||||
let archiveData = yield retryHelper.execute(() => __awaiter(this, void 0, void 0, function* () {
|
let archiveData = yield retryHelper.execute(() => __awaiter(this, void 0, void 0, function* () {
|
||||||
core.info('Downloading the archive');
|
core.info('Downloading the archive');
|
||||||
@ -9569,6 +9612,42 @@ function downloadRepository(authToken, owner, repo, ref, commit, repositoryPath)
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.downloadRepository = downloadRepository;
|
exports.downloadRepository = downloadRepository;
|
||||||
|
/**
|
||||||
|
* Looks up the default branch name
|
||||||
|
*/
|
||||||
|
function getDefaultBranch(authToken, owner, repo) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
return yield retryHelper.execute(() => __awaiter(this, void 0, void 0, function* () {
|
||||||
|
core.info('Retrieving the default branch name');
|
||||||
|
const octokit = new github.GitHub(authToken);
|
||||||
|
let result;
|
||||||
|
try {
|
||||||
|
// Get the default branch from the repo info
|
||||||
|
const response = yield octokit.repos.get({ owner, repo });
|
||||||
|
result = response.data.default_branch;
|
||||||
|
assert.ok(result, 'default_branch cannot be empty');
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
// Handle .wiki repo
|
||||||
|
if (err['status'] === 404 && repo.toUpperCase().endsWith('.WIKI')) {
|
||||||
|
result = 'master';
|
||||||
|
}
|
||||||
|
// Otherwise error
|
||||||
|
else {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Print the default branch
|
||||||
|
core.info(`Default branch '${result}'`);
|
||||||
|
// Prefix with 'refs/heads'
|
||||||
|
if (!result.startsWith('refs/')) {
|
||||||
|
result = `refs/heads/${result}`;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.getDefaultBranch = getDefaultBranch;
|
||||||
function downloadArchive(authToken, owner, repo, ref, commit) {
|
function downloadArchive(authToken, owner, repo, ref, commit) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const octokit = new github.GitHub(authToken);
|
const octokit = new github.GitHub(authToken);
|
||||||
@ -14471,9 +14550,6 @@ function getInputs() {
|
|||||||
result.ref = `refs/heads/${result.ref}`;
|
result.ref = `refs/heads/${result.ref}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!result.ref && !result.commit) {
|
|
||||||
result.ref = 'refs/heads/master';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// SHA?
|
// SHA?
|
||||||
else if (result.ref.match(/^[0-9a-fA-F]{40}$/)) {
|
else if (result.ref.match(/^[0-9a-fA-F]{40}$/)) {
|
||||||
@ -14508,7 +14584,7 @@ function getInputs() {
|
|||||||
core.debug(`submodules = ${result.submodules}`);
|
core.debug(`submodules = ${result.submodules}`);
|
||||||
core.debug(`recursive submodules = ${result.nestedSubmodules}`);
|
core.debug(`recursive submodules = ${result.nestedSubmodules}`);
|
||||||
// Auth token
|
// Auth token
|
||||||
result.authToken = core.getInput('token');
|
result.authToken = core.getInput('token', { required: true });
|
||||||
// SSH
|
// SSH
|
||||||
result.sshKey = core.getInput('ssh-key');
|
result.sshKey = core.getInput('ssh-key');
|
||||||
result.sshKnownHosts = core.getInput('ssh-known-hosts');
|
result.sshKnownHosts = core.getInput('ssh-known-hosts');
|
||||||
|
@ -25,6 +25,7 @@ export interface IGitCommandManager {
|
|||||||
): Promise<void>
|
): Promise<void>
|
||||||
configExists(configKey: string, globalConfig?: boolean): Promise<boolean>
|
configExists(configKey: string, globalConfig?: boolean): Promise<boolean>
|
||||||
fetch(refSpec: string[], fetchDepth?: number): Promise<void>
|
fetch(refSpec: string[], fetchDepth?: number): Promise<void>
|
||||||
|
getDefaultBranch(repositoryUrl: string): Promise<string>
|
||||||
getWorkingDirectory(): string
|
getWorkingDirectory(): string
|
||||||
init(): Promise<void>
|
init(): Promise<void>
|
||||||
isDetached(): Promise<boolean>
|
isDetached(): Promise<boolean>
|
||||||
@ -195,6 +196,34 @@ class GitCommandManager {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getDefaultBranch(repositoryUrl: string): Promise<string> {
|
||||||
|
let output: GitOutput | undefined
|
||||||
|
await retryHelper.execute(async () => {
|
||||||
|
output = await this.execGit([
|
||||||
|
'ls-remote',
|
||||||
|
'--quiet',
|
||||||
|
'--exit-code',
|
||||||
|
'--symref',
|
||||||
|
repositoryUrl,
|
||||||
|
'HEAD'
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
if (output) {
|
||||||
|
// Satisfy compiler, will always be set
|
||||||
|
for (let line of output.stdout.trim().split('\n')) {
|
||||||
|
line = line.trim()
|
||||||
|
if (line.startsWith('ref:') || line.endsWith('HEAD')) {
|
||||||
|
return line
|
||||||
|
.substr('ref:'.length, line.length - 'ref:'.length - 'HEAD'.length)
|
||||||
|
.trim()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error('Unexpected output when retrieving default branch')
|
||||||
|
}
|
||||||
|
|
||||||
getWorkingDirectory(): string {
|
getWorkingDirectory(): string {
|
||||||
return this.workingDirectory
|
return this.workingDirectory
|
||||||
}
|
}
|
||||||
|
@ -103,6 +103,21 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
|
|||||||
await authHelper.configureAuth()
|
await authHelper.configureAuth()
|
||||||
core.endGroup()
|
core.endGroup()
|
||||||
|
|
||||||
|
// Determine the default branch
|
||||||
|
if (!settings.ref && !settings.commit) {
|
||||||
|
core.startGroup('Determining the default branch')
|
||||||
|
if (settings.sshKey) {
|
||||||
|
settings.ref = await git.getDefaultBranch(repositoryUrl)
|
||||||
|
} else {
|
||||||
|
settings.ref = await githubApiHelper.getDefaultBranch(
|
||||||
|
settings.authToken,
|
||||||
|
settings.repositoryOwner,
|
||||||
|
settings.repositoryName
|
||||||
|
)
|
||||||
|
}
|
||||||
|
core.endGroup()
|
||||||
|
}
|
||||||
|
|
||||||
// LFS install
|
// LFS install
|
||||||
if (settings.lfs) {
|
if (settings.lfs) {
|
||||||
await git.lfsInstall()
|
await git.lfsInstall()
|
||||||
|
@ -19,6 +19,12 @@ export async function downloadRepository(
|
|||||||
commit: string,
|
commit: string,
|
||||||
repositoryPath: string
|
repositoryPath: string
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
|
// Determine the default branch
|
||||||
|
if (!ref && !commit) {
|
||||||
|
core.info('Determining the default branch')
|
||||||
|
ref = await getDefaultBranch(authToken, owner, repo)
|
||||||
|
}
|
||||||
|
|
||||||
// Download the archive
|
// Download the archive
|
||||||
let archiveData = await retryHelper.execute(async () => {
|
let archiveData = await retryHelper.execute(async () => {
|
||||||
core.info('Downloading the archive')
|
core.info('Downloading the archive')
|
||||||
@ -67,6 +73,46 @@ export async function downloadRepository(
|
|||||||
io.rmRF(extractPath)
|
io.rmRF(extractPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Looks up the default branch name
|
||||||
|
*/
|
||||||
|
export async function getDefaultBranch(
|
||||||
|
authToken: string,
|
||||||
|
owner: string,
|
||||||
|
repo: string
|
||||||
|
): Promise<string> {
|
||||||
|
return await retryHelper.execute(async () => {
|
||||||
|
core.info('Retrieving the default branch name')
|
||||||
|
const octokit = new github.GitHub(authToken)
|
||||||
|
let result: string
|
||||||
|
try {
|
||||||
|
// Get the default branch from the repo info
|
||||||
|
const response = await octokit.repos.get({owner, repo})
|
||||||
|
result = response.data.default_branch
|
||||||
|
assert.ok(result, 'default_branch cannot be empty')
|
||||||
|
} catch (err) {
|
||||||
|
// Handle .wiki repo
|
||||||
|
if (err['status'] === 404 && repo.toUpperCase().endsWith('.WIKI')) {
|
||||||
|
result = 'master'
|
||||||
|
}
|
||||||
|
// Otherwise error
|
||||||
|
else {
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print the default branch
|
||||||
|
core.info(`Default branch '${result}'`)
|
||||||
|
|
||||||
|
// Prefix with 'refs/heads'
|
||||||
|
if (!result.startsWith('refs/')) {
|
||||||
|
result = `refs/heads/${result}`
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
async function downloadArchive(
|
async function downloadArchive(
|
||||||
authToken: string,
|
authToken: string,
|
||||||
owner: string,
|
owner: string,
|
||||||
|
@ -68,10 +68,6 @@ export function getInputs(): IGitSourceSettings {
|
|||||||
result.ref = `refs/heads/${result.ref}`
|
result.ref = `refs/heads/${result.ref}`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!result.ref && !result.commit) {
|
|
||||||
result.ref = 'refs/heads/master'
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// SHA?
|
// SHA?
|
||||||
else if (result.ref.match(/^[0-9a-fA-F]{40}$/)) {
|
else if (result.ref.match(/^[0-9a-fA-F]{40}$/)) {
|
||||||
@ -110,7 +106,7 @@ export function getInputs(): IGitSourceSettings {
|
|||||||
core.debug(`recursive submodules = ${result.nestedSubmodules}`)
|
core.debug(`recursive submodules = ${result.nestedSubmodules}`)
|
||||||
|
|
||||||
// Auth token
|
// Auth token
|
||||||
result.authToken = core.getInput('token')
|
result.authToken = core.getInput('token', {required: true})
|
||||||
|
|
||||||
// SSH
|
// SSH
|
||||||
result.sshKey = core.getInput('ssh-key')
|
result.sshKey = core.getInput('ssh-key')
|
||||||
|
Reference in New Issue
Block a user