#!/bin/sh # Copyright (c) 2006 Eric Wong global test_description := ''git svn metadata migrations from previous versions'' source ./lib-git-svn.sh test_expect_success 'setup old-looking metadata' ' cp "$GIT_DIR"/config "$GIT_DIR"/config-old-git-svn && mkdir import && ( cd import && for i in trunk branches/a branches/b tags/0.1 tags/0.2 tags/0.3 do mkdir -p $i && echo hello >>$i/README || exit 1 done && svn_cmd import -m test . "$svnrepo" ) && git svn init "$svnrepo" && git svn fetch && rm -rf "$GIT_DIR"/svn && git update-ref refs/heads/git-svn-HEAD refs/remotes/git-svn && git update-ref refs/heads/svn-HEAD refs/remotes/git-svn && git update-ref -d refs/remotes/git-svn refs/remotes/git-svn ' test_expect_success 'git-svn-HEAD is a real HEAD' ' git rev-parse --verify refs/heads/git-svn-HEAD^0 ' global svnrepo_escaped := $[echo $svnrepo | sed 's/ /%20/] test_expect_success 'initialize old-style (v0) git svn layout' ' mkdir -p "$GIT_DIR"/git-svn/info "$GIT_DIR"/svn/info && echo "$svnrepo" > "$GIT_DIR"/git-svn/info/url && echo "$svnrepo" > "$GIT_DIR"/svn/info/url && git svn migrate && ! test -d "$GIT_DIR"/git-svn && git rev-parse --verify refs/remotes/git-svn^0 && git rev-parse --verify refs/remotes/svn^0 && test "$(git config --get svn-remote.svn.url)" = "$svnrepo_escaped" && test $(git config --get svn-remote.svn.fetch) = \ ":refs/remotes/git-svn" ' test_expect_success 'initialize a multi-repository repo' ' git svn init "$svnrepo" -T trunk -t tags -b branches && git config --get-all svn-remote.svn.fetch > fetch.out && grep "^trunk:refs/remotes/origin/trunk$" fetch.out && test -n "$(git config --get svn-remote.svn.branches \ "^branches/\*:refs/remotes/origin/\*$")" && test -n "$(git config --get svn-remote.svn.tags \ "^tags/\*:refs/remotes/origin/tags/\*$")" && git config --unset svn-remote.svn.branches \ "^branches/\*:refs/remotes/origin/\*$" && git config --unset svn-remote.svn.tags \ "^tags/\*:refs/remotes/origin/tags/\*$" && git config --add svn-remote.svn.fetch "branches/a:refs/remotes/origin/a" && git config --add svn-remote.svn.fetch "branches/b:refs/remotes/origin/b" && for i in tags/0.1 tags/0.2 tags/0.3 do git config --add svn-remote.svn.fetch \ $i:refs/remotes/origin/$i || return 1 done && git config --get-all svn-remote.svn.fetch > fetch.out && grep "^trunk:refs/remotes/origin/trunk$" fetch.out && grep "^branches/a:refs/remotes/origin/a$" fetch.out && grep "^branches/b:refs/remotes/origin/b$" fetch.out && grep "^tags/0\.1:refs/remotes/origin/tags/0\.1$" fetch.out && grep "^tags/0\.2:refs/remotes/origin/tags/0\.2$" fetch.out && grep "^tags/0\.3:refs/remotes/origin/tags/0\.3$" fetch.out && grep "^:refs/remotes/git-svn" fetch.out ' # refs should all be different, but the trees should all be the same: test_expect_success 'multi-fetch works on partial urls + paths' ' refs="trunk a b tags/0.1 tags/0.2 tags/0.3" && git svn multi-fetch && for i in $refs do git rev-parse --verify refs/remotes/origin/$i^0 || return 1; done >refs.out && test -z "$(sort "$GIT_DIR"/svn/$ref/info/url || return 1 done && git svn migrate --minimize && test -z "$(git config -l | grep "^svn-remote\.git-svn\.")" && git config --get-all svn-remote.svn.fetch > fetch.out && grep "^trunk:refs/remotes/origin/trunk$" fetch.out && grep "^branches/a:refs/remotes/origin/a$" fetch.out && grep "^branches/b:refs/remotes/origin/b$" fetch.out && grep "^tags/0\.1:refs/remotes/origin/tags/0\.1$" fetch.out && grep "^tags/0\.2:refs/remotes/origin/tags/0\.2$" fetch.out && grep "^tags/0\.3:refs/remotes/origin/tags/0\.3$" fetch.out && grep "^:refs/remotes/git-svn" fetch.out ' test_expect_success ".rev_db auto-converted to .rev_map.UUID" ' git svn fetch -i trunk && test -z "$(ls "$GIT_DIR"/svn/refs/remotes/origin/trunk/.rev_db.* 2>/dev/null)" && expect="$(ls "$GIT_DIR"/svn/refs/remotes/origin/trunk/.rev_map.*)" && test -n "$expect" && rev_db="$(echo $expect | sed -e "s,_map,_db,")" && convert_to_rev_db "$expect" "$rev_db" && rm -f "$expect" && test -f "$rev_db" && git svn fetch -i trunk && test -z "$(ls "$GIT_DIR"/svn/refs/remotes/origin/trunk/.rev_db.* 2>/dev/null)" && test ! -e "$GIT_DIR"/svn/refs/remotes/origin/trunk/.rev_db && test -f "$expect" ' test_done (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"git svn metadata migrations from previous versions">)} spids: [6] ) ] spids: [6] ) (C {(.)} {(./lib-git-svn.sh)}) (C {(test_expect_success)} {(SQ <"setup old-looking metadata">)} { (SQ <"\n"> <"\tcp \"$GIT_DIR\"/config \"$GIT_DIR\"/config-old-git-svn &&\n"> <"\tmkdir import &&\n"> <"\t(\n"> <"\t\tcd import &&\n"> <"\t\tfor i in trunk branches/a branches/b tags/0.1 tags/0.2 tags/0.3\n"> <"\t\tdo\n"> <"\t\t\tmkdir -p $i &&\n"> <"\t\t\techo hello >>$i/README ||\n"> <"\t\t\texit 1\n"> <"\t\tdone &&\n"> <"\t\tsvn_cmd import -m test . \"$svnrepo\"\n"> <"\t) &&\n"> <"\tgit svn init \"$svnrepo\" &&\n"> <"\tgit svn fetch &&\n"> <"\trm -rf \"$GIT_DIR\"/svn &&\n"> <"\tgit update-ref refs/heads/git-svn-HEAD refs/remotes/git-svn &&\n"> <"\tgit update-ref refs/heads/svn-HEAD refs/remotes/git-svn &&\n"> <"\tgit update-ref -d refs/remotes/git-svn refs/remotes/git-svn\n"> <"\t"> ) } ) (C {(test_expect_success)} {(SQ <"git-svn-HEAD is a real HEAD">)} {(SQ <"\n"> <"\tgit rev-parse --verify refs/heads/git-svn-HEAD^0\n">)} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:svnrepo_escaped) op: Equal rhs: { (CommandSubPart command_list: (CommandList children: [ (Pipeline children: [ (C {(echo)} {($ VSub_Name "$svnrepo")}) (C {(sed)} {(SQ <"s/ /%20/">)}) ] negated: False ) ] ) left_token: spids: [59 71] ) } spids: [58] ) ] spids: [58] ) (C {(test_expect_success)} {(SQ <"initialize old-style (v0) git svn layout">)} { (SQ <"\n"> <"\tmkdir -p \"$GIT_DIR\"/git-svn/info \"$GIT_DIR\"/svn/info &&\n"> <"\techo \"$svnrepo\" > \"$GIT_DIR\"/git-svn/info/url &&\n"> <"\techo \"$svnrepo\" > \"$GIT_DIR\"/svn/info/url &&\n"> <"\tgit svn migrate &&\n"> <"\t! test -d \"$GIT_DIR\"/git-svn &&\n"> <"\tgit rev-parse --verify refs/remotes/git-svn^0 &&\n"> <"\tgit rev-parse --verify refs/remotes/svn^0 &&\n"> <"\ttest \"$(git config --get svn-remote.svn.url)\" = \"$svnrepo_escaped\" &&\n"> <"\ttest $(git config --get svn-remote.svn.fetch) = \\\n"> <"\t\t\":refs/remotes/git-svn\"\n"> <"\t"> ) } ) (C {(test_expect_success)} {(SQ <"initialize a multi-repository repo">)} { (SQ <"\n"> <"\tgit svn init \"$svnrepo\" -T trunk -t tags -b branches &&\n"> <"\tgit config --get-all svn-remote.svn.fetch > fetch.out &&\n"> <"\tgrep \"^trunk:refs/remotes/origin/trunk$\" fetch.out &&\n"> <"\ttest -n \"$(git config --get svn-remote.svn.branches \\\n"> <"\t\t \"^branches/\\*:refs/remotes/origin/\\*$\")\" &&\n"> <"\ttest -n \"$(git config --get svn-remote.svn.tags \\\n"> <"\t\t \"^tags/\\*:refs/remotes/origin/tags/\\*$\")\" &&\n"> <"\tgit config --unset svn-remote.svn.branches \\\n"> <"\t \"^branches/\\*:refs/remotes/origin/\\*$\" &&\n"> <"\tgit config --unset svn-remote.svn.tags \\\n"> <"\t \"^tags/\\*:refs/remotes/origin/tags/\\*$\" &&\n"> <"\tgit config --add svn-remote.svn.fetch \"branches/a:refs/remotes/origin/a\" &&\n"> <"\tgit config --add svn-remote.svn.fetch \"branches/b:refs/remotes/origin/b\" &&\n"> <"\tfor i in tags/0.1 tags/0.2 tags/0.3\n"> <"\tdo\n"> <"\t\tgit config --add svn-remote.svn.fetch \\\n"> <"\t\t\t$i:refs/remotes/origin/$i || return 1\n"> <"\tdone &&\n"> <"\tgit config --get-all svn-remote.svn.fetch > fetch.out &&\n"> <"\tgrep \"^trunk:refs/remotes/origin/trunk$\" fetch.out &&\n"> <"\tgrep \"^branches/a:refs/remotes/origin/a$\" fetch.out &&\n"> <"\tgrep \"^branches/b:refs/remotes/origin/b$\" fetch.out &&\n"> <"\tgrep \"^tags/0\\.1:refs/remotes/origin/tags/0\\.1$\" fetch.out &&\n"> <"\tgrep \"^tags/0\\.2:refs/remotes/origin/tags/0\\.2$\" fetch.out &&\n"> <"\tgrep \"^tags/0\\.3:refs/remotes/origin/tags/0\\.3$\" fetch.out &&\n"> <"\tgrep \"^:refs/remotes/git-svn\" fetch.out\n"> <"\t"> ) } ) (C {(test_expect_success)} {(SQ <"multi-fetch works on partial urls + paths">)} { (SQ <"\n"> <"\trefs=\"trunk a b tags/0.1 tags/0.2 tags/0.3\" &&\n"> <"\tgit svn multi-fetch &&\n"> <"\tfor i in $refs\n"> <"\tdo\n"> <"\t\tgit rev-parse --verify refs/remotes/origin/$i^0 || return 1;\n"> <"\tdone >refs.out &&\n"> <"\ttest -z \"$(sort <"\tfor i in $refs\n"> <"\tdo\n"> <"\t\tfor j in $refs\n"> <"\t\tdo\n"> <"\t\t\tgit diff --exit-code refs/remotes/origin/$i \\\n"> <"\t\t\t\t\t refs/remotes/origin/$j ||\n"> <"\t\t\t\treturn 1\n"> <"\t\tdone\n"> <"\tdone\n"> ) } ) (C {(test_expect_success)} {(SQ <"migrate --minimize on old inited layout">)} { (SQ <"\n"> <"\tgit config --unset-all svn-remote.svn.fetch &&\n"> <"\tgit config --unset-all svn-remote.svn.url &&\n"> <"\trm -rf \"$GIT_DIR\"/svn &&\n"> <"\tfor i in $(cat fetch.out)\n"> <"\tdo\n"> <"\t\tpath=$(expr $i : \"\\([^:]*\\):.*$\")\n"> <"\t\tref=$(expr $i : \"[^:]*:\\(refs/remotes/.*\\)$\")\n"> <"\t\tif test -z \"$ref\"; then continue; fi\n"> <"\t\tif test -n \"$path\"; then path=\"/$path\"; fi\n"> <"\t\tmkdir -p \"$GIT_DIR\"/svn/$ref/info/ &&\n"> <"\t\techo \"$svnrepo\"$path >\"$GIT_DIR\"/svn/$ref/info/url ||\n"> <"\t\treturn 1\n"> <"\tdone &&\n"> <"\tgit svn migrate --minimize &&\n"> <"\ttest -z \"$(git config -l | grep \"^svn-remote\\.git-svn\\.\")\" &&\n"> <"\tgit config --get-all svn-remote.svn.fetch > fetch.out &&\n"> <"\tgrep \"^trunk:refs/remotes/origin/trunk$\" fetch.out &&\n"> <"\tgrep \"^branches/a:refs/remotes/origin/a$\" fetch.out &&\n"> <"\tgrep \"^branches/b:refs/remotes/origin/b$\" fetch.out &&\n"> <"\tgrep \"^tags/0\\.1:refs/remotes/origin/tags/0\\.1$\" fetch.out &&\n"> <"\tgrep \"^tags/0\\.2:refs/remotes/origin/tags/0\\.2$\" fetch.out &&\n"> <"\tgrep \"^tags/0\\.3:refs/remotes/origin/tags/0\\.3$\" fetch.out &&\n"> <"\tgrep \"^:refs/remotes/git-svn\" fetch.out\n"> <"\t"> ) } ) (C {(test_expect_success)} {(DQ (".rev_db auto-converted to .rev_map.UUID"))} { (SQ <"\n"> <"\tgit svn fetch -i trunk &&\n"> < "\ttest -z \"$(ls \"$GIT_DIR\"/svn/refs/remotes/origin/trunk/.rev_db.* 2>/dev/null)\" &&\n" > <"\texpect=\"$(ls \"$GIT_DIR\"/svn/refs/remotes/origin/trunk/.rev_map.*)\" &&\n"> <"\ttest -n \"$expect\" &&\n"> <"\trev_db=\"$(echo $expect | sed -e \"s,_map,_db,\")\" &&\n"> <"\tconvert_to_rev_db \"$expect\" \"$rev_db\" &&\n"> <"\trm -f \"$expect\" &&\n"> <"\ttest -f \"$rev_db\" &&\n"> <"\tgit svn fetch -i trunk &&\n"> < "\ttest -z \"$(ls \"$GIT_DIR\"/svn/refs/remotes/origin/trunk/.rev_db.* 2>/dev/null)\" &&\n" > <"\ttest ! -e \"$GIT_DIR\"/svn/refs/remotes/origin/trunk/.rev_db &&\n"> <"\ttest -f \"$expect\"\n"> <"\t"> ) } ) (C {(test_done)}) ] )