57 lines
4.0 KiB
Bash
57 lines
4.0 KiB
Bash
#!/bin/sh
|
|
set -eu
|
|
started_at=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
__GIT_MIRROR_PROXY_PRELUDE__
|
|
mkdir -p "$(dirname "$repo")"
|
|
if [ -d "$repo/objects" ] && [ -f "$repo/HEAD" ]; then
|
|
git --git-dir="$repo" remote set-url origin "$remote" || git --git-dir="$repo" remote add origin "$remote"
|
|
else
|
|
rm -rf "$repo"
|
|
git init --bare "$repo"
|
|
git --git-dir="$repo" remote add origin "$remote"
|
|
fi
|
|
git --git-dir="$repo" config uploadpack.allowReachableSHA1InWant true
|
|
git --git-dir="$repo" config uploadpack.allowAnySHA1InWant true
|
|
git --git-dir="$repo" config http.uploadpack true
|
|
git --git-dir="$repo" config http.receivepack true
|
|
timeout 240 git --git-dir="$repo" fetch origin "+refs/heads/${source_branch}:refs/mirror-stage/heads/${source_branch}"
|
|
source_sha=$(git --git-dir="$repo" rev-parse --verify "refs/mirror-stage/heads/${source_branch}^{commit}")
|
|
source_stage_ref="${source_stage_ref_prefix%/}/$source_sha"
|
|
git --git-dir="$repo" update-ref "$source_stage_ref" "$source_sha"
|
|
git --git-dir="$repo" update-ref "refs/heads/${source_branch}" "$source_sha"
|
|
discarded_stale_gitops=false
|
|
if timeout 240 git --git-dir="$repo" fetch origin "+refs/heads/${gitops_branch}:refs/mirror-stage/heads/${gitops_branch}"; then
|
|
github_gitops=$(git --git-dir="$repo" rev-parse --verify "refs/mirror-stage/heads/${gitops_branch}^{commit}" 2>/dev/null || true)
|
|
local_gitops=$(git --git-dir="$repo" rev-parse --verify "refs/heads/${gitops_branch}^{commit}" 2>/dev/null || true)
|
|
if [ -z "$local_gitops" ] && [ -n "$github_gitops" ]; then
|
|
git --git-dir="$repo" update-ref "refs/heads/${gitops_branch}" "$github_gitops"
|
|
elif [ -n "$local_gitops" ] && [ -n "$github_gitops" ] && [ "$local_gitops" != "$github_gitops" ] && git --git-dir="$repo" merge-base --is-ancestor "$local_gitops" "$github_gitops"; then
|
|
git --git-dir="$repo" update-ref "refs/heads/${gitops_branch}" "$github_gitops"
|
|
elif [ -n "$local_gitops" ] && [ -n "$github_gitops" ] && [ "$local_gitops" != "$github_gitops" ] && [ "${UNIDESK_GIT_MIRROR_DISCARD_STALE_GITOPS:-false}" = "true" ]; then
|
|
git --git-dir="$repo" update-ref "refs/heads/${gitops_branch}" "$github_gitops"
|
|
discarded_stale_gitops=true
|
|
printf '%s\n' "git-mirror sync: discarded stale local gitops ref local=${local_gitops} github=${github_gitops}" >&2
|
|
fi
|
|
fi
|
|
git --git-dir="$repo" update-server-info
|
|
export repository source_branch source_stage_ref gitops_branch started_at discarded_stale_gitops
|
|
summary_tmp=/tmp/HWLAB.last-sync.json.$$
|
|
node <<'NODE' > "$summary_tmp"
|
|
const { execFileSync } = require('node:child_process');
|
|
const repository = process.env.repository;
|
|
const sourceBranch = process.env.source_branch;
|
|
const gitopsBranch = process.env.gitops_branch;
|
|
const repoPath = `/cache/${repository}.git`;
|
|
function rev(ref) { try { return execFileSync('git', ['--git-dir=' + repoPath, 'rev-parse', '--verify', ref + '^{commit}'], { encoding: 'utf8' }).trim(); } catch { return null; } }
|
|
const localSource = rev(`refs/heads/${sourceBranch}`);
|
|
const githubSource = rev(`refs/mirror-stage/heads/${sourceBranch}`);
|
|
const sourceStageRef = process.env.source_stage_ref;
|
|
const sourceSnapshot = sourceStageRef ? rev(sourceStageRef) : null;
|
|
const localGitops = rev(`refs/heads/${gitopsBranch}`);
|
|
const githubGitops = rev(`refs/mirror-stage/heads/${gitopsBranch}`);
|
|
const pendingFlush = Boolean(localGitops && (!githubGitops || localGitops !== githubGitops));
|
|
console.log(JSON.stringify({ event: 'git-mirror-sync', repo: repository, status: 'succeeded', startedAt: process.env.started_at, syncedAt: new Date().toISOString(), sourceAuthority: 'git-mirror-snapshot', localSource, githubSource, sourceStageRef, sourceSnapshot, gitopsBranch, localGitops, githubGitops, sourceInSync: Boolean(localSource && githubSource && localSource === githubSource && sourceSnapshot === githubSource), gitopsInSync: Boolean(localGitops && githubGitops && localGitops === githubGitops), pendingFlush, discardedStaleGitops: process.env.discarded_stale_gitops === 'true' }));
|
|
NODE
|
|
tee /cache/HWLAB.last-sync.json < "$summary_tmp"
|
|
rm -f "$summary_tmp"
|