2 Commits
1.3.2 ... main

View File

@ -11,9 +11,10 @@ set -eu
readonly PROGNAME=`/usr/bin/basename $0` readonly PROGNAME=`/usr/bin/basename $0`
readonly PROGPATH=`echo $0 | sed -e 's,[\\/][^\\/][^\\/]*$,,'` readonly PROGPATH=`echo $0 | sed -e 's,[\\/][^\\/][^\\/]*$,,'`
readonly REVISION="1.3.2" readonly REVISION="1.5.0"
repo="" repo="" # the OLD repo
transfer="" # the NEW repo
login_old="" login_old=""
login_new="" login_new=""
dry_run=true dry_run=true
@ -23,7 +24,7 @@ use_colour=true
# #
# FUNCTIONS # FUNCTIONS
# #
print_help() print_help ()
{ {
echo "--- $PROGNAME $REVISION" echo "--- $PROGNAME $REVISION"
cat << "EOF" cat << "EOF"
@ -75,13 +76,15 @@ USAGE
PARAMETERS PARAMETERS
-r | --repo required, i.e. "my_organisation/my_repository" -r | --repo required, i.e. "my_organisation/my_repository"
-t | --transfer optional, if the new repo has another organisation / name
if not set transfer is set to "repo"
-o | --login_old required, tea-id of your old login -o | --login_old required, tea-id of your old login
-n | --login_new required, tea-id of your new login -n | --login_new required, tea-id of your new login
-w | --wait wait time in s between issue handling (default 0.25) -w | --wait wait time in s between issue handling (default 0.25)
EOF EOF
} }
error_in_or_out_not_specified() error_in_or_out_not_specified ()
{ {
echo -e "Error: --repo, --login_old and --login_new must be specified\n"; echo -e "Error: --repo, --login_old and --login_new must be specified\n";
print_help; print_help;
@ -89,16 +92,43 @@ error_in_or_out_not_specified()
} }
# @param $1 "command" → the command to check for # @param $1 "command" → the command to check for
checkCommand() checkCommand ()
{ {
command -v "$1" >/dev/null 2>&1 || { echo >&2 "Command ${1} is required but it's not installed. Aborting."; exit 42; } command -v "$1" >/dev/null 2>&1 || { echo >&2 "Command ${1} is required but it's not installed. Aborting."; exit 42; }
} }
# collects all data from the given gitea instance+repo,
# uses pagination to really get all data (limit may be set by the server)
# get_all_data_from_gitea "$login_old" "$repo"
get_all_data_from_gitea ()
{
local readonly l="$1"
local readonly r="$2"
local _collect=""
local _page=1
while true; do
# get data from repo and remove [ and ]
local _tmp=$(tea issues list --output json --login "$l" --repo "$r" --state all --limit 100 --fields index,author,assignees --page $_page | sed 's/\[//g' | sed 's/\]//g')
if [[ $(echo "[$_tmp]" | jq length) -eq 0 ]]; then
break
fi
if [[ -z "$_collect" ]] then
_collect="$_tmp"
else
_collect="$_collect,$_tmp"
fi
_page=$(($_page+1));
done
echo "[$_collect]"
return 0;
}
# #
# PARAMETERS # PARAMETERS
# #
if [[ "$@" == "" ]] ; then error_in_or_out_not_specified ; fi if [[ "$@" == "" ]] ; then error_in_or_out_not_specified ; fi
readonly TEMP=$(getopt -o h,r:o:n:w:c --long help,GO,colour,color,repo:,login_old:,login_new:,wait: -n "${PROGNAME}" -- "$@") readonly TEMP=$(getopt -o h,r:t:o:n:w:c --long help,GO,colour,color,repo:,transfer:,login_old:,login_new:,wait: -n "${PROGNAME}" -- "$@")
eval set -- "${TEMP}" eval set -- "${TEMP}"
while true ; do while true ; do
case "$1" in case "$1" in
@ -113,6 +143,10 @@ while true ; do
repo="$2" repo="$2"
shift shift
;; ;;
--transfer|-t)
transfer="$2"
shift
;;
--login_old|-o) --login_old|-o)
login_old="$2" login_old="$2"
shift shift
@ -136,8 +170,12 @@ while true ; do
shift shift
done done
if [[ "$transfer" == "" ]]; then
transfer="$repo"
fi
# check required # check required
if [[ -z "$repo" || -z "$login_old" || -z "$login_new" ]] ; then error_in_or_out_not_specified ; fi if [[ -z "$repo" || -z "$transfer" || -z "$login_old" || -z "$login_new" ]] ; then error_in_or_out_not_specified ; fi
# #
# START # START
@ -159,8 +197,9 @@ checkCommand tr
# check access and get data # check access and get data
echo "# checking access to OLD (\"$login_old\") and NEW (\"$login_new\")" echo "# checking access to OLD (\"$login_old\") and NEW (\"$login_new\")"
readonly json_old=$(tea issues list --output json --login "$login_old" --repo "$repo" --state all --limit 99999 --fields index,author,assignees)
readonly json_new=$(tea issues list --output json --login "$login_new" --repo "$repo" --state all --limit 99999 --fields index,author,assignees) readonly json_old=$(get_all_data_from_gitea "$login_old" "$repo")
readonly json_new=$(get_all_data_from_gitea "$login_new" "$transfer")
echo "# running consistency checks" echo "# running consistency checks"
readonly json_old_ids=$(echo "$json_old" | jq ".[] | .index" | sort -n) readonly json_old_ids=$(echo "$json_old" | jq ".[] | .index" | sort -n)
@ -188,14 +227,14 @@ while IFS="¬"; read -r index author assignees; do
# comment for the original author # comment for the original author
if [ $dry_run = false ]; then if [ $dry_run = false ]; then
echo "migrator: this issue was created by @$author and will be assigned to '$assignees'" | tea comment --login "$login_new" --repo "$repo" "$index" >/dev/null echo "migrator: this issue was created by @$author and will be assigned to '$assignees'" | tea comment --login "$login_new" --repo "$transfer" "$index" >/dev/null
fi fi
# assignment # assignment
t="OK" t="OK"
if [[ -n $assignees ]]; then if [[ -n $assignees ]]; then
if [ $dry_run = false ]; then if [ $dry_run = false ]; then
tea issue edit --login "$login_new" --repo "$repo" --add-assignees "$assignees" "$index" >/dev/null tea issue edit --login "$login_new" --repo "$transfer" --add-assignees "$assignees" "$index" >/dev/null
fi fi
else else
t="OK (no assignee)" t="OK (no assignee)"