Open main menu

GIT Migration/Tools script

< GIT Migration
Revision as of 16:25, 7 January 2011 by Salty-horse (talk | contribs) (Upload scummvm-tools git migration script)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

This shell script has been used to convert the scummvm-tools repository from Subversion to git.

The section that renames authors has been censored. Modify it as needed.

#!/bin/sh

# Script to convert the scummvm-tools repository from subversion to git

# Assumed:
# git svn clone -s https://scummvm.svn.sourceforge.net/svnroot/scummvm/tools/ scummvm-tools-git
# cd scummvm-tools-git

echo =====================
echo copy remote branches
echo =====================

git branch branch-0-10-0                remotes/branch-0-10-0
git branch branch-0-11-0                remotes/branch-0-11-0
git branch branch-0-8-0                 remotes/branch-0-8-0
git branch branch-0-9-0                 remotes/branch-0-9-0
git branch branch-1-1-0                 remotes/branch-1-1-0
git branch branch-1-2-0                 remotes/branch-1-2-0
git branch gsoc2007-decompiler          remotes/gsoc2007-decompiler
git branch gsoc2007-toolsgui            remotes/gsoc2007-toolsgui
git branch gsoc2009-decompiler          remotes/gsoc2009-decompiler
git branch gsoc2009-gui                 remotes/gsoc2009-gui
git branch gsoc2010-decompiler          remotes/gsoc2010-decompiler
git branch tags/branch-0-8-0-base       remotes/tags/branch-0-8-0-base
git branch tags/release-0-10-0          remotes/tags/release-0-10-0
git branch tags/release-0-11-0          remotes/tags/release-0-11-0
git branch tags/release-0-12-0          remotes/tags/release-0-12-0
git branch tags/release-0-13-0          remotes/tags/release-0-13-0
git branch tags/release-0-3-0           remotes/tags/release-0-3-0
git branch tags/release-0-4-0           remotes/tags/release-0-4-0
git branch tags/release-0-4-1           remotes/tags/release-0-4-1
git branch tags/release-0-5-0           remotes/tags/release-0-5-0
git branch tags/release-0-6-0           remotes/tags/release-0-6-0
git branch tags/release-0-6-1           remotes/tags/release-0-6-1
git branch tags/release-0-7-0           remotes/tags/release-0-7-0
git branch tags/release-0-8-0           remotes/tags/release-0-8-0
git branch tags/release-0-9-0           remotes/tags/release-0-9-0
git branch tags/release-1-0-0           remotes/tags/release-1-0-0
git branch tags/release-1-0-0rc1        remotes/tags/release-1-0-0rc1
git branch tags/release-1-0-0rc1@43666  remotes/tags/release-1-0-0rc1@43666
git branch tags/release-1-1-0           remotes/tags/release-1-1-0
git branch tags/release-1-1-1           remotes/tags/release-1-1-1
git branch tags/release-1-2-0           remotes/tags/release-1-2-0
git branch tags/release_030             remotes/tags/release_030

echo =================================================
echo Re-tag in the correct places and remove branches
echo =================================================

git branch -d gsoc2010-decompiler # was merged
git branch -d gsoc2009-gui        # was merged

# function from git-filter-branch.sh to set GIT_* commit env vars
# based on a given commit
set_ident () {
	lid="$(echo "$1" | tr "[A-Z]" "[a-z]")"
	uid="$(echo "$1" | tr "[a-z]" "[A-Z]")"
	pick_id_script='
		/^'$lid' /{
			s/'\''/'\''\\'\'\''/g
			h
			s/^'$lid' \([^<]*\) <[^>]*> .*$/\1/
			s/'\''/'\''\'\'\''/g
			s/.*/GIT_'$uid'_NAME='\''&'\''; export GIT_'$uid'_NAME/p

			g
			s/^'$lid' [^<]* <\([^>]*\)> .*$/\1/
			s/'\''/'\''\'\'\''/g
			s/.*/GIT_'$uid'_EMAIL='\''&'\''; export GIT_'$uid'_EMAIL/p

			g
			s/^'$lid' [^<]* <[^>]*> \(.*\)$/\1/
			s/'\''/'\''\'\'\''/g
			s/.*/GIT_'$uid'_DATE='\''&'\''; export GIT_'$uid'_DATE/p

			q
		}
	'

	LANG=C LC_ALL=C sed -ne "$pick_id_script"
	# Ensure non-empty id name.
	echo "case \"\$GIT_${uid}_NAME\" in \"\") GIT_${uid}_NAME=\"\${GIT_${uid}_EMAIL%%@*}\" && export GIT_${uid}_NAME;; esac"
}

set_commit_env () {
	eval "$(git cat-file commit $1 | set_ident AUTHOR)"
	eval "$(git cat-file commit $1 | set_ident COMMITTER)"
}

set_commit_date () {
	set_commit_env $1
	unset GIT_AUTHOR_NAME
	unset GIT_AUTHOR_EMAIL
	unset GIT_COMMITTER_NAME
	unset GIT_COMMITTER_EMAIL
}

unset_commit_env () {
	unset GIT_AUTHOR_NAME
	unset GIT_AUTHOR_EMAIL
	unset GIT_AUTHOR_DATE
	unset GIT_COMMITTER_NAME
	unset GIT_COMMITTER_EMAIL
	unset GIT_COMMITTER_DATE
}

set_commit_env 0f1c47a
git tag -m "Tag v1.2.0" v1.2.0 5fedf6456b7b8ce2e628c564821e47775dd33590
git branch -D tags/release-1-2-0
git branch -D branch-1-2-0       # empty branch

set_commit_env c18c334
git tag -m "Tag v1.1.1" v1.1.1 c18c3349e461fa51dd884edfbf7310b7c84c090a
git branch -D tags/release-1-1-1

set_commit_env 23181e4
git tag -m "Tag v1.1.0" v1.1.0 23181e4b39906e3cf82413b16eafeed7e44eea0c
git branch -D tags/release-1-1-0

set_commit_env feba424
git tag -m "Tag v1.0.0" v1.0.0 feba424c22aa1acaa07d3c829466ecaeee5b7a60
git branch -D tags/release-1-0-0

set_commit_env 9da1a7a
git tag -m "Tag v1.0.0rc1" v1.0.0rc1 f82a509
git branch -D tags/release-1-0-0rc1
git branch -D tags/release-1-0-0rc1@43666

set_commit_env a5d5876
git tag -m "Tag v0.13.0" v0.13.0 4b64cb8bbbdb9cd1a239418b49bc9291a5ebbbff
git branch -D tags/release-0-13-0
  
set_commit_env 73caf37
git tag -m "Tag v0.12.0" v0.12.0 0e4766ebfc4c2fa04aaa24350a3a75becc871dc2
git branch -D tags/release-0-12-0

set_commit_env a0c2133
git tag -m "Tag v0.11.0" v0.11.0 e44695c2bbebaf199f13e3214a802c946fab44b4
git branch -D tags/release-0-11-0

set_commit_env a10d5d1
git tag -m "Tag v0.10.0" v0.10.0 7b33c6e143bd2d056cb5a1556c60938fc3260cb1
git branch -D tags/release-0-10-0
git branch -D branch-0-10-0 # empty branch

set_commit_env 6f3b71f
git tag -m "Tag v0.9.0" v0.9.0 83ee8b39d48adcd71fcfb69b575dd39e29377d7f
git branch -D tags/release-0-9-0

set_commit_env 0e92a0d
git tag -m "Tag v0.8.0" v0.8.0 0e92a0d760389fdaa08f5bd23c0f5f6b7a14cd80
git branch -D tags/release-0-8-0
git branch -D tags/branch-0-8-0-base

set_commit_env 2ca61c8
git tag -m "Tag v0.7.0" v0.7.0 2ca61c87422b36c2ce1de773502c551451fe172b
git branch -D tags/release-0-7-0

set_commit_env c504a41f39e61c0313675e3332c3e4082a054957
git tag -m "Tag v0.6.1" v0.6.1 c504a41f39e61c0313675e3332c3e4082a054957
git branch -D tags/release-0-6-1

set_commit_env 43c7d16f5ed515c9ea6b51a46a98702bf8bb30ac
git tag -m "Tag v0.6.0" v0.6.0 43c7d16f5ed515c9ea6b51a46a98702bf8bb30ac
git branch -D tags/release-0-6-0

set_commit_env 7e0f1aef93cdc6003e9d3b2f4821e4e2a2a34504
git tag -m "Tag v0.5.0" v0.5.0 7e0f1aef93cdc6003e9d3b2f4821e4e2a2a34504
git branch -D tags/release-0-5-0

set_commit_env 3e62a6e09383bd8ad9890b879910d983c2b55f3a
git tag -m "Tag v0.4.1" v0.4.1 3e62a6e09383bd8ad9890b879910d983c2b55f3a
git branch -D tags/release-0-4-1

set_commit_env 630b8d7411f5cc11cbba387fd11d0551d244a689
git tag -m "Tag v0.4.0" v0.4.0 630b8d7411f5cc11cbba387fd11d0551d244a689
git branch -D tags/release-0-4-0

set_commit_env 47b134b2dd3c1d1e457432d85c356f2cd580ab02
git tag -m "Tag v0.3.0" v0.3.0 47b134b2dd3c1d1e457432d85c356f2cd580ab02
git branch -D tags/release-0-3-0
git branch -D tags/release_030   # tag was renamed

# remove the remote refs
git for-each-ref --format='%(refname)' refs/remotes/ | while read ref; do
    git update-ref -d "$ref"
done

# Remove some unwanted commits

echo ==================================================
echo Remove some bad commits, and edit commit metadata
echo ==================================================

git filter-branch --tag-name-filter cat --commit-filter '
        svn_id=$(git cat-file commit $GIT_COMMIT | fgrep git-svn-id | cut -d@ -f2 | cut -d" " -f 1)
        if [ "$svn_id" = "48503" ]; # This commit is a bad svn tag that adds branch-1-1-0/ to the tree
        then
                skip_commit "$@";
        else
                git commit-tree "$@";
        fi' master..v1.1.0

# remove filter-branch backup
git for-each-ref --format='%(refname)' refs/original/ | while read ref; do
    git update-ref -d "$ref"
done

# rewrite git-svn-id lines
git filter-branch --tag-name-filter cat --msg-filter '
perl -p -e "s/^git-svn-id.*@(\d+) .*$/svn-id: r\1/"' -- --all

# remove filter-branch backup
git for-each-ref --format='%(refname)' refs/original/ | while read ref; do
    git update-ref -d "$ref"
done

# rename authors and remove empty commits.
# Source: http://recursive-design.com/blog/2009/04/29/rename-authors-in-a-git-repository/
git filter-branch --tag-name-filter cat --prune-empty --env-filter '
n=$GIT_AUTHOR_NAME
e=$GIT_AUTHOR_EMAIL

case ${GIT_AUTHOR_NAME} in
	guybrush) n="Guybrush Threepwood" ; e="guybrush@scummvm.org" ;;
	lechuck) n="G.P. LeChuck" ; e="lechuck@scummvm.org" ;;
esac

export GIT_AUTHOR_NAME="$n"
export GIT_AUTHOR_EMAIL="$e"
export GIT_COMMITTER_NAME="$n"
export GIT_COMMITTER_EMAIL="$e"
' -- --all

# remove filter-branch backup
git for-each-ref --format='%(refname)' refs/original/ | while read ref; do
    git update-ref -d "$ref"
done


echo ===================
echo Create new commits
echo ===================

# Create .gitignore based on "git svn show-ignore"
cat << EOF > .gitignore
*.o
.deps

/.gdb_history
/construct_mohawk
/create_sjisfnt
/decine
/decompile
/degob
/dekyra
/deriven
/descumm
/desword2
/extract_mohawk
/gob_loadcalc
/ScummVM Tools.app
/scummvm-tools
/scummvm-tools-cli
/config.mk
/config.h
/config.log

/decompiler/doc/doc.pdf

/decompiler/test/runner
/decompiler/test/runner.cpp
/decompiler/test/*.dSYM
EOF
git add .gitignore
unset_commit_env
git commit -m "Add .gitignore"

# Freeze dead branches.
# Tag using the old timestamp to avoid "gitk --all" getting ugly
for b in \
  branch-0-11-0 \
  branch-0-8-0 \
  branch-0-9-0 \
  branch-1-1-0 \
  gsoc2007-decompiler \
  gsoc2007-toolsgui \
  gsoc2009-decompiler; do
set_commit_date $b
git tag -m "Freeze dead $b branch" dead/$b $b
git branch -D $b
done

echo =====================
echo Remove git-svn cruft
echo =====================
# Source: https://github.com/nothingmuch/git-svn-abandon

# ditch all pre-conversion objects forcefully
git reflog expire --all --expire=now
git gc --aggressive

git prune
git fsck --full