#!/bin/bash # # Rename an e-smith package as smeserver and change relevant files # Will migrate a repository from the source organisation into your work area and rename it as smeserver and do all changes there. # If transfer is specified it will then transfer the new repository to the source organisation (you MUST be an owner to fo this) # $1 = Module name e.g. e-smith-dnscache # $2-$5 can appear in any order and are optional # = Organisation (smeserver or user - defaults to smeserver) # = "local" will use parameters set for local repository else it will use remote # = "force" will automagically delete an existing repo, otherwise it will prompt # = "transfer" will push completed package into source organisation (other wise leave in your area) # = "debug" run in debug mode # = "silent" suppress success message # This works whether the repo and local files exist of not (it deletes them if necessary) # if [[ -z $1 ]] ; then echo "Rename an e-smith package as smeserver and change relevant files" echo "rename-e-smith-pkg.sh [ ]" echo " = Module/package name (e.g. e-smith-dnscache)" echo " can appear in any order and are optional" echo " - (any valid organisation - defaults to smeserver)" echo " - will use parameters set for local repository, else it will use remote" echo " - will automagically delete an existing repo, otherwise it will prompt" echo " - will push completed package into source organisation (other wise leave in your area)" echo " - run in debug mode" echo " - suppress success message" exit 0 fi # # Pull in parameters from a config file ~/.smegit/config # 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-cvs2git.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" DEBUG= if [ ${smegit_DEBUG} == "true" ] ; then DEBUG=true ; fi if [ $DEBUG ] ; then echo "************found ini file: $inifilename" ; fi if [[ $smegit_WORKDIR == ~* ]] ; then # relative to users home dir WORKDIR=$(echo ~)${smegit_WORKDIR:1} else # absolute path WORKDIR=${smegit_WORKDIR} fi # Command line parameters #Extract SOURCEPKG=$1 TARGETPKG=${SOURCEPKG/e-smith/smeserver} GITEAHOST=${remote_GITEAHOST} GITEAACCESSTOKEN=${remote_GITEAACCESSTOKEN} SOURCEORG="smeserver" TARGETORG=${remote_USER} DELETEIT= NOOUTPUT= TRANSFER= for param in $2 $3 $4 $5 $6; do if [ $param ] ; then case $param in local ) GITEAHOST=${local_GITEAHOST} GITEAACCESSTOKEN=${local_GITEAACCESSTOKEN} TARGETORG=${local_USER} ;; force ) DELETEIT=true ;; debug ) DEBUG=true ;; silent ) NOOUTPUT=true ;; transfer ) TRANSFER=true ;; * ) SOURCEORGORG=$param ;; esac else break fi done # Debug settings # Make this null if you want lots of output. Still quite a bit anyway QUIET="--quiet" SILENT="-s" if [ $DEBUG ] ; then QUIET= SILENT="-v" fi # Make this null to get curl to check ssl cert checkSSL="-k" #Check that source package exists if [ $DEBUG ] ; then echo "Check if $SOURCEORG/$SOURCEPKG is there!" ; fi RESPONSE=$(curl $SILENT -o /dev/null -w "%{http_code}" "$GITEAHOST/api/v1/repos/$SOURCEORG/$SOURCEPKG") if [ "$RESPONSE" == "200" ]; then if [ $DEBUG ] ; then echo "Repository for $SOURCEORG/$SOURCEPKG exists!" ; fi else echo "************Repository for $SOURCEORG/$SOURCEPKG does not exist on $GITEAHOST ($RESPONSE)" exit 1 fi #Check that target package does not exist if [ $DEBUG ] ; then echo "Check if $TARGETORG/$TARGETPKG is there!" ; fi RESPONSE=$(curl $SILENT -o /dev/null -w "%{http_code}" "$GITEAHOST/api/v1/repos/$TARGETORG/$TARGETPKG") if [ "$RESPONSE" == "200" ]; then if [ $DEBUG ] ; then echo "Repository for $TARGETORG/$TARGETPKG exists!" ; fi if [ -z ${DELETEIT} ] ; then while true; do read -p "Do you wish to delete it and continue?(y/n) " yn case $yn in [Yy]* ) DELETEIT=true break ;; [Nn]* ) echo "************Abandoning Fork of $SOURCEORG/$SOURCEPKG on $GITEAHOST ($RESPONSE)" exit 1 ;; * ) echo "Please answer yes or no.";; esac done fi if [ $DELETEIT ] ; then if [ $DEBUG ] ; then echo "Deleting $TARGETORG/$TARGETPKG" ; fi RESPONSE=$(curl "$checkSSL" "$SILENT" -X 'DELETE' \ "$GITEAHOST/api/v1/repos/$TARGETORG/$TARGETPKG" \ -H 'accept: application/json' \ -H "Authorization: token $GITEAACCESSTOKEN" ) fi else if [ $DEBUG ] ; then echo "Repository for $TARGETORG/$TARGETPKG does not exist on $GITEAHOST" ; fi fi #Fork e-smith- into users repositories as smeserver- # - add bugzilla and wiki references # create a Bugzilla URL PRODUCTBUGZILLA="SME%20Server%2010.X" BASEORCONTRIB="base" if [[ "$SOURCEORG" == "smecontribs" ]]; then PRODUCTBUGZILLA="SME%20Contribs" BASEORCONTRIB="contrib" fi # migrate the source package over to target with updated fields if [ $DEBUG ] ; then echo "Migrating $SOURCEORG/$SOURCEPKG as $TARGETORG/$TARGETPKG on $GITEAHOST" ; fi RESPONSE=$(curl $SILENT $checkSSL -o /dev/null -w "%{http_code}" -X 'POST' \ "$GITEAHOST/api/v1/repos/migrate" \ -H 'accept: application/json' \ -H "Authorization: token $GITEAACCESSTOKEN" \ -H 'Content-Type: application/json' \ -d '{ "auth_token": "'"$GITEAACCESSTOKEN"'", "clone_addr": "'"$GITEAHOST/$SOURCEORG/$SOURCEPKG.git"'", "description": "'"SMEServer Koozali developed git repo for $TARGETPKG $BASEORCONTRIB"'", "repo_name": "'"$TARGETPKG"'", "repo_owner": "'"$TARGETORG"'" }' ) if [[ $RESPONSE != 201 ]] ; then echo "Unable to migrate $SOURCEORG/$SOURCEPKG to $TARGETORG/$TARGETPKG ($RESPOMNSE) - Aborting" exit 1 fi # Migrate does NOT copy accross the issues and wiki external links # grab WIKILINK from source package if [ $DEBUG ] ; then echo "Retrieving WIKIKLINK from $SOURCEORG/$SOURCEPKG" ; fi WIKILINK=$(curl "$SILENT" "$checkSSL" -X 'GET' \ "$GITEAHOST/api/v1/repos/$SOURCEORG/$SOURCEPKG" \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -H "Authorization: token $GITEAACCESSTOKEN" | \ jq -r ' .external_wiki.external_wiki_url') if [ $DEBUG ] ; then echo "WIKILINK=$WIKILINK" ; fi # Update the repo with the changed bugzilla url and original wiki url if [ $DEBUG ] ; then echo "Updating Bug and Wiki links" ; fi RESPONSE=$(curl "$SILENT" "$checkSSL" -X 'PATCH' \ "$GITEAHOST/api/v1/repos/$TARGETORG/$TARGETPKG" \ -H 'accept: application/json' \ -H "Authorization: token $GITEAACCESSTOKEN" \ -H 'Content-Type: application/json' \ -d '{ "has_issues": true, "external_tracker": { "external_tracker_format": "https://bugs.koozali.org/show_bug.cgi?id={index}", "external_tracker_style": "numeric", "external_tracker_url": "'"https://bugs.koozali.org/buglist.cgi?component=$TARGETPKG&product=$PRODUCTBUGZILLA"'" }, "has_wiki": true, "external_wiki": { "external_wiki_url": "'"$WIKILINK"'" } }' ) # Create the local Git repository GITFiles=$WORKDIR/GITFiles/$TARGETORG mkdir -p $GITFiles cd $GITFiles # Delete the local first if [ -d "$TARGETPKG" ] ; then if [ $DEBUG ] ; then echo "Deleting local GIT files" ; fi rm -Rf $GITFiles/$TARGETPKG fi # Clone the package if [ $DEBUG ] ; then echo "git clone $GITEAHOST/$TARGETORG/$TARGETPKG.git" ; fi cd $GITFiles git clone "$GITEAHOST/$TARGETORG/$TARGETPKG.git" $QUIET cd $GITFiles/$TARGETPKG #Update README.md # - new name sed -i 's/e-smith/smeserver/g' README.md # - Bugzilla link to new name whilst keeping old link for Legacy sed -i '/Show list/p' README.md sed -i "/Show list/{ n; s/Show list of outstanding bugs\:/And a list of outstanding Legacy bugs\: ($SOURCEPKG)/}" README.md sed -i '/Show list/{ n; s/smeserver/e-smith/g}' README.md sed -i '/Show list/ s/)/)\\/' README.md git add README.md #Update Makefile # - NAME := smeserver- sed -i 's/e-smith/smeserver/g' Makefile git add Makefile # spec file #Rename e-smith-.spec as smeserver-.spec git mv "$SOURCEPKG.spec" "$TARGETPKG.spec" #Update smeserver-.spec # - change name to smeserver- sed -i "/^Summary:/ s/e-smith/smeserver/" "$TARGETPKG.spec" sed -i "/^Name:/ s/e-smith/smeserver/" "$TARGETPKG.spec" sed -i "s/^%define name.*$SOURCEPKG/%define name $TARGETPKG/" "$TARGETPKG.spec" sed -i "/^%description/{ n; s/e-smith/smeserver/}" "$TARGETPKG.spec" # Hold off on these for now # - change all Requires: and BuildRequires: e-smith* to smeserver* sed -i 's/^Requires:.*e-smith/Requires: smeserver/g' "$TARGETPKG.spec" sed -i 's/^BuildRequires:.*e-smith/BuildRequires: smeserver/g' "$TARGETPKG.spec" # - add changelog entry (Bugzilla #12359) # Bump the release and add changelog change-log "$TARGETPKG.spec" >/dev/null 2>&1 # and edit in the reason and add by whom sed -i "s/fix \[SME: \]/Rename to $TARGETPKG \[SME: 12359\]/" "$TARGETPKG.spec" sed -i 's/ME MYSELF /rename-e-smith-pkg.sh by Trevor Batley /' "$TARGETPKG.spec" # - add PROVIDES: smeserver- sed -i "/Requires:/i Provides: $SOURCEPKG" "$TARGETPKG.spec" # - change Source: to new standard of tar.gz #sed -i "/^Source:/ s/tar.xz/tar.gz/" "$TARGETPKG.spec" # tell git about the changes git add "$TARGETPKG.spec" #Delete archivefilename file if it follows the new standard if [[ -e archivefilename ]] ; then if [ $DEBUG ] ; then echo "archivefilename exists" ; fi if [[ $(cat archivefilename) == "$TARGETPKG-*.tar.gz" ]] ; then if [ $DEBUG ] ; then echo "deleteing archivefilename - meets new standard" ; fi git rm archivefilename $QUIET else if [ $DEBUG ] ; then echo "substituting smeserver for e-smith in archivefilename" ; fi sed -i 's/e-smith/smeserver/g' archivefilename git add archivefilename fi fi #Update createlinks # - if there is an e-smith--update event rename to smeserver--update and add symlink git commit -m "rename-e-smith-pkg script (#12359)" $QUIET git push origin &> /dev/null # Do we want to transfer the new package into the source organisation if [ $TRANSFER ] ; then if [ $DEBUG ] ; then echo "Transferring $TARGETORG/$TARGETPKG to $SOURCEORG/$TARGETPKG" ; fi #Check that target package does not exist if [ $DEBUG ] ; then echo "Check if $SORCEORG/$TARGETPKG is there!" ; fi RESPONSE=$(curl $SILENT -o /dev/null -w "%{http_code}" "$GITEAHOST/api/v1/repos/$SOURCEORG/$TARGETPKG") EXISTS= if [ "$RESPONSE" == "200" ]; then EXISTS=true if [ $DEBUG ] ; then echo "Repository for $SOURCEORG/$TARGETPKG exists!" ; fi if [ -z ${DELETEIT} ] ; then while true; do read -p "$SOURCEORG/$TARGETPKG exists! Do you wish to delete it and continue?(y/n) " yn case $yn in [Yy]* ) DELETEIT=true break ;; [Nn]* ) DELETEIT= break ;; * ) echo "Please answer yes or no.";; esac done fi if [ $DELETEIT ] ; then if [ $DEBUG ] ; then echo "Deleting $SOURCEORG/$TARGETPKG" ; fi RESPONSE=$(curl "$checkSSL" "$SILENT" -o /dev/null -w "%{http_code}" -X 'DELETE' \ "$GITEAHOST/api/v1/repos/$SOURCEORG/$TARGETPKG" \ -H 'accept: application/json' \ -H "Authorization: token $GITEAACCESSTOKEN" ) if [[ $RESPONSE != "204" ]] ; then echo "Unable to delete $SOURCEORG/$TARGETPKG ($RESPONSE)" else EXISTS= fi fi else if [ $DEBUG ] ; then echo "Repository for $SOURCEORG/$TARGETPKG does not exist on $GITEAHOST" ; fi fi # Transfer the package back to source organisation if [[ -z $EXISTS ]] ; then if [ $DEBUG ] ; then echo "Actual Transfer" ; fi RESPONSE=$(curl "$SILENT" "$checkSSL" -o /dev/null -w "%{http_code}" -X 'POST' \ "$GITEAHOST/api/v1/repos/$TARGETORG/$TARGETPKG/transfer" \ -H 'accept: application/json' \ -H "Authorization: token $GITEAACCESSTOKEN" \ -H 'Content-Type: application/json' \ -d '{ "new_owner": "'"$SOURCEORG"'" }' ) fi if [[ $EXISTS || $RESPONSE != "202" ]] ; then echo "Unable to transfer $TARGETORG/$TARGETPKG to $SOURCEORG/$TARGETPKG ($RESPONSE) - Aborting!" echo "But everything else has been done and $TARGETORG/$TARGETPKG should be complete." exit 1 else if [[ -z $NOOUTPUT ]] ; then echo "$SOURCEORG/$SOURCEPKG has been renamed as $SOURCEORG/$TARGETPKG" ; fi fi else if [[ -z $NOOUTPUT ]] ; then echo "$SOURCEORG/$SOURCEPKG has been renamed as $TARGETORG/$TARGETPKG" ; fi fi exit 0