#!/bin/sh # # this script sets up a Subversion repository for Makefile in the # first ever git merge, as if it were done with svnmerge (SVN 1.5+) # rm -rf foo.svn foo set -e mkdir foo.svn svnadmin create foo.svn svn co file://`pwd`/foo.svn foo commit() { i=$(( $1 + 1 )) shift; svn commit -m "(r$i) $*" >/dev/null || exit 1 echo $i } say() { echo "[1m * $*[0m" } i=0 cd foo mkdir trunk mkdir branches mkdir tags svn add trunk branches tags i=$(commit $i "Setup trunk, branches, and tags") git cat-file blob 6683463e:Makefile > trunk/Makefile svn add trunk/Makefile say "Committing ANCESTOR" i=$(commit $i "ancestor") svn cp trunk branches/left say "Committing BRANCH POINT" i=$(commit $i "make left branch") svn cp trunk branches/right say "Committing other BRANCH POINT" i=$(commit $i "make right branch") say "Committing LEFT UPDATE" git cat-file blob 5873b67e:Makefile > branches/left/Makefile i=$(commit $i "left update 1") git cat-file blob 75118b13:Makefile > branches/right/Makefile say "Committing RIGHT UPDATE" pre_right_update_1=$i i=$(commit $i "right update 1") say "Making more commits on LEFT" git cat-file blob ff5ebe39:Makefile > branches/left/Makefile i=$(commit $i "left update 2") git cat-file blob b5039db6:Makefile > branches/left/Makefile i=$(commit $i "left update 3") say "Making a LEFT SUB-BRANCH" svn cp branches/left branches/left-sub sub_left_make=$i i=$(commit $i "make left sub-branch") say "Making a commit on LEFT SUB-BRANCH" echo "crunch" > branches/left-sub/README svn add branches/left-sub/README i=$(commit $i "left sub-branch update 1") say "Merging LEFT to TRUNK" svn update cd trunk svn merge ../branches/left --accept postpone git cat-file blob b5039db6:Makefile > Makefile svn resolved Makefile i=$(commit $i "Merge left to trunk 1") cd .. say "Making more commits on LEFT and RIGHT" echo "touche" > branches/left/zlonk svn add branches/left/zlonk i=$(commit $i "left update 4") echo "thwacke" > branches/right/bang svn add branches/right/bang i=$(commit $i "right update 2") say "Squash merge of RIGHT tip 2 commits onto TRUNK" svn update cd trunk svn merge -r$pre_right_update_1:$i ../branches/right i=$(commit $i "Cherry-pick right 2 commits to trunk") cd .. say "Merging RIGHT to TRUNK" svn update cd trunk svn merge ../branches/right --accept postpone git cat-file blob b51ad431:Makefile > Makefile svn resolved Makefile i=$(commit $i "Merge right to trunk 1") cd .. say "Making more commits on RIGHT and TRUNK" echo "whamm" > branches/right/urkkk svn add branches/right/urkkk i=$(commit $i "right update 3") echo "pow" > trunk/vronk svn add trunk/vronk i=$(commit $i "trunk update 1") say "Merging RIGHT to LEFT SUB-BRANCH" svn update cd branches/left-sub svn merge ../right --accept postpone git cat-file blob b51ad431:Makefile > Makefile svn resolved Makefile i=$(commit $i "Merge right to left sub-branch") cd ../.. say "Making more commits on LEFT SUB-BRANCH and LEFT" echo "zowie" > branches/left-sub/wham_eth svn add branches/left-sub/wham_eth pre_sub_left_update_2=$i i=$(commit $i "left sub-branch update 2") sub_left_update_2=$i echo "eee_yow" > branches/left/glurpp svn add branches/left/glurpp i=$(commit $i "left update 5") say "Cherry pick LEFT SUB-BRANCH commit to LEFT" svn update cd branches/left svn merge -r$pre_sub_left_update_2:$sub_left_update_2 ../left-sub i=$(commit $i "Cherry-pick left sub-branch commit to left") cd ../.. say "Merging LEFT SUB-BRANCH back to LEFT" svn update cd branches/left # it's only a merge because the previous merge cherry-picked the top commit svn merge -r$sub_left_make:$sub_left_update_2 ../left-sub --accept postpone i=$(commit $i "Merge left sub-branch to left") cd ../.. say "Merging EVERYTHING to TRUNK" svn update cd trunk svn merge ../branches/left --accept postpone svn resolved bang i=$(commit $i "Merge left to trunk 2") # this merge, svn happily updates the mergeinfo, but there is actually # nothing to merge. git-svn will not make a meaningless merge commit. svn merge ../branches/right --accept postpone i=$(commit $i "non-merge right to trunk 2") cd .. say "Branching b1 from trunk" svn update svn cp trunk branches/b1 i=$(commit $i "make b1 branch from trunk") say "Branching b2 from trunk" svn update svn cp trunk branches/b2 i=$(commit $i "make b2 branch from trunk") say "Make a commit to b2" svn update cd branches/b2 echo "b2" > b2file svn add b2file i=$(commit $i "b2 update 1") cd ../.. say "Make a commit to b1" svn update cd branches/b1 echo "b1" > b1file svn add b1file i=$(commit $i "b1 update 1") cd ../.. say "Merge b1 to trunk" svn update cd trunk svn merge ../branches/b1/ --accept postpone i=$(commit $i "Merge b1 to trunk") cd .. say "Make a commit to trunk before merging trunk to b2" svn update cd trunk echo "trunk" > trunkfile svn add trunkfile i=$(commit $i "trunk commit before merging trunk to b2") cd .. say "Merge trunk to b2" svn update cd branches/b2 svn merge ../../trunk/ --accept postpone i=$(commit $i "Merge trunk to b2") cd ../.. say "Merge b2 to trunk" svn update cd trunk svn merge ../branches/b2/ --accept postpone svn resolved b1file svn resolved trunkfile i=$(commit $i "Merge b2 to trunk") cd .. say "Creating f1 from trunk with a new file" svn update svn cp trunk branches/f1 cd branches/f1 echo "f1" > f1file svn add f1file cd ../.. i=$(commit $i "make f1 branch from trunk with a new file") say "Creating f2 from trunk with a new file" svn update svn cp trunk branches/f2 cd branches/f2 echo "f2" > f2file svn add f2file cd ../.. i=$(commit $i "make f2 branch from trunk with a new file") say "Merge f1 and f2 to trunk in one go" svn update cd trunk svn merge ../branches/f1/ --accept postpone svn merge ../branches/f2/ --accept postpone i=$(commit $i "Merge f1 and f2 to trunk") cd .. say "Adding subdirectory to LEFT" svn update cd branches/left mkdir subdir echo "Yeehaw" > subdir/cowboy svn add subdir i=$(commit $i "add subdirectory to left branch") cd ../../ say "Merging LEFT to TRUNK" svn update cd trunk svn merge ../branches/left --accept postpone i=$(commit $i "merge left to trunk") cd .. say "Make PARTIAL branch" svn update svn cp trunk/subdir branches/partial i=$(commit $i "make partial branch") say "Make a commit to PARTIAL" svn update cd branches/partial echo "racecar" > palindromes svn add palindromes i=$(commit $i "partial update") cd ../../ say "Merge PARTIAL to TRUNK" svn update cd trunk/subdir svn merge ../../branches/partial --accept postpone i=$(commit $i "merge partial to trunk") cd ../../ say "Tagging trunk" svn update svn cp trunk tags/v1.0 i=$(commit $i "tagging v1.0") say "Branching BUGFIX from v1.0" svn update svn cp tags/v1.0 branches/bugfix i=$(commit $i "make bugfix branch from tag") say "Make a commit to BUGFIX" svn update cd branches/bugfix/ echo "kayak" >> subdir/palindromes i=$(commit $i "commit to bugfix") cd ../../ say "Merge BUGFIX to TRUNK" svn update cd trunk svn merge ../branches/bugfix/ --accept postpone i=$(commit $i "Merge BUGFIX to TRUNK") cd .. cd .. svnadmin dump foo.svn > svn-mergeinfo.dump rm -rf foo foo.svn