summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xscripts/mageia-reset-and-import.sh158
1 files changed, 158 insertions, 0 deletions
diff --git a/scripts/mageia-reset-and-import.sh b/scripts/mageia-reset-and-import.sh
new file mode 100755
index 0000000..337d6df
--- /dev/null
+++ b/scripts/mageia-reset-and-import.sh
@@ -0,0 +1,158 @@
+#!/bin/bash
+
+NEWSVNURL="file:///home/colin/svn-git/soft"
+SOFTWARE=
+if [ -d ".git" -a -f ".git/config" -a -f ".git/svn/.metadata" ]; then
+ SOFTWARE=$(grep "fetch = " .git/config | cut -d'=' -f2- | cut -d':' -f1 | sed 's,/trunk,,' | trim)
+fi
+
+if [ -z "$SOFTWARE" ]; then
+ echo "You must run this in a git-svn clone folder." >&2
+ exit 1
+fi
+
+if [ -d ../$SOFTWARE.git ]; then
+ echo "It seems the converted git repository already exists (../$SOFTWARE.git)"
+ exit 1
+fi
+
+echo -n "Finding UUID for SVN Repository $NEWSVNURL... "
+NEWSVNUUID=$(svn info $NEWSVNURL | grep "^Repository UUID:" | sed 's/Repository UUID: //')
+echo $NEWSVNUUID
+
+echo -n "Updating SVN Remote config (old value: $(git config svn-remote.svn.url))... "
+git config svn-remote.svn.url $NEWSVNURL
+echo "done"
+
+echo -n "Updating Internal SVN metadata... "
+sed -i "s,reposRoot = .*$,reposRoot = $NEWSVNURL,;s,uuid = .*$,uuid = $NEWSVNUUID," .git/svn/.metadata
+echo "done"
+
+
+echo
+echo "OK now the fun stuff beings. You need to find the git commit at which you want to"
+echo "start the magiea import. This will typically require some investigation but the"
+echo "date will be around February 2011."
+echo "I will drop you to a shell. When you are done, simply copy the SHA1 sum and exit."
+echo "The commands you like want are 'git log trunk' and 'git show SHA1'"
+echo
+echo "Press any key to contiue."
+read -n 1
+bash
+echo
+echo "OK you're back :)"
+echo "What was the SHA1?"
+read resetsha1
+if [ -z "$resetsha1" ]; then
+ echo "You did not give any SHA1 sum. I will not reset the git repository and carry on importing"
+ echo "from it's current state. You can quit this script and start again if this is incorrect."
+else
+ echo "I got SHA1 '$resetsha1'. I hope that's correct".
+ echo
+ echo "I will now reset your git trunk and master branches. Is this OK? (press ctrl+c if not)"
+ read -n 1
+ git update-ref -m "Rewind SVN Git to pre-Magiea import" refs/remotes/trunk $resetsha1
+ git checkout master
+ git reset --hard trunk
+fi
+
+
+echo
+echo "I will now run 'svn log' on the software. You should be able to guess the right revision"
+echo "to base the import on. When done, simply copy (or remember) the revision number and enter it"
+echo "into this script."
+echo
+echo "Press any key to contiue."
+read -n 1
+
+svn log $NEWSVNURL/$SOFTWARE | less
+
+echo
+echo "OK you're back :)"
+echo "What was the revision number?"
+read revision
+revision=$(( $revision + 0 ))
+echo "I got revision '$revision'. I hope that's correct".
+echo
+echo "The next step is the dangerous bit. We will clear out all files in the current"
+echo "working copy, run an svn export and then drop you to a shell to investigate the differences"
+echo "In that shell you must git add any new files that appear and ensure you are happy with"
+echo "the generate state of things."
+echo
+echo "Continue? (press ctrl+c if not)"
+read -n 1
+git reset --hard trunk
+resetsha1=$(git rev-list --max-count=1 HEAD)
+# The below is a "safer" verion of rm -rf * that also deletes hidden files
+find . -depth -not -iwholename '.' -not -iwholename "./.git" -not -iwholename "./.git/*" -not -iwholename "./.git/.*" -delete
+svn export --force --ignore-keywords --ignore-externals -r $revision $NEWSVNURL/$SOFTWARE/trunk .
+echo
+echo "Dropping you to a shell. Use 'git status', 'git diff' and 'git add'."
+echo "DO NOT run 'git commit', I'll do that later for you."
+bash
+
+echo
+echo "OK you're back :)"
+echo "If everything is OK, and you're ready to continue, then hit return."
+read -n 1
+
+COMMITTXT=$(mktemp /tmp/commitmsg.XXXXXX)
+cat >$COMMITTXT <<EOF
+Synthesized commit during git-svn import combining previous Mandriva history with Magiea.
+
+This commit consitsts of the following subversion commits:
+
+EOF
+svn log -r 1:$revision $NEWSVNURL/$SOFTWARE >>$COMMITTXT
+
+COMMITDATE=$(svn log -r $revision $NEWSVNURL/$SOFTWARE | head -n2 | tail -n1| cut -d'|' -f3 | cut -d'(' -f1 | trim)
+git commit --author="Mageia SVN-Git Migration <svn-git-migration@mageia.org>" --date="$COMMITDATE" --file=$COMMITTXT -a
+rm -f $COMMITTXT
+
+echo
+echo "OK, looks like we're good to go :)"
+echo "Press any key to continue with the subversion import process".
+read -n 1
+
+git svn gc
+sha1=$(git rev-list --max-count=1 HEAD)
+echo
+echo -n "Updating trunk branch to include synthesised commit $sha1... "
+git update-ref -m "Reset to synthesized commit representing Magiea cleaned import (SVN Git)" refs/remotes/trunk $sha1
+echo "done"
+
+echo -n "Faking git-svn metadata to allow continuation... "
+printf "0000000: %08x%s\t................" $revision $sha1 | xxd -r -c24 >.git/svn/refs/remotes/trunk/.rev_map.$NEWSVNUUID
+echo "done"
+
+# Keep a small log of the sha1's etc.
+if [ ! -f ../svn-import.log ]; then
+ echo "software,startingcommit,startingrevision,fakecommit" >../svn-import.log
+fi
+echo "drakx,$resetsha1,$revision,$sha1" >>../svn-import.log
+
+echo "Continuing svn fetch"
+git svn fetch -A ../authors-transform.txt -r $(( $revision + 1 )):HEAD
+git reset --hard trunk
+echo
+echo "done"
+
+echo
+echo "Now creating bare git repository"
+git init --bare ../$SOFTWARE.git
+git remote rm origin
+git remote add origin ../$SOFTWARE.git
+git push --set-upstream master
+git push origin 'refs/remotes/*:refs/heads/*'
+
+pushd ../$SOFTWARE.git
+git branch -D trunk
+git branch -D origin/master
+git for-each-ref --format='%(refname)' refs/heads/tags | cut -d / -f 4 | \
+ while read ref; do
+ git tag "$ref" "refs/heads/tags/$ref"
+ git branch -D "tags/$ref"
+ done
+
+git gc --aggressive
+popd