Reticulum-Go/scripts/ci/checkout.sh

101 lines
3.1 KiB
Bash

#!/bin/sh
# Clone or shallow-fetch the repository using Gitea/GitHub Actions-compatible env.
#
# CI workflows may use actions/checkout on GitHub or inline git in other hosts; this script
# is for local runs or act when you want a single shared implementation.
# Use this script for local runs or act when you want a single shared implementation.
#
# Usage: checkout.sh [fetch_depth]
# fetch_depth: commit depth (default 1), or 0 for full clone then checkout SHA.
#
# Env: GITEA_SERVER_URL or GITHUB_SERVER_URL, GITEA_REPOSITORY or GITHUB_REPOSITORY,
# GITHUB_SHA (or GITEA_SHA), optional GITHUB_REF / GITEA_REF / GITHUB_REF_NAME.
# Optional: GITEA_TOKEN or GITHUB_TOKEN, GITEA_WORKSPACE or GITHUB_WORKSPACE.
#
# Prefers fetching GITHUB_REF when set (e.g. refs/heads/master) because some Git hosts
# do not allow shallow fetch by raw SHA over HTTPS.
set -eu
FETCH_DEPTH="${1:-1}"
SERVER="${GITEA_SERVER_URL:-${GITHUB_SERVER_URL:-}}"
REPO="${GITEA_REPOSITORY:-${GITHUB_REPOSITORY:-}}"
SHA="${GITHUB_SHA:-${GITEA_SHA:-}}"
REF="${GITHUB_REF:-${GITEA_REF:-}}"
TOKEN="${GITEA_TOKEN:-${GITHUB_TOKEN:-}}"
WORKSPACE="${GITEA_WORKSPACE:-${GITHUB_WORKSPACE:-.}}"
REF_TYPE="${GITHUB_REF_TYPE:-${GITEA_REF_TYPE:-branch}}"
if [ -z "$REF" ] && [ -z "${GITHUB_REF_NAME:-}" ] && [ -n "${GITEA_REF_NAME:-}" ]; then
REF="refs/heads/${GITEA_REF_NAME}"
elif [ -z "$REF" ] && [ -n "${GITHUB_REF_NAME:-}" ]; then
case "$REF_TYPE" in
tag)
REF="refs/tags/${GITHUB_REF_NAME}"
;;
*)
REF="refs/heads/${GITHUB_REF_NAME}"
;;
esac
fi
SERVER="${SERVER%/}"
if [ -z "$SERVER" ] || [ -z "$REPO" ]; then
echo "checkout.sh: need SERVER and REPO (GITEA_* or GITHUB_* URL and repository)" >&2
exit 1
fi
if [ -z "$SHA" ] && [ -z "$REF" ]; then
echo "checkout.sh: need GITHUB_SHA (or GITEA_SHA) and/or GITHUB_REF (or GITEA_REF / *_REF_NAME)" >&2
exit 1
fi
cd "$WORKSPACE"
if [ -n "$TOKEN" ]; then
git config --global credential.helper \
"!f() { echo username=x-access-token; echo \"password=${TOKEN}\"; }; f"
fi
ORIGIN="${SERVER}/${REPO}.git"
checkout_target() {
if [ -n "$SHA" ]; then
git checkout -q "$SHA" 2>/dev/null || git checkout -q FETCH_HEAD
else
git checkout -q FETCH_HEAD
fi
}
fetch_shallow() {
if [ -n "$REF" ]; then
if git fetch -q --depth="$FETCH_DEPTH" origin "$REF"; then
return 0
fi
echo "checkout.sh: fetch by ref failed (${REF}), trying SHA" >&2
fi
if [ -n "$SHA" ]; then
git fetch -q --depth="$FETCH_DEPTH" origin "$SHA"
return $?
fi
return 1
}
if [ "$FETCH_DEPTH" = "0" ]; then
git clone -q "$ORIGIN" .
checkout_target
else
if [ -d .git ]; then
git remote set-url origin "$ORIGIN" 2>/dev/null || {
git remote remove origin 2>/dev/null || true
git remote add origin "$ORIGIN"
}
else
git init -q
git remote add origin "$ORIGIN"
fi
fetch_shallow || exit 1
checkout_target
fi
echo "Checked out ${REPO} at $(git rev-parse --short HEAD)"