import/bitbucket/migrate_to_gitea.sh

100 lines
1.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euf -o pipefail
curp="$(cd "$(dirname "$0")" && pwd)"
bb_projects() {
# get all projects
curl --silent \
-u ${BB_ADMIN_USERNAME}:${SRC_TOKEN} \
"${BB_SERVER_URL}/rest/api/1.0/projects/" |
jq -r '.values[] | .key' |
tr '[:upper:]' '[:lower:]'
}
bb_repos() {
[ -z "$1" ] && return
# by project
curl --silent \
-u ${BB_ADMIN_USERNAME}:${SRC_TOKEN} \
"${BB_SERVER_URL}/rest/api/1.0/projects/$1/repos/" |
jq -r '.values[].name' |
tr '[:upper:]' '[:lower:]'
}
# unset all GITEA_* variables
unset "${!GITEA_@}"
[ -f "$curp/init.sh" ] && source "$curp/init.sh"
[ -z "${SRC_TOKEN}" ] && {
echo "SRC_TOKEN is empty" 1>&2
exit 1
}
: ${BB_ADMIN_USERNAME:=$USER}
: ${BB_ADMIN_PASSWORD:=}
ARGS=()
pos_arg_flag=0
while [[ $# -gt 0 ]]; do
if [ "${pos_arg_flag}" -eq "1" ]; then
ARGS+=("$1")
shift 1
continue
fi
case "$1" in
--url | -u)
BB_SERVER_URL="$2"
shift 2
;;
--token | -t)
SRC_TOKEN="$2"
shift 2
;;
--admin | -a)
BB_ADMIN_USERNAME="$2"
shift 2
;;
--password | -p)
BB_ADMIN_PASSWORD="$2"
shift 2
;;
--pushurl | -s)
BB_SERVER_PUSH_URL="$2"
shift 2
;;
--)
pos_arg_flag=1
shift 1
;;
--*=*)
set -- "$(cat - <<<"$1" | cut -d '=' -f1)" "$(cat - <<<"$1" | cut -d '=' -f2-)" "${@:3}"
;;
*)
ARGS+=("$1")
shift 1
;;
esac
done
[ -z "${BB_SERVER_PUSH_URL}" ] &&
BB_SERVER_PUSH_URL="$(echo "${BB_SERVER_URL}" | perl -pe "s#(https?://)#\${1}${BB_ADMIN_USERNAME}:${BB_ADMIN_PASSWORD}@#")/scm/"
# mirror all remote repos and get changes
for prj in $(bb projects); do
for repo in $(bb repo "$prj"); do
if [ -d "$curp/$prj/$repo" ]; then
(
cd "$curp/$prj/$repo"
git remote update
)
else
git clone --mirror "${BB_SERVER_PUSH_URL}/$prj/$repo" "$prj/$repo"
fi
done
done
# migrate all repos to gitea
"$curp/../migrate.sh" "$@"