Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Default branch checkout option #5

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
# Otherwise, uses the default branch.
ref: ''

# Whether to checkout the default repository branch if specified ref does not
# exist. If this is set to true, then fetch-depth should be 0
# Default: true
default-ref-on-error: ''
# Indicates whether to checkout the default repository branch if the requested ref
# does not exist
# Default: false
default-branch-checkout: ''

# Personal access token (PAT) used to fetch the repository. The PAT is configured
# with the local git config, which enables your scripts to run authenticated git
Expand Down
3 changes: 1 addition & 2 deletions __test__/git-auth-helper.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -813,8 +813,7 @@ async function setup(testName: string): Promise<void> {
nestedSubmodules: false,
persistCredentials: true,
ref: 'refs/heads/main',
defaultRefOnError: true,
defaultBranch: 'main',
defaultBranchCheckout: false,
repositoryName: 'my-repo',
repositoryOwner: 'my-org',
repositoryPath: '',
Expand Down
1 change: 1 addition & 0 deletions __test__/input-helper.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ describe('input-helper tests', () => {
expect(settings.commit).toBeTruthy()
expect(settings.commit).toBe('1234567890123456789012345678901234567890')
expect(settings.filter).toBe(undefined)
expect(settings.defaultBranchCheckout).toBe(false)
expect(settings.sparseCheckout).toBe(undefined)
expect(settings.sparseCheckoutConeMode).toBe(true)
expect(settings.fetchDepth).toBe(1)
Expand Down
8 changes: 3 additions & 5 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,9 @@ inputs:
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. Otherwise, uses the default branch.
default-ref-on-error:
description: >
Whether to checkout the default repository branch if specified ref does not exist.
If this is set to true, then fetch-depth should be 0
default: true
default-branch-checkout:
description: 'Indicates whether to checkout the default repository branch if the requested ref does not exist'
default: false
token:
description: >
Personal access token (PAT) used to fetch the repository. The PAT is configured
Expand Down
44 changes: 18 additions & 26 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -1226,17 +1226,6 @@ function getSource(settings) {
core.startGroup('Setting up auth');
yield authHelper.configureAuth();
core.endGroup();
if (settings.defaultRefOnError && settings.defaultRefOnError === true) {
// Configure default branch
core.startGroup('Setting up default branch');
if (settings.sshKey) {
settings.defaultBranch = yield git.getDefaultBranch(repositoryUrl);
}
else {
settings.defaultBranch = yield githubApiHelper.getDefaultBranch(settings.authToken, settings.repositoryOwner, settings.repositoryName);
}
core.endGroup();
}
// Determine the default branch
if (!settings.ref && !settings.commit) {
core.startGroup('Determining the default branch');
Expand All @@ -1261,8 +1250,7 @@ function getSource(settings) {
else if (settings.sparseCheckout) {
fetchOptions.filter = 'blob:none';
}
if (settings.fetchDepth <= 0 ||
(settings.defaultRefOnError && settings.defaultRefOnError === true)) {
if (settings.fetchDepth <= 0 || settings.defaultBranchCheckout) {
// Fetch all branches and tags
let refSpec = refHelper.getRefSpecForAllHistory(settings.ref, settings.commit);
yield git.fetch(refSpec, fetchOptions);
Expand All @@ -1283,18 +1271,21 @@ function getSource(settings) {
// Checkout info
core.startGroup('Determining the checkout info');
let checkoutInfo;
if (settings.defaultRefOnError && settings.defaultRefOnError === true) {
try {
checkoutInfo = yield refHelper.getCheckoutInfo(git, settings.ref, settings.commit);
try {
checkoutInfo = yield refHelper.getCheckoutInfo(git, settings.ref, settings.commit);
}
catch (error) {
if (settings.defaultBranchCheckout) {
core.info('Could not determine the checkout info. Trying the default repository branch');
const repositoryDefaultBranch = settings.sshKey
? yield git.getDefaultBranch(repositoryUrl)
: yield githubApiHelper.getDefaultBranch(settings.authToken, settings.repositoryOwner, settings.repositoryName);
checkoutInfo = yield refHelper.getCheckoutInfo(git, repositoryDefaultBranch, settings.commit);
}
catch (error) {
core.info('Could not determine the checkout info. Trying the default repo branch');
checkoutInfo = yield refHelper.getCheckoutInfo(git, settings.defaultBranch, settings.commit);
else {
throw error;
}
}
else {
checkoutInfo = yield refHelper.getCheckoutInfo(git, settings.ref, settings.commit);
}
core.endGroup();
// LFS fetch
// Explicit lfs-fetch to avoid slow checkout (fetches one lfs object at a time).
Expand Down Expand Up @@ -1748,10 +1739,11 @@ function getInputs() {
}
core.debug(`ref = '${result.ref}'`);
core.debug(`commit = '${result.commit}'`);
// Default ref on error
result.defaultRefOnError =
(core.getInput('default-ref-on-error') || 'true').toUpperCase() === 'TRUE';
core.debug(`default-ref-on-error = '${result.defaultRefOnError}'`);
// Default branch checkout
result.defaultBranchCheckout =
(core.getInput('default-branch-checkout') || 'false').toUpperCase() ===
'TRUE';
core.debug(`default-branch-checkout = '${result.defaultBranchCheckout}'`);
// Clean
result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE';
core.debug(`clean = ${result.clean}`);
Expand Down
55 changes: 20 additions & 35 deletions src/git-source-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,21 +130,6 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
await authHelper.configureAuth()
core.endGroup()

if (settings.defaultRefOnError && settings.defaultRefOnError === true) {
// Configure default branch
core.startGroup('Setting up default branch')
if (settings.sshKey) {
settings.defaultBranch = await git.getDefaultBranch(repositoryUrl)
} else {
settings.defaultBranch = await githubApiHelper.getDefaultBranch(
settings.authToken,
settings.repositoryOwner,
settings.repositoryName
)
}
core.endGroup()
}

// Determine the default branch
if (!settings.ref && !settings.commit) {
core.startGroup('Determining the default branch')
Expand Down Expand Up @@ -181,10 +166,7 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
fetchOptions.filter = 'blob:none'
}

if (
settings.fetchDepth <= 0 ||
(settings.defaultRefOnError && settings.defaultRefOnError === true)
) {
if (settings.fetchDepth <= 0 || settings.defaultBranchCheckout) {
// Fetch all branches and tags
let refSpec = refHelper.getRefSpecForAllHistory(
settings.ref,
Expand All @@ -209,29 +191,32 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
// Checkout info
core.startGroup('Determining the checkout info')
let checkoutInfo: refHelper.ICheckoutInfo
if (settings.defaultRefOnError && settings.defaultRefOnError === true) {
try {
checkoutInfo = await refHelper.getCheckoutInfo(
git,
settings.ref,
settings.commit
)
} catch (error) {
try {
checkoutInfo = await refHelper.getCheckoutInfo(
git,
settings.ref,
settings.commit
)
} catch (error) {
if (settings.defaultBranchCheckout) {
core.info(
'Could not determine the checkout info. Trying the default repo branch'
'Could not determine the checkout info. Trying the default repository branch'
)
const repositoryDefaultBranch = settings.sshKey
? await git.getDefaultBranch(repositoryUrl)
: await githubApiHelper.getDefaultBranch(
settings.authToken,
settings.repositoryOwner,
settings.repositoryName
)
checkoutInfo = await refHelper.getCheckoutInfo(
git,
settings.defaultBranch,
repositoryDefaultBranch,
settings.commit
)
} else {
throw error
}
} else {
checkoutInfo = await refHelper.getCheckoutInfo(
git,
settings.ref,
settings.commit
)
}
core.endGroup()

Expand Down
9 changes: 2 additions & 7 deletions src/git-source-settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,9 @@ export interface IGitSourceSettings {
ref: string

/**
* Whether to checkout the default repository branch if specified ref does not exist.
* Indicates whether to checkout the default repository branch if the requested ref does not exist
*/
defaultRefOnError: boolean

/**
* The target ref to fetch if it exists
*/
defaultBranch: string
defaultBranchCheckout: boolean

/**
* The commit to checkout
Expand Down
9 changes: 5 additions & 4 deletions src/input-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,11 @@ export async function getInputs(): Promise<IGitSourceSettings> {
core.debug(`ref = '${result.ref}'`)
core.debug(`commit = '${result.commit}'`)

// Default ref on error
result.defaultRefOnError =
(core.getInput('default-ref-on-error') || 'true').toUpperCase() === 'TRUE'
core.debug(`default-ref-on-error = '${result.defaultRefOnError}'`)
// Default branch checkout
result.defaultBranchCheckout =
(core.getInput('default-branch-checkout') || 'false').toUpperCase() ===
'TRUE'
core.debug(`default-branch-checkout = '${result.defaultBranchCheckout}'`)

// Clean
result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE'
Expand Down
Loading