Browse Source

Merge git://git.bogomips.org/git-svn

* git://git.bogomips.org/git-svn: (25 commits)
  git-svn: rebuild convenience and bugfixes
  git-svn: svn (command-line) 1.0.x compatibility
  git-svn: tests no longer fail if LC_ALL is not a UTF-8 locale
  git-svn: bugfix and optimize the 'log' command
  git-svn: Eliminate temp file usage in libsvn_get_file()
  git-svn: fix several small bugs, enable branch optimization
  git-svn: avoid creating some small files
  git-svn: make the $GIT_DIR/svn/*/revs directory obsolete
  git-svn: add support for Perl SVN::* libraries
  git-svn: add 'log' command, a facsimile of basic `svn log'
  git-svn: add UTF-8 message test
  git-svn: add some functionality to better support branches in svn
  git-svn: add --shared and --template= options to pass to init-db
  git-svn: add --repack and --repack-flags= options
  git-svn: minor cleanups, extra error-checking
  git-svn: Move all git-svn-related paths into $GIT_DIR/svn
  git-svn: support manually placed initial trees from fetch
  git-svn: optimize --branch and --branch-all-ref
  git-svn: --branch-all-refs / -B support
  git-svn: support -C<num> passing to git-diff-tree
  ...
maint
Junio C Hamano 19 years ago
parent
commit
5b139a66fc
  1. 13
      contrib/git-svn/Makefile
  2. 2203
      contrib/git-svn/git-svn.perl
  3. 4
      contrib/git-svn/t/lib-git-svn.sh
  4. 143
      contrib/git-svn/t/t0000-contrib-git-svn.sh
  5. 86
      contrib/git-svn/t/t0001-contrib-git-svn-props.sh

13
contrib/git-svn/Makefile

@ -29,8 +29,17 @@ git-svn.html : git-svn.txt @@ -29,8 +29,17 @@ git-svn.html : git-svn.txt
asciidoc -b xhtml11 -d manpage \
-f ../../Documentation/asciidoc.conf $<
test: git-svn
cd t && $(SHELL) ./t0000-contrib-git-svn.sh
cd t && $(SHELL) ./t0001-contrib-git-svn-props.sh
cd t && $(SHELL) ./t0000-contrib-git-svn.sh $(TEST_FLAGS)
cd t && $(SHELL) ./t0001-contrib-git-svn-props.sh $(TEST_FLAGS)

# we can test NO_OPTIMIZE_COMMITS independently of LC_ALL
full-test:
$(MAKE) test GIT_SVN_NO_LIB=1 GIT_SVN_NO_OPTIMIZE_COMMITS=1 LC_ALL=C
$(MAKE) test GIT_SVN_NO_LIB=0 GIT_SVN_NO_OPTIMIZE_COMMITS=1 LC_ALL=C
$(MAKE) test GIT_SVN_NO_LIB=1 GIT_SVN_NO_OPTIMIZE_COMMITS=0 \
LC_ALL=en_US.UTF-8
$(MAKE) test GIT_SVN_NO_LIB=0 GIT_SVN_NO_OPTIMIZE_COMMITS=0 \
LC_ALL=en_US.UTF-8

clean:
rm -f git-svn *.xml *.html *.1

2203
contrib/git-svn/git-svn.perl

File diff suppressed because it is too large Load Diff

4
contrib/git-svn/t/lib-git-svn.sh

@ -10,8 +10,8 @@ fi @@ -10,8 +10,8 @@ fi
. ./test-lib.sh

GIT_DIR=$PWD/.git
GIT_SVN_DIR=$GIT_DIR/git-svn
SVN_TREE=$GIT_SVN_DIR/tree
GIT_SVN_DIR=$GIT_DIR/svn/git-svn
SVN_TREE=$GIT_SVN_DIR/svn-tree

svnadmin >/dev/null 2>&1
if test $? != 1

143
contrib/git-svn/t/t0000-contrib-git-svn.sh

@ -4,13 +4,17 @@ @@ -4,13 +4,17 @@
#

test_description='git-svn tests'
GIT_SVN_LC_ALL=$LC_ALL
. ./lib-git-svn.sh

mkdir import
cd import

echo foo > foo
ln -s foo foo.link
if test -z "$NO_SYMLINK"
then
ln -s foo foo.link
fi
mkdir -p dir/a/b/c/d/e
echo 'deep dir' > dir/a/b/c/d/e/file
mkdir -p bar
@ -30,9 +34,10 @@ test_expect_success \ @@ -30,9 +34,10 @@ test_expect_success \
'import an SVN revision into git' \
'git-svn fetch'

test_expect_success "checkout from svn" "svn co $svnrepo $SVN_TREE"

name='try a deep --rmdir with a commit'
git checkout -b mybranch remotes/git-svn
git checkout -f -b mybranch remotes/git-svn
mv dir/a/b/c/d/e/file dir/file
cp dir/file file
git update-index --add --remove dir/a/b/c/d/e/file dir/file file
@ -40,6 +45,7 @@ git commit -m "$name" @@ -40,6 +45,7 @@ git commit -m "$name"

test_expect_success "$name" \
"git-svn commit --find-copies-harder --rmdir remotes/git-svn..mybranch &&
svn up $SVN_TREE &&
test -d $SVN_TREE/dir && test ! -d $SVN_TREE/dir/a"


@ -51,14 +57,14 @@ git update-index --remove dir/file @@ -51,14 +57,14 @@ git update-index --remove dir/file
git update-index --add dir/file/file
git commit -m "$name"

test_expect_code 1 "$name" \
test_expect_failure "$name" \
'git-svn commit --find-copies-harder --rmdir remotes/git-svn..mybranch' \
|| true


name='detect node change from directory to file #1'
rm -rf dir $GIT_DIR/index
git checkout -b mybranch2 remotes/git-svn
git checkout -f -b mybranch2 remotes/git-svn
mv bar/zzz zzz
rm -rf bar
mv zzz bar
@ -66,14 +72,14 @@ git update-index --remove -- bar/zzz @@ -66,14 +72,14 @@ git update-index --remove -- bar/zzz
git update-index --add -- bar
git commit -m "$name"

test_expect_code 1 "$name" \
test_expect_failure "$name" \
'git-svn commit --find-copies-harder --rmdir remotes/git-svn..mybranch2' \
|| true


name='detect node change from file to directory #2'
rm -f $GIT_DIR/index
git checkout -b mybranch3 remotes/git-svn
git checkout -f -b mybranch3 remotes/git-svn
rm bar/zzz
git-update-index --remove bar/zzz
mkdir bar/zzz
@ -81,14 +87,14 @@ echo yyy > bar/zzz/yyy @@ -81,14 +87,14 @@ echo yyy > bar/zzz/yyy
git-update-index --add bar/zzz/yyy
git commit -m "$name"

test_expect_code 1 "$name" \
test_expect_failure "$name" \
'git-svn commit --find-copies-harder --rmdir remotes/git-svn..mybranch3' \
|| true


name='detect node change from directory to file #2'
rm -f $GIT_DIR/index
git checkout -b mybranch4 remotes/git-svn
git checkout -f -b mybranch4 remotes/git-svn
rm -rf dir
git update-index --remove -- dir/file
touch dir
@ -96,20 +102,21 @@ echo asdf > dir @@ -96,20 +102,21 @@ echo asdf > dir
git update-index --add -- dir
git commit -m "$name"

test_expect_code 1 "$name" \
test_expect_failure "$name" \
'git-svn commit --find-copies-harder --rmdir remotes/git-svn..mybranch4' \
|| true


name='remove executable bit from a file'
rm -f $GIT_DIR/index
git checkout -b mybranch5 remotes/git-svn
git checkout -f -b mybranch5 remotes/git-svn
chmod -x exec.sh
git update-index exec.sh
git commit -m "$name"

test_expect_success "$name" \
"git-svn commit --find-copies-harder --rmdir remotes/git-svn..mybranch5 &&
svn up $SVN_TREE &&
test ! -x $SVN_TREE/exec.sh"


@ -120,49 +127,64 @@ git commit -m "$name" @@ -120,49 +127,64 @@ git commit -m "$name"

test_expect_success "$name" \
"git-svn commit --find-copies-harder --rmdir remotes/git-svn..mybranch5 &&
svn up $SVN_TREE &&
test -x $SVN_TREE/exec.sh"



name='executable file becomes a symlink to bar/zzz (file)'
rm exec.sh
ln -s bar/zzz exec.sh
git update-index exec.sh
git commit -m "$name"

test_expect_success "$name" \
"git-svn commit --find-copies-harder --rmdir remotes/git-svn..mybranch5 &&
test -L $SVN_TREE/exec.sh"



name='new symlink is added to a file that was also just made executable'
chmod +x bar/zzz
ln -s bar/zzz exec-2.sh
git update-index --add bar/zzz exec-2.sh
git commit -m "$name"

test_expect_success "$name" \
"git-svn commit --find-copies-harder --rmdir remotes/git-svn..mybranch5 &&
test -x $SVN_TREE/bar/zzz &&
test -L $SVN_TREE/exec-2.sh"



name='modify a symlink to become a file'
git help > help || true
rm exec-2.sh
cp help exec-2.sh
git update-index exec-2.sh
git commit -m "$name"

test_expect_success "$name" \
"git-svn commit --find-copies-harder --rmdir remotes/git-svn..mybranch5 &&
test -f $SVN_TREE/exec-2.sh &&
test ! -L $SVN_TREE/exec-2.sh &&
diff -u help $SVN_TREE/exec-2.sh"


if test -z "$NO_SYMLINK"
then
name='executable file becomes a symlink to bar/zzz (file)'
rm exec.sh
ln -s bar/zzz exec.sh
git update-index exec.sh
git commit -m "$name"

test_expect_success "$name" \
"git-svn commit --find-copies-harder --rmdir remotes/git-svn..mybranch5 &&
svn up $SVN_TREE &&
test -L $SVN_TREE/exec.sh"

name='new symlink is added to a file that was also just made executable'
chmod +x bar/zzz
ln -s bar/zzz exec-2.sh
git update-index --add bar/zzz exec-2.sh
git commit -m "$name"

test_expect_success "$name" \
"git-svn commit --find-copies-harder --rmdir remotes/git-svn..mybranch5 &&
svn up $SVN_TREE &&
test -x $SVN_TREE/bar/zzz &&
test -L $SVN_TREE/exec-2.sh"

name='modify a symlink to become a file'
git help > help || true
rm exec-2.sh
cp help exec-2.sh
git update-index exec-2.sh
git commit -m "$name"

test_expect_success "$name" \
"git-svn commit --find-copies-harder --rmdir remotes/git-svn..mybranch5 &&
svn up $SVN_TREE &&
test -f $SVN_TREE/exec-2.sh &&
test ! -L $SVN_TREE/exec-2.sh &&
diff -u help $SVN_TREE/exec-2.sh"
fi


if test -n "$GIT_SVN_LC_ALL" && echo $GIT_SVN_LC_ALL | grep -q '\.UTF-8$'
then
name="commit with UTF-8 message: locale: $GIT_SVN_LC_ALL"
echo '# hello' >> exec-2.sh
git update-index exec-2.sh
git commit -m 'éï∏'
export LC_ALL="$GIT_SVN_LC_ALL"
test_expect_success "$name" "git-svn commit HEAD"
unset LC_ALL
else
echo "UTF-8 locale not set, test skipped ($GIT_SVN_LC_ALL)"
fi

name='test fetch functionality (svn => git) with alternate GIT_SVN_ID'
GIT_SVN_ID=alt
@ -173,5 +195,28 @@ test_expect_success "$name" \ @@ -173,5 +195,28 @@ test_expect_success "$name" \
git-rev-list --pretty=raw remotes/alt | grep ^tree | uniq > b &&
diff -u a b"

if test -n "$NO_SYMLINK"
then
test_done
exit 0
fi

name='check imported tree checksums expected tree checksums'
rm -f expected
if test -n "$GIT_SVN_LC_ALL" && echo $GIT_SVN_LC_ALL | grep -q '\.UTF-8$'
then
echo tree f735671b89a7eb30cab1d8597de35bd4271ab813 > expected
fi
cat >> expected <<\EOF
tree 4b9af72bb861eaed053854ec502cf7df72618f0f
tree 031b8d557afc6fea52894eaebb45bec52f1ba6d1
tree 0b094cbff17168f24c302e297f55bfac65eb8bd3
tree d667270a1f7b109f5eb3aaea21ede14b56bfdd6e
tree 56a30b966619b863674f5978696f4a3594f2fca9
tree d667270a1f7b109f5eb3aaea21ede14b56bfdd6e
tree 8f51f74cf0163afc9ad68a4b1537288c4558b5a4
EOF
test_expect_success "$name" "diff -u a expected"

test_done


86
contrib/git-svn/t/t0001-contrib-git-svn-props.sh

@ -52,49 +52,49 @@ EOF @@ -52,49 +52,49 @@ EOF
cd ..

rm -rf import
svn co "$svnrepo" test_wc
test_expect_success 'checkout working copy from svn' "svn co $svnrepo test_wc"
test_expect_success 'setup some commits to svn' \
'cd test_wc &&
echo Greetings >> kw.c &&
svn commit -m "Not yet an Id" &&
svn up &&
echo Hello world >> kw.c &&
svn commit -m "Modified file, but still not yet an Id" &&
svn up &&
svn propset svn:keywords Id kw.c &&
svn commit -m "Propset Id" &&
svn up &&
cd ..'

test_expect_success 'initialize git-svn' "git-svn init $svnrepo"
test_expect_success 'fetch revisions from svn' 'git-svn fetch'

cd test_wc
echo 'Greetings' >> kw.c
svn commit -m 'Not yet an $Id$'
svn up

echo 'Hello world' >> kw.c
svn commit -m 'Modified file, but still not yet an $Id$'
svn up

svn propset svn:keywords Id kw.c
svn commit -m 'Propset $Id$'
svn up
cd ..

git-svn init "$svnrepo"
git-svn fetch

git checkout -b mybranch remotes/git-svn
echo 'Hi again' >> kw.c
name='test svn:keywords ignoring'

git commit -a -m "$name"
git-svn commit remotes/git-svn..mybranch
git pull . remotes/git-svn
test_expect_success "$name" \
'git checkout -b mybranch remotes/git-svn &&
echo Hi again >> kw.c &&
git commit -a -m "test keywoards ignoring" &&
git-svn commit remotes/git-svn..mybranch &&
git pull . remotes/git-svn'

expect='/* $Id$ */'
got="`sed -ne 2p kw.c`"
test_expect_success 'raw $Id$ found in kw.c' "test '$expect' = '$got'"

cd test_wc
svn propset svn:eol-style CR empty
svn propset svn:eol-style CR crlf
svn propset svn:eol-style CR ne_crlf
svn commit -m 'propset CR on crlf files'
svn up
cd ..
test_expect_success "propset CR on crlf files" \
'cd test_wc &&
svn propset svn:eol-style CR empty &&
svn propset svn:eol-style CR crlf &&
svn propset svn:eol-style CR ne_crlf &&
svn commit -m "propset CR on crlf files" &&
svn up &&
cd ..'

git-svn fetch
git pull . remotes/git-svn
test_expect_success 'fetch and pull latest from svn and checkout a new wc' \
"git-svn fetch &&
git pull . remotes/git-svn &&
svn co $svnrepo new_wc"

svn co "$svnrepo" new_wc
for i in crlf ne_crlf lf ne_lf cr ne_cr empty_cr empty_lf empty empty_crlf
do
test_expect_success "Comparing $i" "cmp $i new_wc/$i"
@ -106,16 +106,16 @@ cd test_wc @@ -106,16 +106,16 @@ cd test_wc
printf '$Id$\rHello\rWorld' > ne_cr
a_cr=`printf '$Id$\r\nHello\r\nWorld\r\n' | git-hash-object --stdin`
a_ne_cr=`printf '$Id$\r\nHello\r\nWorld' | git-hash-object --stdin`
svn propset svn:eol-style CRLF cr
svn propset svn:eol-style CRLF ne_cr
svn propset svn:keywords Id cr
svn propset svn:keywords Id ne_cr
svn commit -m 'propset CRLF on cr files'
svn up
test_expect_success 'Set CRLF on cr files' \
'svn propset svn:eol-style CRLF cr &&
svn propset svn:eol-style CRLF ne_cr &&
svn propset svn:keywords Id cr &&
svn propset svn:keywords Id ne_cr &&
svn commit -m "propset CRLF on cr files" &&
svn up'
cd ..

git-svn fetch
git pull . remotes/git-svn
test_expect_success 'fetch and pull latest from svn' \
'git-svn fetch && git pull . remotes/git-svn'

b_cr="`git-hash-object cr`"
b_ne_cr="`git-hash-object ne_cr`"

Loading…
Cancel
Save