mirror of
https://github.com/git/git
synced 2024-08-28 20:20:07 +00:00
![Michael G. Schwern](/assets/img/avatar_default.png)
Previously, our URL canonicalization didn't do much of anything. Now it actually escapes and collapses slashes. This is mostly a cut & paste of escape_url from git-svn. This is closer to how SVN 1.7's canonicalization behaves. Doing it with 1.6 lets us chase down some problems caused by more effective canonicalization without having to deal with all the other 1.7 issues on top of that. * Remote URLs have to be canonicalized otherwise Git::SVN->find_existing_remote will think they're different. * The SVN remote is now written to the git config canonicalized. That should be ok. Adjust a test to account for that. [ew: commit title] Signed-off-by: Eric Wong <normalperson@yhbt.net>
126 lines
4.8 KiB
Bash
Executable file
126 lines
4.8 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/trunk$" fetch.out &&
|
|
test -n "`git config --get svn-remote.svn.branches \
|
|
"^branches/\*:refs/remotes/\*$"`" &&
|
|
test -n "`git config --get svn-remote.svn.tags \
|
|
"^tags/\*:refs/remotes/tags/\*$"`" &&
|
|
git config --unset svn-remote.svn.branches \
|
|
"^branches/\*:refs/remotes/\*$" &&
|
|
git config --unset svn-remote.svn.tags \
|
|
"^tags/\*:refs/remotes/tags/\*$" &&
|
|
git config --add svn-remote.svn.fetch "branches/a:refs/remotes/a" &&
|
|
git config --add svn-remote.svn.fetch "branches/b:refs/remotes/b" &&
|
|
for i in tags/0.1 tags/0.2 tags/0.3; do
|
|
git config --add svn-remote.svn.fetch \
|
|
$i:refs/remotes/$i || exit 1; done &&
|
|
git config --get-all svn-remote.svn.fetch > fetch.out &&
|
|
grep "^trunk:refs/remotes/trunk$" fetch.out &&
|
|
grep "^branches/a:refs/remotes/a$" fetch.out &&
|
|
grep "^branches/b:refs/remotes/b$" fetch.out &&
|
|
grep "^tags/0\.1:refs/remotes/tags/0\.1$" fetch.out &&
|
|
grep "^tags/0\.2:refs/remotes/tags/0\.2$" fetch.out &&
|
|
grep "^tags/0\.3:refs/remotes/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' "
|
|
git svn multi-fetch &&
|
|
for i in trunk a b tags/0.1 tags/0.2 tags/0.3; do
|
|
git rev-parse --verify refs/remotes/\$i^0 >> refs.out || exit 1;
|
|
done &&
|
|
test -z \"\`sort < refs.out | uniq -d\`\" &&
|
|
for i in trunk a b tags/0.1 tags/0.2 tags/0.3; do
|
|
for j in trunk a b tags/0.1 tags/0.2 tags/0.3; do
|
|
if test \$j != \$i; then continue; fi
|
|
test -z \"\`git diff refs/remotes/\$i \
|
|
refs/remotes/\$j\`\" ||exit 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 ) || exit 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/trunk$" fetch.out &&
|
|
grep "^branches/a:refs/remotes/a$" fetch.out &&
|
|
grep "^branches/b:refs/remotes/b$" fetch.out &&
|
|
grep "^tags/0\.1:refs/remotes/tags/0\.1$" fetch.out &&
|
|
grep "^tags/0\.2:refs/remotes/tags/0\.2$" fetch.out &&
|
|
grep "^tags/0\.3:refs/remotes/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/trunk/.rev_db.* 2>/dev/null)" &&
|
|
expect="$(ls "$GIT_DIR"/svn/refs/remotes/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/trunk/.rev_db.* 2>/dev/null)" &&
|
|
test ! -e "$GIT_DIR"/svn/refs/remotes/trunk/.rev_db &&
|
|
test -f "$expect"
|
|
'
|
|
|
|
test_done
|