mirror of
https://github.com/actions/checkout.git
synced 2025-07-14 20:53:53 +00:00
Compare commits
15 Commits
users/vmjo
...
vmjoseph/s
Author | SHA1 | Date | |
---|---|---|---|
af5130cb88 | |||
8e555ec39e | |||
b99f9d0aba | |||
a9f581070e | |||
d2e9d8b595 | |||
25424e8595 | |||
bac1bcfa81 | |||
1f9aeb9f74 | |||
9679ac6b68 | |||
f1764260c3 | |||
9684017cd6 | |||
5788ebd085 | |||
ad19603e6b | |||
2c24b08d98 | |||
9634409d1e |
4
.github/workflows/codeql-analysis.yml
vendored
4
.github/workflows/codeql-analysis.yml
vendored
@ -42,7 +42,7 @@ jobs:
|
|||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v2
|
uses: github/codeql-action/init@v1
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
@ -55,4 +55,4 @@ jobs:
|
|||||||
- run: rm -rf dist # We want code scanning to analyze lib instead (individual .js files)
|
- run: rm -rf dist # We want code scanning to analyze lib instead (individual .js files)
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v2
|
uses: github/codeql-action/analyze@v1
|
||||||
|
BIN
.licenses/npm/@actions/io.dep.yml
generated
BIN
.licenses/npm/@actions/io.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/qs.dep.yml
generated
BIN
.licenses/npm/qs.dep.yml
generated
Binary file not shown.
@ -155,7 +155,6 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl
|
|||||||
repository: my-org/my-tools
|
repository: my-org/my-tools
|
||||||
path: my-tools
|
path: my-tools
|
||||||
```
|
```
|
||||||
> - If your secondary repository is private you will need to add the option noted in [Checkout multiple repos (private)](#Checkout-multiple-repos-private)
|
|
||||||
|
|
||||||
## Checkout multiple repos (nested)
|
## Checkout multiple repos (nested)
|
||||||
|
|
||||||
@ -169,7 +168,6 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl
|
|||||||
repository: my-org/my-tools
|
repository: my-org/my-tools
|
||||||
path: my-tools
|
path: my-tools
|
||||||
```
|
```
|
||||||
> - If your secondary repository is private you will need to add the option noted in [Checkout multiple repos (private)](#Checkout-multiple-repos-private)
|
|
||||||
|
|
||||||
## Checkout multiple repos (private)
|
## Checkout multiple repos (private)
|
||||||
|
|
||||||
|
@ -1,80 +0,0 @@
|
|||||||
import * as exec from '@actions/exec'
|
|
||||||
import * as fshelper from '../lib/fs-helper'
|
|
||||||
import * as commandManager from '../lib/git-command-manager'
|
|
||||||
|
|
||||||
let git: commandManager.IGitCommandManager
|
|
||||||
let mockExec = jest.fn()
|
|
||||||
|
|
||||||
describe('git-auth-helper tests', () => {
|
|
||||||
beforeAll(async () => {})
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
|
||||||
jest.spyOn(fshelper, 'fileExistsSync').mockImplementation(jest.fn())
|
|
||||||
jest.spyOn(fshelper, 'directoryExistsSync').mockImplementation(jest.fn())
|
|
||||||
})
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
jest.restoreAllMocks()
|
|
||||||
})
|
|
||||||
|
|
||||||
afterAll(() => {})
|
|
||||||
|
|
||||||
it('branch list matches', async () => {
|
|
||||||
mockExec.mockImplementation((path, args, options) => {
|
|
||||||
console.log(args, options.listeners.stdout)
|
|
||||||
|
|
||||||
if (args.includes('version')) {
|
|
||||||
options.listeners.stdout(Buffer.from('2.18'))
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.includes('rev-parse')) {
|
|
||||||
options.listeners.stdline(Buffer.from('refs/heads/foo'))
|
|
||||||
options.listeners.stdline(Buffer.from('refs/heads/bar'))
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1
|
|
||||||
})
|
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
|
||||||
const workingDirectory = 'test'
|
|
||||||
const lfs = false
|
|
||||||
git = await commandManager.createCommandManager(workingDirectory, lfs)
|
|
||||||
|
|
||||||
let branches = await git.branchList(false)
|
|
||||||
|
|
||||||
expect(branches).toHaveLength(2)
|
|
||||||
expect(branches.sort()).toEqual(['foo', 'bar'].sort())
|
|
||||||
})
|
|
||||||
|
|
||||||
it('ambiguous ref name output is captured', async () => {
|
|
||||||
mockExec.mockImplementation((path, args, options) => {
|
|
||||||
console.log(args, options.listeners.stdout)
|
|
||||||
|
|
||||||
if (args.includes('version')) {
|
|
||||||
options.listeners.stdout(Buffer.from('2.18'))
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.includes('rev-parse')) {
|
|
||||||
options.listeners.stdline(Buffer.from('refs/heads/foo'))
|
|
||||||
// If refs/tags/v1 and refs/heads/tags/v1 existed on this repository
|
|
||||||
options.listeners.errline(
|
|
||||||
Buffer.from("error: refname 'tags/v1' is ambiguous")
|
|
||||||
)
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1
|
|
||||||
})
|
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
|
||||||
const workingDirectory = 'test'
|
|
||||||
const lfs = false
|
|
||||||
git = await commandManager.createCommandManager(workingDirectory, lfs)
|
|
||||||
|
|
||||||
let branches = await git.branchList(false)
|
|
||||||
|
|
||||||
expect(branches).toHaveLength(1)
|
|
||||||
expect(branches.sort()).toEqual(['foo'].sort())
|
|
||||||
})
|
|
||||||
})
|
|
36441
dist/index.js
vendored
36441
dist/index.js
vendored
File diff suppressed because one or more lines are too long
22537
package-lock.json
generated
22537
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
12
package.json
12
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "checkout",
|
"name": "checkout",
|
||||||
"version": "3.2.0",
|
"version": "3.1.0",
|
||||||
"description": "checkout action",
|
"description": "checkout action",
|
||||||
"main": "lib/main.js",
|
"main": "lib/main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@ -31,20 +31,20 @@
|
|||||||
"@actions/core": "^1.10.0",
|
"@actions/core": "^1.10.0",
|
||||||
"@actions/exec": "^1.0.1",
|
"@actions/exec": "^1.0.1",
|
||||||
"@actions/github": "^2.2.0",
|
"@actions/github": "^2.2.0",
|
||||||
"@actions/io": "^1.1.3",
|
"@actions/io": "^1.0.1",
|
||||||
"@actions/tool-cache": "^1.1.2",
|
"@actions/tool-cache": "^1.1.2",
|
||||||
|
"stream": "0.0.2",
|
||||||
"uuid": "^3.3.3"
|
"uuid": "^3.3.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^27.0.2",
|
"@types/jest": "^27.0.2",
|
||||||
"@types/node": "^12.7.12",
|
"@types/node": "^12.7.12",
|
||||||
"@types/uuid": "^3.4.6",
|
"@types/uuid": "^3.4.6",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.45.0",
|
"@typescript-eslint/parser": "^5.1.0",
|
||||||
"@typescript-eslint/parser": "^5.45.0",
|
"@zeit/ncc": "^0.20.5",
|
||||||
"@vercel/ncc": "^0.36.1",
|
|
||||||
"eslint": "^7.32.0",
|
"eslint": "^7.32.0",
|
||||||
"eslint-plugin-github": "^4.3.2",
|
"eslint-plugin-github": "^4.3.2",
|
||||||
"eslint-plugin-jest": "^25.7.0",
|
"eslint-plugin-jest": "^25.2.2",
|
||||||
"jest": "^27.3.0",
|
"jest": "^27.3.0",
|
||||||
"jest-circus": "^27.3.0",
|
"jest-circus": "^27.3.0",
|
||||||
"js-yaml": "^3.13.1",
|
"js-yaml": "^3.13.1",
|
||||||
|
@ -7,6 +7,7 @@ import * as refHelper from './ref-helper'
|
|||||||
import * as regexpHelper from './regexp-helper'
|
import * as regexpHelper from './regexp-helper'
|
||||||
import * as retryHelper from './retry-helper'
|
import * as retryHelper from './retry-helper'
|
||||||
import {GitVersion} from './git-version'
|
import {GitVersion} from './git-version'
|
||||||
|
import stream, {Writable} from 'stream'
|
||||||
|
|
||||||
// Auth header not supported before 2.9
|
// Auth header not supported before 2.9
|
||||||
// Wire protocol v2 not supported before 2.18
|
// Wire protocol v2 not supported before 2.18
|
||||||
@ -91,14 +92,12 @@ class GitCommandManager {
|
|||||||
|
|
||||||
async branchList(remote: boolean): Promise<string[]> {
|
async branchList(remote: boolean): Promise<string[]> {
|
||||||
const result: string[] = []
|
const result: string[] = []
|
||||||
|
const stderr: string[] = []
|
||||||
|
|
||||||
// Note, this implementation uses "rev-parse --symbolic-full-name" because the output from
|
// Note, this implementation uses "rev-parse --symbolic-full-name" because the output from
|
||||||
// "branch --list" is more difficult when in a detached HEAD state.
|
// "branch --list" is more difficult when in a detached HEAD state.
|
||||||
|
// Note, this implementation uses "rev-parse --symbolic-full-name" because there is a bug
|
||||||
// TODO(https://github.com/actions/checkout/issues/786): this implementation uses
|
// in Git 2.18 that causes "rev-parse --symbolic" to output symbolic full names.
|
||||||
// "rev-parse --symbolic-full-name" because there is a bug
|
|
||||||
// in Git 2.18 that causes "rev-parse --symbolic" to output symbolic full names. When
|
|
||||||
// 2.18 is no longer supported, we can switch back to --symbolic.
|
|
||||||
|
|
||||||
const args = ['rev-parse', '--symbolic-full-name']
|
const args = ['rev-parse', '--symbolic-full-name']
|
||||||
if (remote) {
|
if (remote) {
|
||||||
@ -107,49 +106,29 @@ class GitCommandManager {
|
|||||||
args.push('--branches')
|
args.push('--branches')
|
||||||
}
|
}
|
||||||
|
|
||||||
const stderr: string[] = []
|
|
||||||
const errline: string[] = []
|
|
||||||
const stdout: string[] = []
|
|
||||||
const stdline: string[] = []
|
|
||||||
|
|
||||||
const listeners = {
|
const listeners = {
|
||||||
stderr: (data: Buffer) => {
|
stderr: (data: Buffer) => {
|
||||||
stderr.push(data.toString())
|
stderr.push(data.toString())
|
||||||
},
|
},
|
||||||
errline: (data: Buffer) => {
|
errline: (line: string) => {
|
||||||
errline.push(data.toString())
|
stderr.push(line)
|
||||||
},
|
|
||||||
stdout: (data: Buffer) => {
|
|
||||||
stdout.push(data.toString())
|
|
||||||
},
|
|
||||||
stdline: (data: Buffer) => {
|
|
||||||
stdline.push(data.toString())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const output = await this.execGit(args, false, false, listeners)
|
||||||
|
|
||||||
// Suppress the output in order to avoid flooding annotations with innocuous errors.
|
for (let branch of output.stdout.trim().split('\n')) {
|
||||||
await this.execGit(args, false, true, listeners)
|
|
||||||
|
|
||||||
core.debug(`stderr callback is: ${stderr}`)
|
|
||||||
core.debug(`errline callback is: ${errline}`)
|
|
||||||
core.debug(`stdout callback is: ${stdout}`)
|
|
||||||
core.debug(`stdline callback is: ${stdline}`)
|
|
||||||
|
|
||||||
for (let branch of stdline) {
|
|
||||||
branch = branch.trim()
|
branch = branch.trim()
|
||||||
if (!branch) {
|
if (branch) {
|
||||||
continue
|
if (branch.startsWith('refs/heads/')) {
|
||||||
}
|
branch = branch.substr('refs/heads/'.length)
|
||||||
|
} else if (branch.startsWith('refs/remotes/')) {
|
||||||
|
branch = branch.substr('refs/remotes/'.length)
|
||||||
|
}
|
||||||
|
|
||||||
if (branch.startsWith('refs/heads/')) {
|
result.push(branch)
|
||||||
branch = branch.substring('refs/heads/'.length)
|
|
||||||
} else if (branch.startsWith('refs/remotes/')) {
|
|
||||||
branch = branch.substring('refs/remotes/'.length)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result.push(branch)
|
|
||||||
}
|
}
|
||||||
|
core.info(stderr.join('\n'))
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -440,30 +419,45 @@ class GitCommandManager {
|
|||||||
for (const key of Object.keys(this.gitEnv)) {
|
for (const key of Object.keys(this.gitEnv)) {
|
||||||
env[key] = this.gitEnv[key]
|
env[key] = this.gitEnv[key]
|
||||||
}
|
}
|
||||||
|
|
||||||
const defaultListener = {
|
const defaultListener = {
|
||||||
stdout: (data: Buffer) => {
|
stdout: (data: Buffer) => {
|
||||||
stdout.push(data.toString())
|
stdout.push(data.toString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// const listeners = Object.keys(customListeners) < 0 ? customListeners : {stdout: (data: Buffer) => {
|
||||||
const mergedListeners = {...defaultListener, ...customListeners}
|
// stdout.push(data.toString())
|
||||||
|
// }}
|
||||||
|
const listenersD = {...customListeners, ...defaultListener}
|
||||||
const stdout: string[] = []
|
const stdout: string[] = []
|
||||||
|
// let temp = ''
|
||||||
|
// let temp2 = ''
|
||||||
const options = {
|
const options = {
|
||||||
cwd: this.workingDirectory,
|
cwd: this.workingDirectory,
|
||||||
env,
|
env,
|
||||||
silent,
|
silent,
|
||||||
ignoreReturnCode: allowAllExitCodes,
|
ignoreReturnCode: allowAllExitCodes,
|
||||||
listeners: mergedListeners
|
listeners: listenersD
|
||||||
|
// ,
|
||||||
|
// errStream: new stream.Writable({
|
||||||
|
// write(chunk, _, next) {
|
||||||
|
// temp += chunk.toString()
|
||||||
|
// next()
|
||||||
|
// }
|
||||||
|
// }),
|
||||||
|
|
||||||
|
// outStream: new stream.Writable({
|
||||||
|
// write(chunk, _, next) {
|
||||||
|
// temp2 += chunk.toString()
|
||||||
|
// next()
|
||||||
|
// }
|
||||||
|
// })
|
||||||
}
|
}
|
||||||
|
|
||||||
result.exitCode = await exec.exec(`"${this.gitPath}"`, args, options)
|
result.exitCode = await exec.exec(`"${this.gitPath}"`, args, options)
|
||||||
result.stdout = stdout.join('')
|
result.stdout = stdout.join('')
|
||||||
|
// core.info(temp.length.toString())
|
||||||
core.debug(result.exitCode.toString())
|
// core.info(temp2.length.toString())
|
||||||
core.debug(result.stdout)
|
core.info(result.stdout)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ export function setSshKnownHostsPath(sshKnownHostsPath: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Save the set-safe-directory input so the POST action can retrieve the value.
|
* Save the sef-safe-directory input so the POST action can retrieve the value.
|
||||||
*/
|
*/
|
||||||
export function setSafeDirectory() {
|
export function setSafeDirectory() {
|
||||||
core.saveState('setSafeDirectory', 'true')
|
core.saveState('setSafeDirectory', 'true')
|
||||||
|
Reference in New Issue
Block a user