From: "James R. McKaskill" <ja...@foobar.co.nz>
Signed-off-by: James R. McKaskill <ja...@foobar.co.nz> --- t/lib-git-svn-fetch.sh | 131 +++++++++++ t/t9050-git-svn-fetch.sh | 85 +++++++ t/t9051-git-svn-fetch-branch.sh | 245 ++++++++++++++++++++ t/t9052-git-svn-push.sh | 140 ++++++++++++ t/t9053-git-svn-push-branch.sh | 478 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1079 insertions(+) create mode 100644 t/lib-git-svn-fetch.sh create mode 100755 t/t9050-git-svn-fetch.sh create mode 100755 t/t9051-git-svn-fetch-branch.sh create mode 100755 t/t9052-git-svn-push.sh create mode 100755 t/t9053-git-svn-push-branch.sh diff --git a/t/lib-git-svn-fetch.sh b/t/lib-git-svn-fetch.sh new file mode 100644 index 0000000..16326a9 --- /dev/null +++ b/t/lib-git-svn-fetch.sh @@ -0,0 +1,131 @@ +#!/bin/sh + +. ./test-lib.sh + +if test -z "$SVNSERVE_PORT" +then + skip_all='skipping svn-(fetch|push) test. (set $SVNSERVE_PORT to enable)' + test_done +fi + +svn --version | grep "version 1.7" &> /dev/null +if [ ! $? -eq 0 ] +then + skip_all='skipping svn-(fetch|push) test. (need svn 1.7 or newer)' + test_done +fi + +svnrepo=$PWD/svnrepo +svnconf=$PWD/svnconf +svnurl="svn://localhost:$SVNSERVE_PORT" +null_sha1=0000000000000000000000000000000000000000 + +# We need this, because we should pass empty configuration directory to +# the 'svn commit' to avoid automated property changes and other stuff +# that could be set from user's configuration files in ~/.subversion. +svn_cmd () { + [ -d "$svnconf" ] || mkdir "$svnconf" + cat > "$svnconf/servers" <<! +[global] +store-plaintext-passwords = yes +! + orig_svncmd="$1"; shift + if [ -z "$orig_svncmd" ]; then + svn + return + fi + echo svn $orig_svncmd $@ + svn "$orig_svncmd" --username committer --password pass --no-auth-cache --non-interactive --config-dir "$svnconf" "$@" +} + +function test_file() { + file_contents="`cat $1`" + test_contents="$2" + test "$file_contents" == "$test_contents" +} + +function svn_date() { + revision="$1" + directory="$2" + svn_cmd log -r "$revision" --xml -l 1 "$directory" | grep "<date>" | sed -re 's#^<date>([^\.Z]*)\.[0-9]+Z</date>#\1Z#g' +} + +function test_git_subject() { + commit="$1" + subject="$2" + commit_subject="`git log -1 --pretty=format:%s $commit`" + echo test_git_subject "$commit_subject" "$subject" + test "$commit_subject" == "$subject" +} + +function test_git_author() { + commit="$1" + author="$2" + commit_author="`git log -1 --pretty=format:'%an <%ae>' $commit`" + echo test_git_author "$commit_author" "$author" + test "$commit_author" == "$author" +} + +function test_git_date() { + commit="$1" + date="$2" + commit_date="`git log -1 --pretty=format:%ai $commit | sed -re 's#^([^ ]*) ([^ ]*) \+0000$#\1T\2Z#g'`" + echo test_git_date "$commit_date" "$date" + test "$commit_date" == "$date" +} + +function test_svn_subject() { + subject="$1" + revision=`test -n "$2" && echo "-r $2"` + commit_subject="`svn log -l 1 --xml $revision | grep '<msg>' | sed -re 's#<msg>(.*)#\1#g' | sed -re 's#(.*)</msg>#\1#g'`" + echo test_svn_subject "$commit_subject" "$subject" + test "$commit_subject" == "$subject" +} + +function test_svn_author() { + author="$1" + revision=`test -n "$2" && echo "-r $2"` + commit_author="`svn log -l 1 --xml $revision | grep '<author>' | sed -re 's#<author>(.*)</author>#\1#g'`" + echo test_svn_author "$commit_author" "$author" + test "$commit_author" == "$author" +} + +show_ref() { + (git show-ref --head $1 | head -n 1 | cut -d ' ' -f 1) || echo $1 +} + +show_tag() { + show_ref refs/tags/$1 | git cat-file --batch | grep object | cut -f 2 -d ' ' +} + +merge_base() { + git merge-base `show_ref $1` `show_ref $2` +} + +test_expect_success 'start svnserve' ' + killall svnserve &> /dev/null + killall lt-svnserve &> /dev/null + rm -rf "$svnrepo" && + mkdir -p "$svnrepo" && + svnadmin create "$svnrepo" && + cat > "$svnrepo/conf/svnserve.conf" <<! +[general] +auth-access = write +password-db = passwd +! + cat > "$svnrepo/conf/passwd" <<! +[users] +committer = pass +! + cat > .git/svn-authors <<! +committer:pass = C O Mitter <commit...@example.com> +! + svnserve --daemon \ + --listen-port $SVNSERVE_PORT \ + --root "$svnrepo" \ + --listen-host localhost && + git config svn.user committer && + git config svn.url $svnurl && + git config svn.remote svn && + svn_cmd co $svnurl svnco +' diff --git a/t/t9050-git-svn-fetch.sh b/t/t9050-git-svn-fetch.sh new file mode 100755 index 0000000..7ac3643 --- /dev/null +++ b/t/t9050-git-svn-fetch.sh @@ -0,0 +1,85 @@ +#!/bin/sh + +test_description='git svn-fetch non trunk' +. ./lib-git-svn-fetch.sh + +test_expect_success 'fetch empty' ' + git svn-fetch -v && + test_must_fail test -x .git/refs/svn/latest && + test_must_fail git checkout svn/master && + test_must_fail git checkout svn/trunk +' + +test_expect_success 'init repo' ' + cd svnco && + svn_cmd mkdir empty-dir && + echo "some contents" > file.txt && + svn_cmd add file.txt && + svn_cmd ci -m "some commit" && + cd .. +' + +date=`svn_date HEAD svnco` + +test_expect_success 'fetch repo' ' + git svn-fetch -v && + test $(GIT_SVN_FETCH_REPORT_LATEST=1 git svn-fetch) -eq 1 && + git checkout svn/master && + test -d empty-dir && + test -e empty-dir/.gitempty && + test_file file.txt "some contents" && + test_git_subject HEAD "some commit" && + test_git_author HEAD "C O Mitter <commit...@example.com>" && + test_git_date HEAD $date +' + +test_expect_success 'auto crlf' ' + cd svnco && + echo "666f6f0d0a6261720d0a" | xxd -r -p > crlf.txt && + svn_cmd add crlf.txt && + svn_cmd ci -m "crlf" && + cd .. && + echo "* text=auto" > .git/info/attributes && + git config svn.eol crlf && + git config core.eol lf && + git svn-fetch -v && + git checkout svn/master && + echo "666f6f0a6261720a" | xxd -r -p > crlf_test.txt && + test "$(cat crlf.txt)" = "$(cat crlf_test.txt)" +' + +test_expect_success 'move file' ' + cd svnco && + seq 1 1000 > somefile && + svn_cmd add somefile && + svn_cmd ci -m "adding some file" && + svn_cmd mv somefile somefile2 && + svn_cmd ci -m "moving file" && + cd .. && + git svn-fetch -v && + git checkout -f svn/master && + cmp somefile2 svnco/somefile2 +' + +test_expect_success 'move folder' ' + cd svnco && + svn_cmd mkdir folder && + cd folder && + seq 1 1000 > file1 && + seq 1000 2000 > file2 && + seq 3000 50000 > file3 && + svn_cmd add file1 file2 file3 && + cd .. && + svn_cmd ci -m "add some folder" && + svn_cmd mv folder folder2 && + svn_cmd ci -m "move folder" && + cd .. && + git svn-fetch -v && + git checkout -f svn/master && + cmp folder2/file1 svnco/folder2/file1 && + cmp folder2/file2 svnco/folder2/file2 && + cmp folder2/file3 svnco/folder2/file3 +' + +test_done + diff --git a/t/t9051-git-svn-fetch-branch.sh b/t/t9051-git-svn-fetch-branch.sh new file mode 100755 index 0000000..277dcd3 --- /dev/null +++ b/t/t9051-git-svn-fetch-branch.sh @@ -0,0 +1,245 @@ +#!/bin/sh + +test_description='git svn-fetch branch' +. ./lib-git-svn-fetch.sh + +test_expect_success 'setup branches' ' + cd svnco && + svn_cmd mkdir Trunk && + svn_cmd mkdir Branches && + svn_cmd mkdir Tags && + touch Trunk/file.txt && + svn_cmd add Trunk/file.txt && + svn_cmd ci -m "init" && + svn_cmd up && + echo "other" >> Trunk/file.txt && + svn_cmd ci -m "trunk file" && + svn_cmd up && + cd .. && + git config svn.trunk Trunk && + git config svn.branches Branches && + git config svn.tags Tags && + git config svn.trunkref trunk && + git svn-fetch -v +' + +test_expect_success 'copied branch' ' + cd svnco && + svn_cmd copy Trunk Branches/Branch && + svn_cmd ci -m "create branch" && + svn_cmd up && + cd .. && + git svn-fetch -v && + test `show_ref svn/trunk` == `show_ref svn/Branch` +' + +test_expect_success 'copied and edited branch' ' + cd svnco && + svn_cmd copy Trunk Branches/CopiedBranch && + echo "more" >> Branches/CopiedBranch/file2.txt && + svn_cmd add Branches/CopiedBranch/file2.txt && + svn_cmd ci -m "create copied branch" && + svn_cmd up && + cd .. && + git svn-fetch -v && + git checkout svn/CopiedBranch && + test_file file.txt "other" && + test_file file2.txt "more" && + test_git_subject HEAD "create copied branch" && + test_git_subject HEAD~1 "trunk file" && + test_git_subject HEAD~2 "init" && + test `git log --pretty=oneline svn/trunk..svn/CopiedBranch | wc -l` -eq 1 && + merge_base svn/trunk svn/CopiedBranch +' + +test_expect_success 'edited and copied branch' ' + cd svnco && + echo "more" >> Trunk/file2.txt && + svn_cmd add Trunk/file2.txt && + svn_cmd copy Trunk Branches/EditCopyBranch && + svn_cmd ci -m "create edit copy branch" && + svn_cmd up && + cd .. && + git svn-fetch -v && + git checkout svn/EditCopyBranch && + test_file file.txt "other" && + test_file file2.txt "more" && + test_git_subject HEAD "create edit copy branch" && + test `show_ref svn/trunk` == `show_ref svn/EditCopyBranch` +' + +# the copy commits shouldn't create git commits + +test_expect_success 'copy, copy, copy' ' + cd svnco && + svn_cmd copy Trunk Branches/FastCopy2 && + svn_cmd copy Branches/FastCopy2 Branches/FastCopy1 && + svn_cmd copy Branches/FastCopy2 Branches/FastCopy3 && + svn_cmd ci -m "fast copy" && + svn_cmd up && + cd .. && + git svn-fetch -v && + test `show_ref svn/FastCopy1` == `show_ref svn/FastCopy2` && + test `show_ref svn/FastCopy1` == `show_ref svn/FastCopy3` && + test `show_ref svn/FastCopy1` == `show_ref svn/trunk` && + test_must_fail test_git_subject svn/FastCopy1 "fast copy" +' + +# 'edit copy delete 1' shouldn't create a git commit + +test_expect_success 'edit, copy, and delete' ' + cd svnco && + svn_cmd copy Trunk Branches/EditCopyDelete && + svn_cmd ci -m "edit copy delete 1" && + svn_cmd up && + echo "edit copy delete" >> Branches/EditCopyDelete/file3.txt && + svn_cmd add Branches/EditCopyDelete/file3.txt && + svn_cmd copy Branches/EditCopyDelete Branches/EditCopyDelete2 && + svn_cmd rm --force Branches/EditCopyDelete && + svn_cmd ci -m "edit copy delete 2" && + svn_cmd up && + cd .. && + git svn-fetch -v && + test_must_fail git checkout svn/EditCopyDelete && + git checkout svn/EditCopyDelete2 && + test_git_subject HEAD "edit copy delete 2" && + test_must_fail test_git_subject HEAD~1 "edit copy delete 1" && + test_file file3.txt "edit copy delete" +' + +test_expect_success 'copy, edit, copy, and delete' ' + cd svnco && + svn_cmd copy Trunk Branches/CopyEditCopyDelete && + echo "copy edit copy delete" >> Branches/CopyEditCopyDelete/file4.txt && + svn_cmd add Branches/CopyEditCopyDelete/file4.txt && + svn_cmd copy Branches/CopyEditCopyDelete Branches/CopyEditCopyDelete2 && + svn_cmd rm --force Branches/CopyEditCopyDelete && + svn_cmd ci -m "copy edit copy delete" && + svn_cmd up && + cd .. && + git svn-fetch -v && + test_must_fail git checkout svn/CopyEditCopyDelete && + git checkout svn/CopyEditCopyDelete2 && + test_git_subject HEAD "copy edit copy delete" && + test_file file4.txt "copy edit copy delete" +' + +test_expect_success 'non copied branch' ' + cd svnco && + svn_cmd mkdir Branches/NonCopiedBranch && + echo "non copied" >> Branches/NonCopiedBranch/file.txt && + svn_cmd add Branches/NonCopiedBranch/file.txt && + svn_cmd ci -m "create non-copied branch" && + svn_cmd up && + cd .. && + git svn-fetch -v && + git checkout svn/NonCopiedBranch && + test_file file.txt "non copied" && + test ! -e file2.txt && + test_git_subject HEAD "create non-copied branch" && + test `git log --pretty=oneline | wc -l` -eq 1 && + test_must_fail merge_base svn/trunk svn/NonCopiedBranch +' + +test_expect_success 'removed branch' ' + cd svnco && + svn_cmd copy Trunk Branches/RemovedBranch && + svn_cmd ci -m "create branch" && + cd .. && + git svn-fetch -v && + test `show_ref svn/RemovedBranch` == `show_ref svn/trunk` && + rev=$(GIT_SVN_FETCH_REPORT_LATEST=1 git svn-fetch) && + cd svnco && + svn_cmd rm Branches/RemovedBranch && + svn_cmd ci -m "remove branch" && + cd .. && + git svn-fetch -v && + test_must_fail git checkout svn/RemovedBranch && + cd svnco && + echo $rev && + svn_cmd copy Branches/RemovedBranch@$rev Branches/RemovedBranch2 && + svn_cmd ci -m "copy branch" && + svn_cmd up && + cd .. && + git svn-fetch -v && + test `show_ref svn/RemovedBranch2` == `show_ref svn/trunk` && + git checkout svn/RemovedBranch2 && + cd svnco && + svn_cmd copy Trunk Branches/RemovedBranch && + echo "foo" > Branches/RemovedBranch/newfile.txt && + svn_cmd add Branches/RemovedBranch/newfile.txt && + svn_cmd ci -m "create branch again" && + svn_cmd up && + svn_cmd rm Branches/RemovedBranch2 && + svn_cmd copy Branches/RemovedBranch@$rev Branches/RemovedBranch2 && + svn_cmd ci -m "copy branch again" && + svn_cmd up && + cd .. && + git svn-fetch -v && + git checkout svn/RemovedBranch && + git checkout svn/RemovedBranch2 && + test `show_ref svn/RemovedBranch` != `show_ref svn/trunk` && + test `show_ref svn/RemovedBranch2` == `show_ref svn/trunk` +' + +test_expect_success 'move branch' ' + cd svnco && + svn_cmd copy Trunk Branches/MovedBranch && + svn_cmd ci -m "create branch" && + cd .. && + git svn-fetch -v && + git checkout svn/MovedBranch && + cd svnco && + svn_cmd mv Branches/MovedBranch Branches/MovedBranch2 && + svn_cmd ci -m "move branch" && + cd .. && + git svn-fetch -v && + test_must_fail git checkout svn/MovedBranch && + git checkout svn/MovedBranch2 && + test `show_ref svn/MovedBranch2` == `show_ref svn/trunk` +' + +test_expect_success 'tag' ' + cd svnco && + svn_cmd copy Trunk Tags/Tag && + svn_cmd ci -m "create tag" && + cd .. && + git svn-fetch -v && + git checkout svn/Tag && + test `show_tag svn/Tag` == `show_ref svn/trunk` && + rev=$(GIT_SVN_FETCH_REPORT_LATEST=1 git svn-fetch) && + cd svnco && + svn_cmd rm Tags/Tag && + svn_cmd ci -m "remove tag" && + cd .. && + git svn-fetch -v && + test_must_fail git checkout svn/Tag && + cd svnco && + svn_cmd copy Tags/Tag@$rev Branches/CopiedTag && + svn_cmd ci -m "copy tag" && + cd .. && + git svn-fetch -v && + git checkout svn/CopiedTag && + test `show_ref svn/trunk` == `show_ref refs/remotes/svn/CopiedTag` && + cd svnco && + svn_cmd copy Branches/CopiedTag Tags/Tag && + svn_cmd ci -m "create tag again" && + cd .. && + git svn-fetch -v && + git checkout svn/Tag && + test `show_tag svn/Tag` == `show_ref svn/trunk` && + cd svnco && + svn_cmd copy Tags/Tag Tags/Tag2 && + svn_cmd ci -m "create 2nd tag" && + svn_cmd rm Tags/Tag && + svn_cmd copy Tags/Tag2 Tags/Tag && + svn_cmd ci -m "recreate tag from 2nd" && + cd .. && + git svn-fetch -v && + test `show_tag svn/Tag` == `show_tag svn/Tag2` && + test `show_tag svn/Tag` == `show_ref svn/trunk` + +' + +test_done + diff --git a/t/t9052-git-svn-push.sh b/t/t9052-git-svn-push.sh new file mode 100755 index 0000000..1a8cf1e --- /dev/null +++ b/t/t9052-git-svn-push.sh @@ -0,0 +1,140 @@ +#!/bin/sh + +test_description='git svn-push' +. ./lib-git-svn-fetch.sh + +test_expect_success 'init push' ' + echo "foo" > file.txt && + git add file.txt && + git commit -a -m "initial commit" && + git svn-push -v refs/remotes/svn/master $null_sha1 master && + cd svnco && + svn_cmd up && + test_svn_subject "initial commit" && + test_svn_author committer && + test_file file.txt "foo" && + cd .. +' + +test_expect_success 'multiple commits' ' + echo "bar" >> file.txt && + git commit -a -m "second commit" && + mkdir a && + echo "fefifofum" >> a/test && + git add a/test && + git commit -a -m "third commit" && + git svn-push -v svn/master svn/master master && + cd svnco && + svn_cmd up -r 2 && + test_svn_subject "second commit" && + test_svn_author committer && + echo foo > file_test.txt && + echo bar >> file_test.txt && + test_file file.txt "$(cat file_test.txt)" && + test ! -e a && + svn_cmd up -r 3 && + test_svn_subject "third commit" && + test_svn_author committer && + test_file a/test "fefifofum" && + cd .. +' + +test_expect_success 'remove git empty directories' ' + mkdir -p b/c/d && + touch b/c/d/foo.txt && + git add b/c/d/foo.txt && + git commit -a -m "add dir" && + git svn-push -v svn/master svn/master master && + cd svnco && + svn_cmd up && + test -e b/c/d/foo.txt && + cd .. && + rm -rf b && + git commit -a -m "rm dir" && + git svn-push -v svn/master svn/master master && + cd svnco && + svn_cmd up && + test ! -e b && + cd .. +' + +test_expect_success 'remove file' ' + touch foo.txt && + git add foo.txt && + git commit -a -m "add file" && + git svn-push -v svn/master svn/master master && + cd svnco && + svn_cmd up && + test -e foo.txt && + cd .. && + rm foo.txt && + git commit -a -m "rm file" && + git svn-push -v svn/master svn/master master + cd svnco && + svn_cmd up && + test ! -e foo.txt && + cd .. +' + +test_expect_success 'remove svn empty directories' ' + cd svnco && + svn_cmd mkdir empty && + svn_cmd commit -m "make empty" && + cd .. && + git svn-fetch -v && + git reset --hard svn/master && + test -e empty/.gitempty && + rm empty/.gitempty && + git commit -a -m "remove empty" && + git svn-push -v svn/master svn/master master && + cd svnco && + test "$(git clean -n -d | grep empty)" = "Would remove empty/" && + cd .. +' + +test_expect_success '.git files' ' + mkdir h && + touch h/.githidden && + git add h/.githidden && + git commit -a -m "add h/.githidden" && + git svn-push -v svn/master svn/master master && + cd svnco && + svn_cmd up && + test -e h && + test ! -e h/.githidden && + cd .. +' + +test_expect_success 'modify file' ' + echo "foo" > file.txt && + git add file.txt && + git commit -a -m "edit1" && + git svn-push -v svn/master svn/master master && + cd svnco && + svn_cmd up && + test_svn_subject "edit1" && + test_file file.txt "foo" && + cd .. && + echo "bar" > file.txt && + git commit -a -m "edit2" && + git svn-push -v svn/master svn/master master && + cd svnco && + svn_cmd up && + test_svn_subject "edit2" && + test_file file.txt "bar" && + cd .. +' + +test_expect_success 'big file' ' + seq 1 100000 > file.txt && + git add file.txt && + git commit -a -m "big file" && + git svn-push -v svn/master svn/master master && + cd svnco && + svn_cmd up && + cmp file.txt ../file.txt && + cd .. +' + +test_done + diff --git a/t/t9053-git-svn-push-branch.sh b/t/t9053-git-svn-push-branch.sh new file mode 100755 index 0000000..501ab3c --- /dev/null +++ b/t/t9053-git-svn-push-branch.sh @@ -0,0 +1,478 @@ +#!/bin/sh + +test_description='git svn-push branch' +. ./lib-git-svn-fetch.sh + +function check_branched() { + copyfrom_path="$1" + copyfrom_rev="$2" + echo check_branched $1 $2 + svn_cmd log --stop-on-copy -v --xml | grep copyfrom-path=\"/$copyfrom_path\" && + svn_cmd log --stop-on-copy -v --xml | grep copyfrom-rev=\"$copyfrom_rev\" +} + +test_expect_success 'setup branches' ' + git config svn.trunk Trunk && + git config svn.branches Branches && + git config svn.tags Tags && + git config svn.trunkref trunk && + cd svnco && + svn_cmd mkdir Branches && + svn_cmd mkdir Tags && + svn_cmd ci -m "svn init" && + cd .. +' + +test_expect_success 'init trunk' ' + echo "foo" > file.txt && + git add file.txt && + git commit -a -m "init trunk" && + git svn-push -v refs/remotes/svn/trunk $null_sha1 master && + test `show_ref svn/trunk` == `show_ref master` && + cd svnco && + svn_cmd up && + test -d Trunk && + test_svn_subject "init trunk" && + test_svn_author committer && + test_file Trunk/file.txt "foo" && + cd .. +' + +test_expect_success 'modify file' ' + cd svnco/Trunk && + echo "bar23" > file.txt && + svn_cmd ci -m "svn edit" && + cd ../.. && + git svn-fetch -v && + git reset --hard svn/trunk && + test_file file.txt "bar23" && + echo "foo" > file.txt && + git commit -a -m "git edit" && + git svn-push -v svn/trunk svn/trunk HEAD && + cd svnco && + svn_cmd up && + cd Trunk && + test_svn_subject "git edit" && + test_svn_subject "svn edit" PREV && + test_file file.txt "foo" && + cd ../.. +' + +test_expect_success 'modify file2' ' + cd svnco/Trunk && + echo "bar" > svn.txt && + svn_cmd add svn.txt && + svn_cmd ci -m "svn edit" && + cd ../.. && + git svn-fetch -v && + git reset --hard svn/trunk && + test_file svn.txt "bar" && + echo "foo" > svn.txt && + git commit -a -m "git edit" && + git svn-push -v svn/trunk svn/trunk HEAD && + cd svnco && + svn_cmd up && + cd Trunk && + test_svn_subject "git edit" && + test_svn_subject "svn edit" PREV && + test_file svn.txt "foo" && + cd ../.. +' + +function svn_head() { + wd=`pwd` && + cd svnco && + cd "$1" && + svn info | grep Revision | sed -e 's/Revision: *//g' && + cd "$wd" +} + +init_trunk_rev=`svn_head Trunk` +init_trunk_path=Trunk + +test_expect_success 'create standalone branch' ' + git symbolic-ref HEAD refs/heads/standalone && + git rm -r --cached . && + echo "bar" > file.txt && + git add file.txt && + rm svn.txt && + git commit -a -m "init standalone" && + git svn-push -v refs/remotes/svn/standalone $null_sha1 standalone && + cd svnco && + svn_cmd up && + cd Branches/standalone && + test_file file.txt "bar" && + test_svn_subject "init standalone" && + test_must_fail svn_cmd log PREV && + cd ../../.. +' + +test_expect_success 'create branch' ' + git checkout -b CreateBranch master && + git svn-push -v refs/remotes/svn/CreateBranch $null_sha1 CreateBranch && + cd svnco && + svn_cmd up && + cd Branches/CreateBranch && + test_file file.txt "foo" && + test_svn_subject "Create Branches/CreateBranch" && + check_branched $init_trunk_path $init_trunk_rev && + cd ../../.. +' + +init_trunk_rev=`svn_head Branches/CreateBranch` +init_trunk_path=Branches/CreateBranch + +test_expect_success 'create and edit branch' ' + git checkout -b CreateEditBranch master && + echo "foo2" > file2.txt && + git add file2.txt && + git commit -a -m "create/edit branch" && + git svn-push -v refs/remotes/svn/CreateEditBranch $null_sha1 CreateEditBranch && + cd svnco && + svn_cmd up && + cd Branches/CreateEditBranch && + test_file file.txt "foo" && + test_file file2.txt "foo2" && + test_svn_subject "create/edit branch" && + check_branched $init_trunk_path $init_trunk_rev && + cd ../../.. +' + +test_expect_success 'create tag' ' + git checkout master && + git tag SimpleTag && + git svn-push -v refs/tags/svn/SimpleTag $null_sha1 HEAD && + cd svnco && + svn_cmd up && + cd Tags/SimpleTag && + test_file file.txt "foo" && + test_svn_subject "Create Tags/SimpleTag" && + check_branched $init_trunk_path $init_trunk_rev && + cd ../../.. +' + +test_expect_success 'create annotated tag' ' + git checkout master && + git tag -m "annotate tag" AnnotatedTag && + git svn-push -v refs/tags/svn/AnnotatedTag $null_sha1 AnnotatedTag && + cd svnco && + svn_cmd up && + cd Tags/AnnotatedTag && + test_file file.txt "foo" && + test_svn_subject "annotate tag" && + check_branched $init_trunk_path $init_trunk_rev && + cd ../../.. +' + +test_expect_success 'replace branch' ' + git checkout -b ReplaceBranch master && + echo "before replace" > file2.txt && + git add file2.txt && + git commit -a -m "before replace" && + before_sha1=`show_ref HEAD` && + git svn-push -v refs/remotes/svn/ReplaceBranch $null_sha1 ReplaceBranch && + cd svnco && + svn_cmd up && + cd Branches/ReplaceBranch && + test_file file2.txt "before replace" && + test_svn_subject "before replace" && + check_branched $init_trunk_path $init_trunk_rev && + cd ../../.. && + git checkout master && + git branch -D ReplaceBranch && + git checkout -b ReplaceBranch master && + echo "after replace" > file3.txt && + git add file3.txt && + git commit -a -m "after replace" && + git svn-push -v svn/ReplaceBranch $before_sha1 ReplaceBranch && + cd svnco/Branches/ReplaceBranch && + svn_cmd up && + test ! -e file2.txt && + test_file file3.txt "after replace" && + test_svn_subject "after replace" && + check_branched $init_trunk_path $init_trunk_rev && + cd ../../.. +' + +test_expect_success 'replace tag' ' + git checkout -b temp master && + echo "foo" > file3.txt && + git add file3.txt && + git commit -a -m "before replace tag" && + old_sha1=`show_ref HEAD` && + git tag ReplaceTag && + git svn-push -v refs/tags/svn/ReplaceTag $null_sha1 ReplaceTag && + cd svnco && + svn_cmd up && + cd Tags/ReplaceTag && + test_svn_subject "before replace tag" && + check_branched $init_trunk_path $init_trunk_rev && + cd ../../.. && + git reset --hard master && + echo "bar" > file2.txt && + git add file2.txt && + git commit -a -m "after replace tag" && + git tag -f ReplaceTag && + git svn-push -v svn/ReplaceTag $old_sha1 ReplaceTag && + cd svnco && + svn_cmd up && + cd Tags/ReplaceTag && + test_svn_subject "after replace tag" && + check_branched $init_trunk_path $init_trunk_rev && + cd ../../.. && + echo "bar2" > file2.txt && + git add file2.txt && + git commit -a -m "dummy commit" && + git tag -f -m "create replace tag" ReplaceTag && + git svn-push -v svn/ReplaceTag HEAD~ ReplaceTag && + cd svnco && + svn_cmd up && + cd Tags/ReplaceTag && + test_svn_subject "create replace tag" && + test_svn_subject "after replace tag" PREV && + cd ../../.. && + git checkout master && + git branch -D temp +' + +test_expect_success 'delete branch' ' + git checkout -b DeleteBranch master && + git svn-push -v refs/remotes/svn/DeleteBranch $null_sha1 DeleteBranch && + cd svnco && + svn_cmd up && + cd Branches/DeleteBranch && + test_svn_subject "Create Branches/DeleteBranch" && + cd ../../.. && + git checkout master && + git svn-push -v svn/DeleteBranch DeleteBranch $null_sha1 && + git branch -D DeleteBranch && + cd svnco && + svn_cmd up && + test ! -e Branches/DeleteBranch && + cd .. +' + +test_expect_success 'delete tag' ' + git checkout master && + git tag DeleteTag && + git svn-push -v refs/tags/svn/DeleteTag $null_sha1 DeleteTag && + cd svnco && + svn_cmd up && + cd Tags/DeleteTag && + test_svn_subject "Create Tags/DeleteTag" && + cd ../../.. && + git svn-push -v svn/DeleteTag DeleteTag $null_sha1 && + git tag -d DeleteTag && + cd svnco && + svn_cmd up && + test ! -e Tags/DeleteTag && + cd .. +' + +test_expect_success 'modify and create branch' ' + git checkout -b MCBranch1 master && + git svn-push -v refs/remotes/svn/MCBranch1 $null_sha1 MCBranch1 && + cd svnco && + svn_cmd up && + cd .. && + init_trunk_rev=`svn_head Branches/MCBranch1` + init_trunk_path=Branches/MCBranch1 && + echo "bar" > file2.txt && + git add file2.txt && + git commit -a -m "some modification on MCBranch1" && + echo "$null_sha1 `show_ref HEAD` refs/remotes/svn/MCBranch2" >> cmds.txt && + echo "`show_ref master` `show_ref HEAD` refs/remotes/svn/MCBranch1" >> cmds.txt && + git svn-push -v --stdin < cmds.txt && + rm -f cmds.txt && + before_rev=`svn_head Branches/MCBranch1` && + cd svnco && + svn_cmd up && + cd Branches/MCBranch1 && + test_svn_subject "some modification on MCBranch1" && + cd ../MCBranch2 && + test_svn_subject "Create Branches/MCBranch2" && + check_branched Branches/MCBranch1 $(($before_rev+1)) && + cd ../../.. +' +test_expect_success 'modify and replace branch' ' + git checkout -b MRBranch1 master && + echo "change" > file2.txt && + git add file2.txt && + git commit -a -m "some modification on MRBranch1" && + git svn-push -v refs/remotes/svn/MRBranch1 $null_sha1 MRBranch1 && + git svn-push -v refs/remotes/svn/MRBranch2 $null_sha1 master && + cd svnco && + svn_cmd up && + cd Branches/MRBranch1 && + test_svn_subject "some modification on MRBranch1" && + cd ../MRBranch2 && + test_svn_subject "Create Branches/MRBranch2" && + cd ../../.. && + before_rev=`svn_head Branches/MRBranch2` && + git checkout -b MRBranch2 master && + echo "bar" > file2.txt && + git add file2.txt && + git commit -a -m "some modification on MRBranch2" && + echo "`show_ref MRBranch1` `show_ref MRBranch2` svn/MRBranch1" > cmds.txt && + echo "`show_ref master` `show_ref MRBranch2` svn/MRBranch2" >> cmds.txt && + git svn-push -v --stdin < cmds.txt && + rm -f cmds.txt && + cd svnco && + svn_cmd up && + cd Branches/MRBranch1 && + test_svn_subject "Create Branches/MRBranch1" && + check_branched Branches/MRBranch2 $(($before_rev+1)) && + cd ../MRBranch2 && + test_svn_subject "some modification on MRBranch2" && + test_svn_subject "Create Branches/MRBranch2" PREV && + check_branched $init_trunk_path $init_trunk_rev && + cd ../../.. +' + +test_expect_success 'tag deleted branch' ' + git checkout -b DeleteBranch master && + echo "foo" > file2.txt && + git add file2.txt && + git commit -a -m "commit on deleted branch" && + git svn-push -v refs/remotes/svn/DeleteBranch $null_sha1 HEAD && + git tag TagOnDeleteBranch && + git checkout master && + git svn-push -v svn/DeleteBranch DeleteBranch $null_sha1 && + git svn-push -v refs/tags/svn/TagOnDeleteBranch $null_sha1 TagOnDeleteBranch && + cd svnco && + svn_cmd up && + test ! -e Branches/DeleteBranch && + cd Tags/TagOnDeleteBranch && + test_svn_subject "Create Tags/TagOnDeleteBranch" && + test_must_fail svn_cmd log -r PREV --stop-on-copy && + cd ../../.. && + git branch -D DeleteBranch +' + +test_expect_success 'push left merge' ' + git checkout -b LeftLeft master && + echo "left" > left.txt && + git add left.txt && + git commit -m "left" && + git svn-push -v refs/remotes/svn/LeftMerged $null_sha1 HEAD && + cd svnco && + svn_cmd up && + cd Branches/LeftMerged && + prev_path=`svn_cmd log --stop-on-copy -v --xml | grep copyfrom-path | sed -re "s#.*copyfrom-path=\"([^\"]*)\".*#copyfrom-path=\"\1\"#g"` && + prev_rev=`svn_cmd log --stop-on-copy -v --xml | grep copyfrom-rev | sed -re "s#.*copyfrom-rev=\"([^\"]*)\".*#copyfrom-rev=\"\1\"#g"` && + echo prev_path $prev_path && + echo prev_rev $prev_rev && + cd ../../.. && + git checkout -b LeftRight master && + echo "right" > right.txt && + git add right.txt && + git commit -m "right" && + git checkout LeftLeft && + git merge --no-ff "merge commit" HEAD LeftRight && + git svn-push -v svn/LeftMerged svn/LeftMerged LeftLeft && + cd svnco && + svn_cmd up && + cd Branches/LeftMerged && + test_file left.txt "left" && + test_file right.txt "right" && + test_svn_subject "merge commit" && + test_svn_subject "left" PREV && + svn_cmd log --stop-on-copy -v --xml | grep $prev_path && + svn_cmd log --stop-on-copy -v --xml | grep $prev_rev && + cd ../../.. +' + +test_expect_success 'push right merge' ' + git checkout -b RightLeft master && + echo "left" > left.txt && + git add left.txt && + git commit -m "left" && + git svn-push -v refs/remotes/svn/RightMerged $null_sha1 HEAD && + cd svnco && + svn_cmd up && + cd Branches/RightMerged && + prev_path=`svn_cmd log --stop-on-copy -v --xml | grep copyfrom-path | sed -re "s#.*copyfrom-path=\"([^\"]*)\".*#copyfrom-path=\"\1\"#g"` && + prev_rev=`svn_cmd log --stop-on-copy -v --xml | grep copyfrom-rev | sed -re "s#.*copyfrom-rev=\"([^\"]*)\".*#copyfrom-rev=\"\1\"#g"` && + echo prev_path $prev_path && + echo prev_rev $prev_rev && + cd ../../.. && + git checkout -b RightRight master && + echo "right" > right.txt && + git add right.txt && + git commit -m "right" && + git merge --no-ff "merge commit" HEAD RightLeft && + git svn-push -v svn/RightMerged svn/RightMerged RightRight && + cd svnco && + svn_cmd up && + cd Branches/RightMerged && + test_svn_subject "merge commit" && + test_svn_subject "left" PREV && + svn_cmd log --stop-on-copy -v --xml | grep $prev_path && + svn_cmd log --stop-on-copy -v --xml | grep $prev_rev && + cd ../../.. +' + +test_expect_success 'unseen new commit in svn' ' + cd svnco && + svn_cmd cp Trunk Branches/Unseen && + svn_cmd ci -m "make branch" && + cd .. && + git svn-fetch -v && + cd svnco/Branches/Unseen && + echo "foo" > unseen.txt && + svn_cmd add unseen.txt && + svn_cmd ci -m "unseen file" && + cd ../../.. && + git checkout -b unseen svn/Unseen && + echo "bar" > seen.txt && + git add seen.txt && + git commit -m "seen file" && + # This should push the commit and then fail, so after the fetch + # and rebase no push should be required + test_must_fail git svn-push -v svn/Unseen unseen~1 unseen && + git svn-fetch -v && + git rebase svn/Unseen && + test `show_ref svn/Unseen` == `show_ref unseen` && + cd svnco/Branches/Unseen && + svn_cmd up && + test_file unseen.txt "foo" && + test_file seen.txt "bar" && + cd ../../.. +' + +test_expect_success 'intermingled commits' ' + git checkout -b intermingled svn/trunk && + echo "bar" > file1.txt && + git add file1.txt && + git commit -m "commit 1" && + echo "foo" > file2.txt && + git add file2.txt && + git commit -m "commit 2" && + port=$(($SVNSERVE_PORT+1)) || exit 1 + GIT_SVN_PUSH_PAUSE=$port git svn-push -v refs/remotes/svn/intermingled $null_sha1 HEAD & + push_pid=$! && + until nc -z localhost $port; do sleep 1; done && + cd svnco && + svn_cmd up && + cd Branches/intermingled && + echo "foobar" > file3.txt && + svn_cmd add file3.txt && + svn_cmd ci -m "svn commit" && + cd ../../.. && + nc -z localhost $port && + test_must_fail wait $push_pid && + git svn-fetch -v && + git rebase svn/intermingled && + git svn-push -v svn/intermingled svn/intermingled HEAD && + cd svnco && + svn_cmd up && + cd .. && + rev=`svn_head Branches/intermingled` && + cd svnco/Branches/intermingled && + test_svn_subject "commit 2" $rev && + test_svn_subject "svn commit" $(($rev-1)) && + test_svn_subject "commit 1" $(($rev-2)) && + cd ../../.. +' + +test_done -- 1.7.11.3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html