#!/bin/bash # stages: # - backup # # backup_cgit: # stage: backup # image: alpine:latest # before_script: # - apk add --no-cache bash curl git # - git config --global user.name "GitLab CI" # - git config --global user.email "ci@gitlab.com" # - git remote set-url origin "https://oauth2:${TOKEN}@gitlab.com/user/repo.git" # script: # - /bin/bash cgit-backup.sh # - git checkout main || git checkout -b main # - git add repos/ # - git commit -m "Backup cgit repositories $(date -u +'%Y-%m-%d %H:%M:%S UTC')" || true # - git push origin main -o ci.skip # only: # - schedules # variables: # GIT_STRATEGY: clone #!/bin/bash cgit="https://cgit.heqnx.com" mkdir -p repos repos=$(curl -sSL "${cgit}" || { printf "%s\n" "[err] failed to fetch repository list"; exit 1; }) repos=$(printf "%s\n" "$repos" | grep -o "" | sed -E "s/^/\1/" | sort -u) while IFS= read -r repo_path; do repo_name=$(basename "${repo_path}") repo_url="${cgit}${repo_path}" repo_dir="repos/${repo_name}" printf "%s\n" "[inf] processing ${repo_url}" if test -d "${repo_dir}"; then if test -d "${repo_dir}/.git.bak"; then printf "%s\n" "[inf] restoring .git from .git.bak for ${repo_name}" mv "${repo_dir}/.git.bak" "${repo_dir}/.git" fi printf "%s\n" "[inf] fetching updates for ${repo_name}" default_branch=$(git -C "${repo_dir}" remote show origin | grep "HEAD branch" | awk '{print $NF}' || true) if [ -z "$default_branch" ] || [ "$default_branch" = "(unknown)" ]; then printf "%s\n" "[wrn] could not determine default branch for ${repo_name}, trying 'main' or 'master'" default_branch=$(git -C "${repo_dir}" ls-remote --heads origin | grep -E 'refs/heads/(main|master)$' | head -1 | awk -F'/' '{print $NF}' || true) default_branch=${default_branch:-main} fi printf "%s\n" "[inf] using default branch: ${default_branch}" git -C "${repo_dir}" fetch origin git -C "${repo_dir}" reset --hard "origin/${default_branch}" else printf "%s\n" "[inf] cloning ${repo_name}" git -C repos clone "${repo_url}" default_branch=$(git -C "${repo_dir}" remote show origin | grep "HEAD branch" | awk '{print $NF}' || true) if [ -z "$default_branch" ] || [ "$default_branch" = "(unknown)" ]; then printf "%s\n" "[wrn] could not determine default branch for ${repo_name}, trying 'main' or 'master'" default_branch=$(git -C "${repo_dir}" ls-remote --heads origin | grep -E 'refs/heads/(main|master)$' | head -1 | awk -F'/' '{print $NF}' || true) default_branch=${default_branch:-main} fi printf "%s\n" "[inf] using default branch: ${default_branch}" git -C "${repo_dir}" checkout "${default_branch}" fi if test -d "${repo_dir}/.git"; then printf "%s\n" "[inf] moving .git to .git.bak for ${repo_name}" mv "${repo_dir}/.git" "${repo_dir}/.git.bak" fi done <<< "${repos}"