mirror of
https://github.com/actions/checkout.git
synced 2026-06-21 19:21:32 +08:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2b8f79e013 | |||
| d651e32721 | |||
| 8f0d2fbedc | |||
| 418530e26c | |||
| 0cf6e008d0 | |||
| 9a43814785 | |||
| 317b5f36ae | |||
| efb66ddacf | |||
| 3e9f24a519 |
@@ -7,11 +7,6 @@ on:
|
|||||||
- main
|
- main
|
||||||
- releases/*
|
- releases/*
|
||||||
|
|
||||||
|
|
||||||
# Note that when you see patterns like "ref: test-data/v2/basic" within this workflow,
|
|
||||||
# these refer to "test-data" branches on this actions/checkout repo.
|
|
||||||
# (For example, test-data/v2/basic -> https://github.com/actions/checkout/tree/test-data/v2/basic)
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -100,16 +95,6 @@ jobs:
|
|||||||
- name: Verify sparse checkout
|
- name: Verify sparse checkout
|
||||||
run: __test__/verify-sparse-checkout.sh
|
run: __test__/verify-sparse-checkout.sh
|
||||||
|
|
||||||
# Disabled sparse checkout in existing checkout
|
|
||||||
- name: Disabled sparse checkout
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
path: sparse-checkout
|
|
||||||
|
|
||||||
- name: Verify disabled sparse checkout
|
|
||||||
shell: bash
|
|
||||||
run: set -x && ls -l sparse-checkout/src/git-command-manager.ts
|
|
||||||
|
|
||||||
# Sparse checkout (non-cone mode)
|
# Sparse checkout (non-cone mode)
|
||||||
- name: Sparse checkout (non-cone mode)
|
- name: Sparse checkout (non-cone mode)
|
||||||
uses: ./
|
uses: ./
|
||||||
@@ -190,7 +175,7 @@ jobs:
|
|||||||
test-proxy:
|
test-proxy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
container:
|
||||||
image: ghcr.io/actions/test-ubuntu-git:main.20240221.114913.703z
|
image: alpine/git:latest
|
||||||
options: --dns 127.0.0.1
|
options: --dns 127.0.0.1
|
||||||
services:
|
services:
|
||||||
squid-proxy:
|
squid-proxy:
|
||||||
@@ -294,4 +279,4 @@ jobs:
|
|||||||
- name: Fix Checkout v3
|
- name: Fix Checkout v3
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
path: v3
|
path: v3
|
||||||
@@ -19,10 +19,7 @@ jobs:
|
|||||||
tag:
|
tag:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
# Note this update workflow can also be used as a rollback tool.
|
- uses: actions/checkout@v3
|
||||||
# For that reason, it's best to pin `actions/checkout` to a known, stable version
|
|
||||||
# (typically, about two releases back).
|
|
||||||
- uses: actions/checkout@v4.1.1
|
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Git config
|
- name: Git config
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
name: Publish test-ubuntu-git Container
|
|
||||||
|
|
||||||
on:
|
|
||||||
# Use an on demand workflow trigger.
|
|
||||||
# (Forked copies of actions/checkout won't have permission to update GHCR.io/actions,
|
|
||||||
# so avoid trigger events that run automatically.)
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
publish:
|
|
||||||
description: 'Publish to ghcr.io? (main branch only)'
|
|
||||||
type: boolean
|
|
||||||
required: true
|
|
||||||
default: false
|
|
||||||
|
|
||||||
env:
|
|
||||||
REGISTRY: ghcr.io
|
|
||||||
IMAGE_NAME: actions/test-ubuntu-git
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-and-push-image:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
# Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
# Use `docker/login-action` to log in to GHCR.io.
|
|
||||||
# Once published, the packages are scoped to the account defined here.
|
|
||||||
- name: Log in to the ghcr.io container registry
|
|
||||||
uses: docker/login-action@v3.0.0
|
|
||||||
with:
|
|
||||||
registry: ${{ env.REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Format Timestamp
|
|
||||||
id: timestamp
|
|
||||||
# Use `date` with a custom format to achieve the key=value format GITHUB_OUTPUT expects.
|
|
||||||
run: date -u "+now=%Y%m%d.%H%M%S.%3NZ" >> "$GITHUB_OUTPUT"
|
|
||||||
|
|
||||||
- name: Issue Image Publish Warning
|
|
||||||
if: ${{ inputs.publish && github.ref_name != 'main' }}
|
|
||||||
run: echo "::warning::test-ubuntu-git images can only be published from the actions/checkout 'main' branch. Workflow will continue with push/publish disabled."
|
|
||||||
|
|
||||||
# Use `docker/build-push-action` to build (and optionally publish) the image.
|
|
||||||
- name: Build Docker Image (with optional Push)
|
|
||||||
uses: docker/build-push-action@v5.1.0
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: images/test-ubuntu-git.Dockerfile
|
|
||||||
# For now, attempts to push to ghcr.io must target the `main` branch.
|
|
||||||
# In the future, consider also allowing attempts from `releases/*` branches.
|
|
||||||
push: ${{ inputs.publish && github.ref_name == 'main' }}
|
|
||||||
tags: |
|
|
||||||
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}.${{ steps.timestamp.outputs.now }}
|
|
||||||
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,12 +1,5 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## v4.1.2
|
|
||||||
- Fix: Disable sparse checkout whenever `sparse-checkout` option is not present @dscho in https://github.com/actions/checkout/pull/1598
|
|
||||||
|
|
||||||
## v4.1.1
|
|
||||||
- Correct link to GitHub Docs by @peterbe in https://github.com/actions/checkout/pull/1511
|
|
||||||
- Link to release page from what's new section by @cory-miller in https://github.com/actions/checkout/pull/1514
|
|
||||||
|
|
||||||
## v4.1.0
|
## v4.1.0
|
||||||
- [Add support for partial checkout filters](https://github.com/actions/checkout/pull/1396)
|
- [Add support for partial checkout filters](https://github.com/actions/checkout/pull/1396)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
* @actions/actions-launch
|
* @actions/actions-runtime
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
This action checks-out your repository under `$GITHUB_WORKSPACE`, so your workflow can access it.
|
This action checks-out your repository under `$GITHUB_WORKSPACE`, so your workflow can access it.
|
||||||
|
|
||||||
Only a single commit is fetched by default, for the ref/SHA that triggered the workflow. Set `fetch-depth: 0` to fetch all history for all branches and tags. Refer [here](https://docs.github.com/actions/using-workflows/events-that-trigger-workflows) to learn which commit `$GITHUB_SHA` points to for different events.
|
Only a single commit is fetched by default, for the ref/SHA that triggered the workflow. Set `fetch-depth: 0` to fetch all history for all branches and tags. Refer [here](https://help.github.com/en/articles/events-that-trigger-workflows) to learn which commit `$GITHUB_SHA` points to for different events.
|
||||||
|
|
||||||
The auth token is persisted in the local git config. This enables your scripts to run authenticated git commands. The token is removed during post-job cleanup. Set `persist-credentials: false` to opt-out.
|
The auth token is persisted in the local git config. This enables your scripts to run authenticated git commands. The token is removed during post-job cleanup. Set `persist-credentials: false` to opt-out.
|
||||||
|
|
||||||
@@ -12,7 +12,9 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl
|
|||||||
|
|
||||||
# What's new
|
# What's new
|
||||||
|
|
||||||
Please refer to the [release page](https://github.com/actions/checkout/releases/latest) for the latest release notes.
|
- Updated default runtime to node20
|
||||||
|
- This requires a minimum Actions Runner version of [v2.308.0](https://github.com/actions/runner/releases/tag/v2.308.0).
|
||||||
|
- Added support for fetching without the `--progress` option
|
||||||
|
|
||||||
# Usage
|
# Usage
|
||||||
|
|
||||||
@@ -62,11 +64,6 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
|
|||||||
# Default: true
|
# Default: true
|
||||||
ssh-strict: ''
|
ssh-strict: ''
|
||||||
|
|
||||||
# The user to use when connecting to the remote SSH host. By default 'git' is
|
|
||||||
# used.
|
|
||||||
# Default: git
|
|
||||||
ssh-user: ''
|
|
||||||
|
|
||||||
# Whether to configure the token or SSH key with the local git config
|
# Whether to configure the token or SSH key with the local git config
|
||||||
# Default: true
|
# Default: true
|
||||||
persist-credentials: ''
|
persist-credentials: ''
|
||||||
|
|||||||
@@ -169,8 +169,9 @@ describe('git-auth-helper tests', () => {
|
|||||||
|
|
||||||
// Mock fs.promises.readFile
|
// Mock fs.promises.readFile
|
||||||
const realReadFile = fs.promises.readFile
|
const realReadFile = fs.promises.readFile
|
||||||
jest.spyOn(fs.promises, 'readFile').mockImplementation(
|
jest
|
||||||
async (file: any, options: any): Promise<Buffer> => {
|
.spyOn(fs.promises, 'readFile')
|
||||||
|
.mockImplementation(async (file: any, options: any): Promise<Buffer> => {
|
||||||
const userKnownHostsPath = path.join(
|
const userKnownHostsPath = path.join(
|
||||||
os.homedir(),
|
os.homedir(),
|
||||||
'.ssh',
|
'.ssh',
|
||||||
@@ -181,8 +182,7 @@ describe('git-auth-helper tests', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return await realReadFile(file, options)
|
return await realReadFile(file, options)
|
||||||
}
|
})
|
||||||
)
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
|
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
|
||||||
@@ -727,7 +727,6 @@ async function setup(testName: string): Promise<void> {
|
|||||||
branchDelete: jest.fn(),
|
branchDelete: jest.fn(),
|
||||||
branchExists: jest.fn(),
|
branchExists: jest.fn(),
|
||||||
branchList: jest.fn(),
|
branchList: jest.fn(),
|
||||||
disableSparseCheckout: jest.fn(),
|
|
||||||
sparseCheckout: jest.fn(),
|
sparseCheckout: jest.fn(),
|
||||||
sparseCheckoutNonConeMode: jest.fn(),
|
sparseCheckoutNonConeMode: jest.fn(),
|
||||||
checkout: jest.fn(),
|
checkout: jest.fn(),
|
||||||
@@ -796,8 +795,7 @@ async function setup(testName: string): Promise<void> {
|
|||||||
),
|
),
|
||||||
tryDisableAutomaticGarbageCollection: jest.fn(),
|
tryDisableAutomaticGarbageCollection: jest.fn(),
|
||||||
tryGetFetchUrl: jest.fn(),
|
tryGetFetchUrl: jest.fn(),
|
||||||
tryReset: jest.fn(),
|
tryReset: jest.fn()
|
||||||
version: jest.fn()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
@@ -821,7 +819,6 @@ async function setup(testName: string): Promise<void> {
|
|||||||
sshKey: sshPath ? 'some ssh private key' : '',
|
sshKey: sshPath ? 'some ssh private key' : '',
|
||||||
sshKnownHosts: '',
|
sshKnownHosts: '',
|
||||||
sshStrict: true,
|
sshStrict: true,
|
||||||
sshUser: '',
|
|
||||||
workflowOrganizationId: 123456,
|
workflowOrganizationId: 123456,
|
||||||
setSafeDirectory: true,
|
setSafeDirectory: true,
|
||||||
githubServerUrl: githubServerUrl
|
githubServerUrl: githubServerUrl
|
||||||
|
|||||||
@@ -462,7 +462,6 @@ async function setup(testName: string): Promise<void> {
|
|||||||
branchList: jest.fn(async () => {
|
branchList: jest.fn(async () => {
|
||||||
return []
|
return []
|
||||||
}),
|
}),
|
||||||
disableSparseCheckout: jest.fn(),
|
|
||||||
sparseCheckout: jest.fn(),
|
sparseCheckout: jest.fn(),
|
||||||
sparseCheckoutNonConeMode: jest.fn(),
|
sparseCheckoutNonConeMode: jest.fn(),
|
||||||
checkout: jest.fn(),
|
checkout: jest.fn(),
|
||||||
@@ -501,7 +500,6 @@ async function setup(testName: string): Promise<void> {
|
|||||||
}),
|
}),
|
||||||
tryReset: jest.fn(async () => {
|
tryReset: jest.fn(async () => {
|
||||||
return true
|
return true
|
||||||
}),
|
})
|
||||||
version: jest.fn()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import {GitVersion} from '../src/git-version'
|
import {GitVersion} from '../lib/git-version'
|
||||||
import {MinimumGitSparseCheckoutVersion} from '../src/git-command-manager'
|
|
||||||
|
|
||||||
describe('git-version tests', () => {
|
describe('git-version tests', () => {
|
||||||
it('basics', async () => {
|
it('basics', async () => {
|
||||||
@@ -43,44 +42,4 @@ describe('git-version tests', () => {
|
|||||||
expect(version.checkMinimum(new GitVersion('5.1'))).toBeFalsy()
|
expect(version.checkMinimum(new GitVersion('5.1'))).toBeFalsy()
|
||||||
expect(version.checkMinimum(new GitVersion('5.1.2'))).toBeFalsy()
|
expect(version.checkMinimum(new GitVersion('5.1.2'))).toBeFalsy()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('sparse checkout', async () => {
|
|
||||||
const minSparseVer = MinimumGitSparseCheckoutVersion
|
|
||||||
expect(new GitVersion('1.0').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('1.99').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.0').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.24').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.24.0').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.24.9').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.25').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.25.0').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.25.1').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.25.9').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.26').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.26.0').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.26.1').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.26.9').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.27').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.27.0').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.27.1').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
expect(new GitVersion('2.27.9').checkMinimum(minSparseVer)).toBeFalsy()
|
|
||||||
// /---------------------------------------
|
|
||||||
// ^^^ before / after vvv
|
|
||||||
// --------------------------/
|
|
||||||
expect(new GitVersion('2.28').checkMinimum(minSparseVer)).toBeTruthy()
|
|
||||||
expect(new GitVersion('2.28.0').checkMinimum(minSparseVer)).toBeTruthy()
|
|
||||||
expect(new GitVersion('2.28.1').checkMinimum(minSparseVer)).toBeTruthy()
|
|
||||||
expect(new GitVersion('2.28.9').checkMinimum(minSparseVer)).toBeTruthy()
|
|
||||||
expect(new GitVersion('2.29').checkMinimum(minSparseVer)).toBeTruthy()
|
|
||||||
expect(new GitVersion('2.29.0').checkMinimum(minSparseVer)).toBeTruthy()
|
|
||||||
expect(new GitVersion('2.29.1').checkMinimum(minSparseVer)).toBeTruthy()
|
|
||||||
expect(new GitVersion('2.29.9').checkMinimum(minSparseVer)).toBeTruthy()
|
|
||||||
expect(new GitVersion('2.99').checkMinimum(minSparseVer)).toBeTruthy()
|
|
||||||
expect(new GitVersion('3.0').checkMinimum(minSparseVer)).toBeTruthy()
|
|
||||||
expect(new GitVersion('3.99').checkMinimum(minSparseVer)).toBeTruthy()
|
|
||||||
expect(new GitVersion('4.0').checkMinimum(minSparseVer)).toBeTruthy()
|
|
||||||
expect(new GitVersion('4.99').checkMinimum(minSparseVer)).toBeTruthy()
|
|
||||||
expect(new GitVersion('5.0').checkMinimum(minSparseVer)).toBeTruthy()
|
|
||||||
expect(new GitVersion('5.99').checkMinimum(minSparseVer)).toBeTruthy()
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -7,11 +7,11 @@ let git: IGitCommandManager
|
|||||||
|
|
||||||
describe('ref-helper tests', () => {
|
describe('ref-helper tests', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
git = ({} as unknown) as IGitCommandManager
|
git = {} as unknown as IGitCommandManager
|
||||||
})
|
})
|
||||||
|
|
||||||
it('getCheckoutInfo requires git', async () => {
|
it('getCheckoutInfo requires git', async () => {
|
||||||
const git = (null as unknown) as IGitCommandManager
|
const git = null as unknown as IGitCommandManager
|
||||||
try {
|
try {
|
||||||
await refHelper.getCheckoutInfo(git, 'refs/heads/my/branch', commit)
|
await refHelper.getCheckoutInfo(git, 'refs/heads/my/branch', commit)
|
||||||
throw new Error('Should not reach here')
|
throw new Error('Should not reach here')
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ describe('retry-helper tests', () => {
|
|||||||
|
|
||||||
it('all attempts fail succeeds', async () => {
|
it('all attempts fail succeeds', async () => {
|
||||||
let attempts = 0
|
let attempts = 0
|
||||||
let error: Error = (null as unknown) as Error
|
let error: Error = null as unknown as Error
|
||||||
try {
|
try {
|
||||||
await retryHelper.execute(() => {
|
await retryHelper.execute(() => {
|
||||||
throw new Error(`some error ${++attempts}`)
|
throw new Error(`some error ${++attempts}`)
|
||||||
|
|||||||
@@ -45,10 +45,6 @@ inputs:
|
|||||||
and `CheckHostIP=no` to the SSH command line. Use the input `ssh-known-hosts` to
|
and `CheckHostIP=no` to the SSH command line. Use the input `ssh-known-hosts` to
|
||||||
configure additional hosts.
|
configure additional hosts.
|
||||||
default: true
|
default: true
|
||||||
ssh-user:
|
|
||||||
description: >
|
|
||||||
The user to use when connecting to the remote SSH host. By default 'git' is used.
|
|
||||||
default: git
|
|
||||||
persist-credentials:
|
persist-credentials:
|
||||||
description: 'Whether to configure the token or SSH key with the local git config'
|
description: 'Whether to configure the token or SSH key with the local git config'
|
||||||
default: true
|
default: true
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Vendored
+26825
-4149
File diff suppressed because one or more lines are too long
@@ -1,12 +0,0 @@
|
|||||||
# Defines the test-ubuntu-git Container Image.
|
|
||||||
# Consumed by actions/checkout CI/CD validation workflows.
|
|
||||||
|
|
||||||
FROM ubuntu:latest
|
|
||||||
|
|
||||||
RUN apt update
|
|
||||||
RUN apt install -y git
|
|
||||||
|
|
||||||
LABEL org.opencontainers.image.title="Ubuntu + git (validation image)"
|
|
||||||
LABEL org.opencontainers.image.description="Ubuntu image with git pre-installed. Intended primarily for testing `actions/checkout` during CI/CD workflows."
|
|
||||||
LABEL org.opencontainers.image.documentation="https://github.com/actions/checkout/tree/main/images/test-ubuntu-git.md"
|
|
||||||
LABEL org.opencontainers.image.licenses=MIT
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
# `test-ubuntu-git` Container Image
|
|
||||||
|
|
||||||
[](https://github.com/actions/checkout/actions/workflows/update-test-ubuntu-git.yml)
|
|
||||||
|
|
||||||
## Purpose
|
|
||||||
|
|
||||||
`test-ubuntu-git` is a container image hosted on the GitHub Container Registry, `ghcr.io`.
|
|
||||||
|
|
||||||
It is intended primarily for testing the [`actions/checkout` repository](https://github.com/actions/checkout) as part of `actions/checkout`'s CI/CD workflows.
|
|
||||||
|
|
||||||
The composition of `test-ubuntu-git` is intentionally minimal. It is comprised of [git](https://git-scm.com/) installed on top of a [base-level ubuntu image](https://hub.docker.com/_/ubuntu/tags).
|
|
||||||
|
|
||||||
# License
|
|
||||||
|
|
||||||
`test-ubuntu-git` is released under the [MIT License](/LICENSE).
|
|
||||||
Generated
+5457
-9214
File diff suppressed because it is too large
Load Diff
+18
-18
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "checkout",
|
"name": "checkout",
|
||||||
"version": "4.1.3",
|
"version": "4.1.0",
|
||||||
"description": "checkout action",
|
"description": "checkout action",
|
||||||
"main": "lib/main.js",
|
"main": "lib/main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -28,28 +28,28 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/actions/checkout#readme",
|
"homepage": "https://github.com/actions/checkout#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.10.0",
|
"@actions/core": "^1.10.1",
|
||||||
"@actions/exec": "^1.0.1",
|
"@actions/exec": "^1.1.1",
|
||||||
"@actions/github": "^5.0.0",
|
"@actions/github": "file:actions-github-6.0.2.tgz",
|
||||||
"@actions/io": "^1.1.3",
|
"@actions/io": "^1.1.3",
|
||||||
"@actions/tool-cache": "^1.1.2",
|
"@actions/tool-cache": "^2.0.1",
|
||||||
"uuid": "^3.3.3"
|
"uuid": "^3.3.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^27.0.2",
|
"@types/jest": "^29.5.5",
|
||||||
"@types/node": "^20.5.3",
|
"@types/node": "^20.8.2",
|
||||||
"@types/uuid": "^3.4.6",
|
"@types/uuid": "^3.4.6",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.45.0",
|
"@typescript-eslint/eslint-plugin": "^6.7.4",
|
||||||
"@typescript-eslint/parser": "^5.45.0",
|
"@typescript-eslint/parser": "^6.7.4",
|
||||||
"@vercel/ncc": "^0.36.1",
|
"@vercel/ncc": "^0.38.0",
|
||||||
"eslint": "^7.32.0",
|
"eslint": "^8.50.0",
|
||||||
"eslint-plugin-github": "^4.3.2",
|
"eslint-plugin-github": "^4.10.1",
|
||||||
"eslint-plugin-jest": "^25.7.0",
|
"eslint-plugin-jest": "^27.4.2",
|
||||||
"jest": "^27.3.0",
|
"jest": "^29.7.0",
|
||||||
"jest-circus": "^27.3.0",
|
"jest-circus": "^29.7.0",
|
||||||
"js-yaml": "^3.13.1",
|
"js-yaml": "^3.13.1",
|
||||||
"prettier": "^1.19.1",
|
"prettier": "^3.0.3",
|
||||||
"ts-jest": "^27.0.7",
|
"ts-jest": "^29.1.1",
|
||||||
"typescript": "^4.4.4"
|
"typescript": "^5.2.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-6
@@ -18,8 +18,9 @@ export function directoryExistsSync(path: string, required?: boolean): boolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Encountered an error when checking whether path '${path}' exists: ${(error as any)
|
`Encountered an error when checking whether path '${path}' exists: ${
|
||||||
?.message ?? error}`
|
(error as any)?.message ?? error
|
||||||
|
}`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,8 +46,9 @@ export function existsSync(path: string): boolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Encountered an error when checking whether path '${path}' exists: ${(error as any)
|
`Encountered an error when checking whether path '${path}' exists: ${
|
||||||
?.message ?? error}`
|
(error as any)?.message ?? error
|
||||||
|
}`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,8 +69,9 @@ export function fileExistsSync(path: string): boolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Encountered an error when checking whether path '${path}' exists: ${(error as any)
|
`Encountered an error when checking whether path '${path}' exists: ${
|
||||||
?.message ?? error}`
|
(error as any)?.message ?? error
|
||||||
|
}`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class GitAuthHelper {
|
|||||||
gitSourceSettings: IGitSourceSettings | undefined
|
gitSourceSettings: IGitSourceSettings | undefined
|
||||||
) {
|
) {
|
||||||
this.git = gitCommandManager
|
this.git = gitCommandManager
|
||||||
this.settings = gitSourceSettings || (({} as unknown) as IGitSourceSettings)
|
this.settings = gitSourceSettings || ({} as unknown as IGitSourceSettings)
|
||||||
|
|
||||||
// Token auth header
|
// Token auth header
|
||||||
const serverUrl = urlHelper.getServerUrl(this.settings.githubServerUrl)
|
const serverUrl = urlHelper.getServerUrl(this.settings.githubServerUrl)
|
||||||
|
|||||||
+10
-21
@@ -11,15 +11,12 @@ import {GitVersion} from './git-version'
|
|||||||
|
|
||||||
// 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
|
||||||
// sparse-checkout not [well-]supported before 2.28 (see https://github.com/actions/checkout/issues/1386)
|
|
||||||
export const MinimumGitVersion = new GitVersion('2.18')
|
export const MinimumGitVersion = new GitVersion('2.18')
|
||||||
export const MinimumGitSparseCheckoutVersion = new GitVersion('2.28')
|
|
||||||
|
|
||||||
export interface IGitCommandManager {
|
export interface IGitCommandManager {
|
||||||
branchDelete(remote: boolean, branch: string): Promise<void>
|
branchDelete(remote: boolean, branch: string): Promise<void>
|
||||||
branchExists(remote: boolean, pattern: string): Promise<boolean>
|
branchExists(remote: boolean, pattern: string): Promise<boolean>
|
||||||
branchList(remote: boolean): Promise<string[]>
|
branchList(remote: boolean): Promise<string[]>
|
||||||
disableSparseCheckout(): Promise<void>
|
|
||||||
sparseCheckout(sparseCheckout: string[]): Promise<void>
|
sparseCheckout(sparseCheckout: string[]): Promise<void>
|
||||||
sparseCheckoutNonConeMode(sparseCheckout: string[]): Promise<void>
|
sparseCheckoutNonConeMode(sparseCheckout: string[]): Promise<void>
|
||||||
checkout(ref: string, startPoint: string): Promise<void>
|
checkout(ref: string, startPoint: string): Promise<void>
|
||||||
@@ -62,7 +59,6 @@ export interface IGitCommandManager {
|
|||||||
tryDisableAutomaticGarbageCollection(): Promise<boolean>
|
tryDisableAutomaticGarbageCollection(): Promise<boolean>
|
||||||
tryGetFetchUrl(): Promise<string>
|
tryGetFetchUrl(): Promise<string>
|
||||||
tryReset(): Promise<boolean>
|
tryReset(): Promise<boolean>
|
||||||
version(): Promise<GitVersion>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function createCommandManager(
|
export async function createCommandManager(
|
||||||
@@ -86,7 +82,6 @@ class GitCommandManager {
|
|||||||
private lfs = false
|
private lfs = false
|
||||||
private doSparseCheckout = false
|
private doSparseCheckout = false
|
||||||
private workingDirectory = ''
|
private workingDirectory = ''
|
||||||
private gitVersion: GitVersion = new GitVersion()
|
|
||||||
|
|
||||||
// Private constructor; use createCommandManager()
|
// Private constructor; use createCommandManager()
|
||||||
private constructor() {}
|
private constructor() {}
|
||||||
@@ -176,10 +171,6 @@ class GitCommandManager {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
async disableSparseCheckout(): Promise<void> {
|
|
||||||
await this.execGit(['sparse-checkout', 'disable'])
|
|
||||||
}
|
|
||||||
|
|
||||||
async sparseCheckout(sparseCheckout: string[]): Promise<void> {
|
async sparseCheckout(sparseCheckout: string[]): Promise<void> {
|
||||||
await this.execGit(['sparse-checkout', 'set', ...sparseCheckout])
|
await this.execGit(['sparse-checkout', 'set', ...sparseCheckout])
|
||||||
}
|
}
|
||||||
@@ -484,10 +475,6 @@ class GitCommandManager {
|
|||||||
return output.exitCode === 0
|
return output.exitCode === 0
|
||||||
}
|
}
|
||||||
|
|
||||||
async version(): Promise<GitVersion> {
|
|
||||||
return this.gitVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
static async createCommandManager(
|
static async createCommandManager(
|
||||||
workingDirectory: string,
|
workingDirectory: string,
|
||||||
lfs: boolean,
|
lfs: boolean,
|
||||||
@@ -564,23 +551,23 @@ class GitCommandManager {
|
|||||||
|
|
||||||
// Git version
|
// Git version
|
||||||
core.debug('Getting git version')
|
core.debug('Getting git version')
|
||||||
this.gitVersion = new GitVersion()
|
let gitVersion = new GitVersion()
|
||||||
let gitOutput = await this.execGit(['version'])
|
let gitOutput = await this.execGit(['version'])
|
||||||
let stdout = gitOutput.stdout.trim()
|
let stdout = gitOutput.stdout.trim()
|
||||||
if (!stdout.includes('\n')) {
|
if (!stdout.includes('\n')) {
|
||||||
const match = stdout.match(/\d+\.\d+(\.\d+)?/)
|
const match = stdout.match(/\d+\.\d+(\.\d+)?/)
|
||||||
if (match) {
|
if (match) {
|
||||||
this.gitVersion = new GitVersion(match[0])
|
gitVersion = new GitVersion(match[0])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!this.gitVersion.isValid()) {
|
if (!gitVersion.isValid()) {
|
||||||
throw new Error('Unable to determine git version')
|
throw new Error('Unable to determine git version')
|
||||||
}
|
}
|
||||||
|
|
||||||
// Minimum git version
|
// Minimum git version
|
||||||
if (!this.gitVersion.checkMinimum(MinimumGitVersion)) {
|
if (!gitVersion.checkMinimum(MinimumGitVersion)) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Minimum required git version is ${MinimumGitVersion}. Your git ('${this.gitPath}') is ${this.gitVersion}`
|
`Minimum required git version is ${MinimumGitVersion}. Your git ('${this.gitPath}') is ${gitVersion}`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -614,14 +601,16 @@ class GitCommandManager {
|
|||||||
|
|
||||||
this.doSparseCheckout = doSparseCheckout
|
this.doSparseCheckout = doSparseCheckout
|
||||||
if (this.doSparseCheckout) {
|
if (this.doSparseCheckout) {
|
||||||
if (!this.gitVersion.checkMinimum(MinimumGitSparseCheckoutVersion)) {
|
// The `git sparse-checkout` command was introduced in Git v2.25.0
|
||||||
|
const minimumGitSparseCheckoutVersion = new GitVersion('2.25')
|
||||||
|
if (!gitVersion.checkMinimum(minimumGitSparseCheckoutVersion)) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Minimum Git version required for sparse checkout is ${MinimumGitSparseCheckoutVersion}. Your git ('${this.gitPath}') is ${this.gitVersion}`
|
`Minimum Git version required for sparse checkout is ${minimumGitSparseCheckoutVersion}. Your git ('${this.gitPath}') is ${gitVersion}`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Set the user agent
|
// Set the user agent
|
||||||
const gitHttpUserAgent = `git/${this.gitVersion} (github-actions-checkout)`
|
const gitHttpUserAgent = `git/${gitVersion} (github-actions-checkout)`
|
||||||
core.debug(`Set git useragent to: ${gitHttpUserAgent}`)
|
core.debug(`Set git useragent to: ${gitHttpUserAgent}`)
|
||||||
this.gitEnv['GIT_HTTP_USER_AGENT'] = gitHttpUserAgent
|
this.gitEnv['GIT_HTTP_USER_AGENT'] = gitHttpUserAgent
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,10 +9,7 @@ import * as path from 'path'
|
|||||||
import * as refHelper from './ref-helper'
|
import * as refHelper from './ref-helper'
|
||||||
import * as stateHelper from './state-helper'
|
import * as stateHelper from './state-helper'
|
||||||
import * as urlHelper from './url-helper'
|
import * as urlHelper from './url-helper'
|
||||||
import {
|
import {IGitCommandManager} from './git-command-manager'
|
||||||
MinimumGitSparseCheckoutVersion,
|
|
||||||
IGitCommandManager
|
|
||||||
} from './git-command-manager'
|
|
||||||
import {IGitSourceSettings} from './git-source-settings'
|
import {IGitSourceSettings} from './git-source-settings'
|
||||||
|
|
||||||
export async function getSource(settings: IGitSourceSettings): Promise<void> {
|
export async function getSource(settings: IGitSourceSettings): Promise<void> {
|
||||||
@@ -211,13 +208,7 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Sparse checkout
|
// Sparse checkout
|
||||||
if (!settings.sparseCheckout) {
|
if (settings.sparseCheckout) {
|
||||||
let gitVersion = await git.version()
|
|
||||||
// no need to disable sparse-checkout if the installed git runtime doesn't even support it.
|
|
||||||
if (gitVersion.checkMinimum(MinimumGitSparseCheckoutVersion)) {
|
|
||||||
await git.disableSparseCheckout()
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
core.startGroup('Setting up sparse checkout')
|
core.startGroup('Setting up sparse checkout')
|
||||||
if (settings.sparseCheckoutConeMode) {
|
if (settings.sparseCheckoutConeMode) {
|
||||||
await git.sparseCheckout(settings.sparseCheckout)
|
await git.sparseCheckout(settings.sparseCheckout)
|
||||||
|
|||||||
@@ -94,11 +94,6 @@ export interface IGitSourceSettings {
|
|||||||
*/
|
*/
|
||||||
sshStrict: boolean
|
sshStrict: boolean
|
||||||
|
|
||||||
/**
|
|
||||||
* The SSH user to login as
|
|
||||||
*/
|
|
||||||
sshUser: string
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates whether to persist the credentials on disk to enable scripting authenticated git commands
|
* Indicates whether to persist the credentials on disk to enable scripting authenticated git commands
|
||||||
*/
|
*/
|
||||||
|
|||||||
+3
-3
@@ -6,7 +6,7 @@ import * as workflowContextHelper from './workflow-context-helper'
|
|||||||
import {IGitSourceSettings} from './git-source-settings'
|
import {IGitSourceSettings} from './git-source-settings'
|
||||||
|
|
||||||
export async function getInputs(): Promise<IGitSourceSettings> {
|
export async function getInputs(): Promise<IGitSourceSettings> {
|
||||||
const result = ({} as unknown) as IGitSourceSettings
|
const result = {} as unknown as IGitSourceSettings
|
||||||
|
|
||||||
// GitHub workspace
|
// GitHub workspace
|
||||||
let githubWorkspacePath = process.env['GITHUB_WORKSPACE']
|
let githubWorkspacePath = process.env['GITHUB_WORKSPACE']
|
||||||
@@ -143,14 +143,14 @@ export async function getInputs(): Promise<IGitSourceSettings> {
|
|||||||
result.sshKnownHosts = core.getInput('ssh-known-hosts')
|
result.sshKnownHosts = core.getInput('ssh-known-hosts')
|
||||||
result.sshStrict =
|
result.sshStrict =
|
||||||
(core.getInput('ssh-strict') || 'true').toUpperCase() === 'TRUE'
|
(core.getInput('ssh-strict') || 'true').toUpperCase() === 'TRUE'
|
||||||
result.sshUser = core.getInput('ssh-user')
|
|
||||||
|
|
||||||
// Persist credentials
|
// Persist credentials
|
||||||
result.persistCredentials =
|
result.persistCredentials =
|
||||||
(core.getInput('persist-credentials') || 'false').toUpperCase() === 'TRUE'
|
(core.getInput('persist-credentials') || 'false').toUpperCase() === 'TRUE'
|
||||||
|
|
||||||
// Workflow organization ID
|
// Workflow organization ID
|
||||||
result.workflowOrganizationId = await workflowContextHelper.getOrganizationId()
|
result.workflowOrganizationId =
|
||||||
|
await workflowContextHelper.getOrganizationId()
|
||||||
|
|
||||||
// Set safe.directory in git global config.
|
// Set safe.directory in git global config.
|
||||||
result.setSafeDirectory =
|
result.setSafeDirectory =
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@ export async function getCheckoutInfo(
|
|||||||
throw new Error('Args ref and commit cannot both be empty')
|
throw new Error('Args ref and commit cannot both be empty')
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = ({} as unknown) as ICheckoutInfo
|
const result = {} as unknown as ICheckoutInfo
|
||||||
const upperRef = (ref || '').toUpperCase()
|
const upperRef = (ref || '').toUpperCase()
|
||||||
|
|
||||||
// SHA only
|
// SHA only
|
||||||
|
|||||||
+1
-2
@@ -12,8 +12,7 @@ export function getFetchUrl(settings: IGitSourceSettings): string {
|
|||||||
const encodedOwner = encodeURIComponent(settings.repositoryOwner)
|
const encodedOwner = encodeURIComponent(settings.repositoryOwner)
|
||||||
const encodedName = encodeURIComponent(settings.repositoryName)
|
const encodedName = encodeURIComponent(settings.repositoryName)
|
||||||
if (settings.sshKey) {
|
if (settings.sshKey) {
|
||||||
const user = settings.sshUser.length > 0 ? settings.sshUser : 'git'
|
return `git@${serviceUrl.hostname}:${encodedOwner}/${encodedName}.git`
|
||||||
return `${user}@${serviceUrl.hostname}:${encodedOwner}/${encodedName}.git`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// "origin" is SCHEME://HOSTNAME[:PORT]
|
// "origin" is SCHEME://HOSTNAME[:PORT]
|
||||||
|
|||||||
@@ -23,8 +23,9 @@ export async function getOrganizationId(): Promise<number | undefined> {
|
|||||||
return id as number
|
return id as number
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
core.debug(
|
core.debug(
|
||||||
`Unable to load organization ID from GITHUB_EVENT_PATH: ${(err as any)
|
`Unable to load organization ID from GITHUB_EVENT_PATH: ${
|
||||||
.message || err}`
|
(err as any).message || err
|
||||||
|
}`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user