diff --git a/scripts/migrate/gogs_migrate.sh b/scripts/migrate/gogs_migrate.sh new file mode 100755 index 0000000000..e9bb5aa02e --- /dev/null +++ b/scripts/migrate/gogs_migrate.sh @@ -0,0 +1,206 @@ +#!/bin/bash + +gitea_version=1.0.1 +tested_gogs_version="0.9.114.1227" +gogs_binary=gogs +gitea_binary=gitea +download_gitea=true +gitea_path= + +function usage() { + echo "Optional parameters: [-b Gitea binary] [-i Gitea install dir] [-o gogs binary] [-h help]"; + exit 1; +} + +while getopts ":b::i:o:h:" opt; do + case $opt in + b) + gitea_binary=${OPTARG} + download_gitea=false + ;; + i) + gitea_path=${OPTARG} + ;; + o) + gogs_binary=${OPTARG} + ;; + h) + usage + ;; + \?) + echo -e "Invalid option: -$OPTARG" + exit 1 + ;; + :) + usage + exit 1 + ;; + esac +done + +function exitOnError() { + if [ "$?" != "0" ]; then + echo -e $1 + exit 1 + fi +} + +function checkBinary() { + if [ ! -f $1 ]; then + echo "Unable to find $1" + exit 1 + fi +} + +function continueYN(){ + while true; do + echo -e "$1 Yes or No" + read yn + case $yn in + [Yy]* ) break;; + [Nn]* ) exit 1;; + * ) echo "Please answer yes or no.";; + esac + done +} + +########## Binary checks +if pidof "$gogs_binary" >/dev/null; then + echo "Please stop gogs before migrating to Gitea" + exit 1 +fi + +checkBinary "$gogs_binary" + +if [ ! -x "$gogs_binary" ]; then + echo "Please make sure that you are running this script as the gogs user" + exit 1 +fi + +########## Version check +gogs_version=$(./$gogs_binary --version) +original_IFS=$IFS +IFS="." && current_version=(${gogs_version#"Gogs version "}) && minimal_version=($tested_gogs_version) +IFS=$original_IFS + +count=0 +for i in "${current_version[@]}" +do + if [ $i -gt ${minimal_version[$count]} ]; then + echo -e "!!!--WARNING--!!!\nYour $gogs_version is newer than the tested Gogs version $tested_gogs_version\nUse this script on your own risk\n!!!--WARNING--!!!" + break + fi + let count+=1 +done + +########## Disclaimer +continueYN "This migration script creates a backup before it starts with the actual migration +If something goes wrong you could always resotre this backup. +The backups are stored into your gogs folder in gogs-dump-[timestamp].zip file + +Migrating from gogs to gitea, are you sure?" + +########## gogs dump +echo "Creating a backup of gogs, this could take a while..." +./"$gogs_binary" dump +exitOnError "Failed to create a gogs dump" + +########## Create Gitea folder +if [ -z "$gitea_path" ]; then + echo "Where do you want to install Gitea?" + read gitea_path +fi + +if [ ! -d "$gitea_path" ]; then + mkdir -p "$gitea_path" + exitOnError +fi + +if [ "$(ls -A $gitea_path)" ]; then + continueYN "!!!--WARNING--!!!\nDirectory $gitea_path is not empty, do you want to continue?" +fi + + +########## Download Gitea +if [ $download_gitea == true ]; then + + ########## Detect os + case "$OSTYPE" in + darwin*) platform="darwin-10.6";; + linux*) platform="linux" ;; + freebsd*) platform="bsd" ;; + netbsd*) platform="bsd" ;; + openbsd*) platform="bsd" ;; + *) echo "Unsupported os: $OSTYPE\n Please download/compile your own binary and run this script with the -b option" exit 1;; + esac + + arch="" + bits="" + if [[ "$platform" == "linux" ]] || [[ "$platform" == "bsd" ]]; then + arch="$(uname -m | sed -e 's/arm\(.*\)/arm-\1/' -e s/aarch64.*/arm64/)" + fi + + if [[ "$platform" == "bsd" ]] && [[ "$arch" != "arm"* ]]; then + echo "Currently Gitea only supports arm prebuilt binarys on bsd" + exit 1 + fi + + if [[ "$arch" != "arm"* ]] && [[ "$arch" != "mips"* ]]; then + arch="" + case "$(getconf LONG_BIT)" in + 64*) bits="amd64";; + 32*) bits="386" ;; + esac + fi + + ########## Wget Gitea + echo "Downloading Gitea" + file="gitea-$gitea_version-$platform-$arch$bits" + url="https://dl.gitea.io/gitea/$gitea_version/$file" + wget "$url" -P "$gitea_path" + exitOnError "Failed to download $url" + + wget "$url.sha256" -P "$gitea_path" + exitOnError "Failed to Gitea checksum $url.sha256" + + echo "Comparing checksums" + gogs_dir=$(pwd) + cd "$gitea_path" + + sha256sum -c "$file.sha256" + exitOnError "Downloaded Gitea checksums do not match" + + rm "$file.sha256" + mv "$file" gitea + cd "$gogs_dir" + +else + checkBinary "$gitea_binary" + if [ "$gitea_binary" != "$gitea_path/gitea" ];then + cp "$gitea_binary" "$gitea_path/gitea" + fi +fi + +########## Copy gogs data to Gitea folder +echo "Copying gogs data to Gitea, this could take a while..." +cp -R custom "$gitea_path" +cp -R data "$gitea_path" +#cp -R conf "$gitea_path" + +########## Moving & deleting old files +#mv $gitea_path/conf $gitea_path/options +cd "$gitea_path" +mv "custom/conf/app.ini" "custom/conf/gogs_app.ini" +url="https://raw.githubusercontent.com/go-gitea/gitea/v$gitea_version/conf/app.ini" +wget "$url" -P "custom/conf/" +exitOnError "Unable to download Gitea app.ini" +rm -f conf/README.md + +echo -e "Migration is almost complete, you only need to merge custom/conf/gogs_app.ini into custom/conf/app.ini" +continueYN "Do you want to start Gitea?" + +########## Starting Gitea +echo "Starting Gitea" +chmod +x gitea +./gitea web +exitOnError "Failed to start Gitea" \ No newline at end of file