mirror of
https://github.com/git/git
synced 2024-09-12 21:04:12 +00:00
f831acc6c6
When a test runs a loop, it cannot rely on the usual &&-chaining to propagate a failure inside the loop; it needs to break out with a failure signal. However, unless you are in a subshell, doing so with "exit 1" will exit the entire test script, not just the test snippet we are in (and cause the harness to complain that test_done was never reached). So the fundamental point of this patch is s/exit/return/. But while we're there, let's fix a number of style and readability issues: - snippets in double-quotes need an extra layer of quoting for their meta-characters; let's avoid that by using single quotes - accumulating loop output by appending to a file in each iteration is brittle, as it can be affected by content left in the file by earlier tests. Instead, it's better to redirect stdout for the whole loop, so we know the output only comes from that loop. - using "test -z" to check that diff output is empty is overly verbose; we can just ask diff to use --exit-code. - we can factor out long lists of refs to make it more obvious we're using the same ones in each loop - subshells are unnecessary when ending an &&-chain with "|| return 1" - minor style fixups like space-after-redirection, and "do" and "done" on their own lines Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
136 lines
4.9 KiB
Bash
Executable file
136 lines
4.9 KiB
Bash
Executable file
#!/bin/sh
|
|
# Copyright (c) 2006 Eric Wong
|
|
test_description='git svn metadata migrations from previous versions'
|
|
. ./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
|
|
'
|
|
|
|
head=$(git rev-parse --verify refs/heads/git-svn-HEAD^0)
|
|
test_expect_success 'git-svn-HEAD is a real HEAD' "test -n '$head'"
|
|
|
|
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 <refs.out | uniq -d)" &&
|
|
for i in $refs
|
|
do
|
|
for j in $refs
|
|
do
|
|
git diff --exit-code refs/remotes/origin/$i \
|
|
refs/remotes/origin/$j ||
|
|
return 1
|
|
done
|
|
done
|
|
'
|
|
|
|
test_expect_success 'migrate --minimize on old inited layout' '
|
|
git config --unset-all svn-remote.svn.fetch &&
|
|
git config --unset-all svn-remote.svn.url &&
|
|
rm -rf "$GIT_DIR"/svn &&
|
|
for i in $(cat fetch.out)
|
|
do
|
|
path=$(expr $i : "\([^:]*\):.*$")
|
|
ref=$(expr $i : "[^:]*:\(refs/remotes/.*\)$")
|
|
if test -z "$ref"; then continue; fi
|
|
if test -n "$path"; then path="/$path"; fi
|
|
mkdir -p "$GIT_DIR"/svn/$ref/info/ &&
|
|
echo "$svnrepo"$path >"$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
|