You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
DevOps-Bash-tools/github_repo_fork_sync.sh

84 lines
2.5 KiB
Bash

#!/usr/bin/env bash
# vim:ts=4:sts=4:sw=4:et
#
# Author: Hari Sekhon
# Date: 2022-06-17 00:12:59 +0100 (Fri, 17 Jun 2022)
#
# https://github.com/HariSekhon/DevOps-Bash-tools
#
# License: see accompanying Hari Sekhon LICENSE file
#
# If you're using my code you're welcome to connect with me on LinkedIn and optionally send me feedback to help steer this or other code I publish
#
# https://www.linkedin.com/in/HariSekhon
#
set -euo pipefail
[ -n "${DEBUG:-}" ] && set -x
srcdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck disable=SC1090
. "$srcdir/lib/utils.sh"
# shellcheck disable=SC2034,SC2154
usage_description="
Sync's the current fork repo or from the original source repo sync's all repos matching the given ERE regex
First calls a repo sync of the trunk branch, then and calls github_repo_fork_update.sh to raise Pull Requests from trunk to the major branches
If not running in a fork checkout but the \$GITHUB_FORK_REGEX environment is set to any value, then the first argument regex can be omitted
Requires GitHub CLI to be installed and configured
"
# used by usage() in lib/utils.sh
# shellcheck disable=SC2034
usage_args="[<fork_owner_repo_regex>]"
help_usage "$@"
#min_args 1 "$@"
regex="${1:-${GITHUB_FORK_REGEX:-}}"
timestamp "Determining if running from within a forked repo checkout"
is_fork="$(gh api "/repos/{owner}/{repo}" -q '.fork')"
if [ "$is_fork" = true ]; then
timestamp "Confirmed running from within a forked repo checkout"
fork_repos='{owner}/{repo}'
else
timestamp "Not running from a forked repo checkout"
if [ -z "$regex" ]; then
usage "not running in a fork repo and no regex given to select a fork to sync"
fi
timestamp "Getting all forked repos matching regex '$regex'"
set +o pipefail
fork_repos="$(gh api '/repos/{owner}/{repo}/forks' -q '.[].full_name' | grep -Ei "$regex")"
set -o pipefail
if [ -z "$fork_repos" ]; then
die "Failed to find an forked repos matching regex '$regex'"
fi
fi
for owner_repo in $fork_repos; do
echo
timestamp "Sync'ing fork $owner_repo"
gh repo sync "$owner_repo"
echo
timestamp "Raising Pull Requests to major branches for fork $owner_repo"
"$srcdir/github_repo_fork_update.sh" "$owner_repo"
done
timestamp "Fork Sync done"
#gh workflow -R "$fork_repo" run fork-update-pr.yaml -f debug=false
#
#sleep 5
#
#id="$(gh run list --workflow=fork-update-pr.yaml -R "$fork_repo" -L 1 --json databaseId --jq '.[].databaseId')"
#
#gh run watch "$id" -R "$fork_repo"