#!/bin/bash # # Migrate (mirror) a remote repository # # migrate-repo.sh [] # inifilename=$(echo ~)"/.smegit/config" if [ ! -e $inifilename ] ; then # Not here, look at system default if [ ! -e /etc/smegit.ini ] ; then echo "No ini file found $inifiename or /etc/smegit.ini" echo "git-mirror-org.sh []" exit 1 else initfilename="/etc/smegit.ini" fi fi while read -r line || [[ -n "$line" ]]; do if [[ $line =~ ^\[.*\]$ ]] then section=${line#*[} section=${section%]*} else if [[ $line =~ ^[^#]*= ]] then key=${line%=*} value=${line#*=} declare "${section}_${key}=$value" fi fi done < "$inifilename" if [[ -z $1 ]] ; then echo "migrate-org.sh [ ]" echo " is optional and will default to the gitea user" echo " is optional and will echo the changes, but not execute" exit 0 fi DEBUG= curlsilent="-s" if [ ${smegit_DEBUG} == true ] ; then DEBUG=true ; fi if [ $DEBUG ] ; then echo "found ini file: $inifilename" curlsilent="-v" fi MIRROR="copy" TARGETORG= for $param in $2 $3 $4; do if [ $param ] ; then if [[ $param == "copy" || $param == "mirror" ]] ; then MIRROR=$param elif [[ $param == "review"]] ; then REVIEW=true else TARGETORG=$param fi else break fi done REMOTEACCESSTOKEN=${remote_GITEAACCESSTOKEN} LOCALACCESSTOKEN=${local_GITEAACCESSTOKEN} REMOTEGITEAHOST=${remote_GITEAHOST} LOCALGITEAHOST=${local_GITEAHOST} if [ $DEBUG ] ; then echo "TARGETORG=$TARGETORG" ; fi # check that the target organisation exists locally if [ $DEBUG ] ; then echo "checking that $TARGETORG exists on $LOCALGITEAHOST" ; fi RESPONSE=$(curl $curlsilent -o /dev/null -w "%{http_code}" $LOCALGITEAHOST/$TARGETORG) if [ $DEBUG ] ; then echo "RESPONSE=$RESPONSE" ; fi if [[ "$RESPONSE" != "200" ]] ; then echo "$TARGETORG does not exist on $LOCALGITEAHOST" exit 1 fi if [[ ! $REVIEW ]] ; then while true; do read -p "Are you sure?(y/n) " yn case $yn in [Yy]* ) break;; [Nn]* ) exit;; * ) echo "Please answer yes or no.";; esac done fi # get a list of repositories in the source organisation for page in {1..10} ; do if [ $DEBUG ] ; then echo "getting page $page of repos from $REMOTEGITHOST $1" ; fi RESPONSE=$(curl $curlsilent -X 'GET' \ "$REMOTEGITEAHOST/api/v1/orgs/$1/repos?page=$page" \ -H 'accept: application/json' \ -H "Authorization: token $REMOTEACCESSTOKEN" ) if [ $DEBUG ] ; then echo "RESPONSE=$RESPONSE" ; fi if [[ $RESPONSE == '[]' ]] ; then # we have them all break else echo $RESPONSE | grep -oP '(?<="name":").+?(?=")' | while read repo; do if [ $DEBUG ] ; then echo "git-migrate-repo.sh ${repo} $1 $TARGETORG $MIRROR" ; fi if [[ $REVIEW ]] ; then echo "git-migrate-repo.sh ${repo} $1 $TARGETORG $MIRROR" else git-migrate-repo.sh ${repo} $1 $TARGETORG $MIRROR fi done fi done