mirror of
https://github.com/actions/checkout
synced 2024-12-22 21:22:40 +00:00
fix default branch for .wiki and when using ssh (#284)
This commit is contained in:
parent
b4483adec3
commit
fb6f360df2
6 changed files with 126 additions and 29 deletions
|
@ -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(),
|
||||||
|
|
70
dist/index.js
vendored
70
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;
|
||||||
}
|
}
|
||||||
|
@ -6114,12 +6141,6 @@ function getSource(settings) {
|
||||||
// Repository URL
|
// Repository URL
|
||||||
core.info(`Syncing repository: ${settings.repositoryOwner}/${settings.repositoryName}`);
|
core.info(`Syncing repository: ${settings.repositoryOwner}/${settings.repositoryName}`);
|
||||||
const repositoryUrl = urlHelper.getFetchUrl(settings);
|
const repositoryUrl = urlHelper.getFetchUrl(settings);
|
||||||
// Determine the default branch
|
|
||||||
if (!settings.ref && !settings.commit) {
|
|
||||||
core.startGroup('Determining the default branch');
|
|
||||||
settings.ref = yield githubApiHelper.getDefaultBranch(settings.authToken, settings.repositoryOwner, settings.repositoryName);
|
|
||||||
core.endGroup();
|
|
||||||
}
|
|
||||||
// Remove conflicting file path
|
// Remove conflicting file path
|
||||||
if (fsHelper.fileExistsSync(settings.repositoryPath)) {
|
if (fsHelper.fileExistsSync(settings.repositoryPath)) {
|
||||||
yield io.rmRF(settings.repositoryPath);
|
yield io.rmRF(settings.repositoryPath);
|
||||||
|
@ -6172,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();
|
||||||
|
@ -9531,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');
|
||||||
|
@ -9583,14 +9620,25 @@ function getDefaultBranch(authToken, owner, repo) {
|
||||||
return yield retryHelper.execute(() => __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');
|
core.info('Retrieving the default branch name');
|
||||||
const octokit = new github.GitHub(authToken);
|
const octokit = new github.GitHub(authToken);
|
||||||
const response = yield octokit.repos.get({ owner, repo });
|
let result;
|
||||||
if (response.status != 200) {
|
try {
|
||||||
throw new Error(`Unexpected response from GitHub API. Status: ${response.status}, Data: ${response.data}`);
|
// 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
|
// Print the default branch
|
||||||
let result = response.data.default_branch;
|
|
||||||
core.info(`Default branch '${result}'`);
|
core.info(`Default branch '${result}'`);
|
||||||
assert.ok(result, 'default_branch cannot be empty');
|
|
||||||
// Prefix with 'refs/heads'
|
// Prefix with 'refs/heads'
|
||||||
if (!result.startsWith('refs/')) {
|
if (!result.startsWith('refs/')) {
|
||||||
result = `refs/heads/${result}`;
|
result = `refs/heads/${result}`;
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,17 +19,6 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
|
||||||
)
|
)
|
||||||
const repositoryUrl = urlHelper.getFetchUrl(settings)
|
const repositoryUrl = urlHelper.getFetchUrl(settings)
|
||||||
|
|
||||||
// Determine the default branch
|
|
||||||
if (!settings.ref && !settings.commit) {
|
|
||||||
core.startGroup('Determining the default branch')
|
|
||||||
settings.ref = await githubApiHelper.getDefaultBranch(
|
|
||||||
settings.authToken,
|
|
||||||
settings.repositoryOwner,
|
|
||||||
settings.repositoryName
|
|
||||||
)
|
|
||||||
core.endGroup()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove conflicting file path
|
// Remove conflicting file path
|
||||||
if (fsHelper.fileExistsSync(settings.repositoryPath)) {
|
if (fsHelper.fileExistsSync(settings.repositoryPath)) {
|
||||||
await io.rmRF(settings.repositoryPath)
|
await io.rmRF(settings.repositoryPath)
|
||||||
|
@ -114,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')
|
||||||
|
@ -78,17 +84,25 @@ export async function getDefaultBranch(
|
||||||
return await retryHelper.execute(async () => {
|
return await retryHelper.execute(async () => {
|
||||||
core.info('Retrieving the default branch name')
|
core.info('Retrieving the default branch name')
|
||||||
const octokit = new github.GitHub(authToken)
|
const octokit = new github.GitHub(authToken)
|
||||||
const response = await octokit.repos.get({owner, repo})
|
let result: string
|
||||||
if (response.status != 200) {
|
try {
|
||||||
throw new Error(
|
// Get the default branch from the repo info
|
||||||
`Unexpected response from GitHub API. Status: ${response.status}, Data: ${response.data}`
|
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
|
// Print the default branch
|
||||||
let result = response.data.default_branch
|
|
||||||
core.info(`Default branch '${result}'`)
|
core.info(`Default branch '${result}'`)
|
||||||
assert.ok(result, 'default_branch cannot be empty')
|
|
||||||
|
|
||||||
// Prefix with 'refs/heads'
|
// Prefix with 'refs/heads'
|
||||||
if (!result.startsWith('refs/')) {
|
if (!result.startsWith('refs/')) {
|
||||||
|
|
Loading…
Reference in a new issue