Browse Source

git-svn: add support for Perl SVN::* libraries

This means we no longer have to deal with having bloated SVN
working copies around and we get a nice performance increase as
well because we don't have to exec the SVN binary and start a
new server connection each time.

Of course we have to manually manage memory with SVN::Pool
whenever we can, and hack around cases where SVN just eats
memory despite pools (I blame Perl, too).  I would like to
keep memory usage as stable as possible during long fetch/commit
processes since I still use computers with only 256-512M RAM.

commit should always be faster with the SVN library code.  The
SVN::Delta interface is leaky (or I'm not using it with pools
correctly), so I'm forking on every commit, but that doesn't
seem to hurt performance too much (at least on normal Unix/Linux
systems where fork() is pretty cheap).

fetch should be faster in most common cases, but probably not all.
fetches will be faster where client/server delta generation is
the bottleneck and not bandwidth.  Of course, full-files are
generated server-side via deltas, too.  Full files are always
transferred when they're updated, just like git-svnimport and
unlike command-line svn.  I'm also hacking around memory leaks
(see comments) here by using some more forks.

I've tested fetch with http://, https://, file://, and svn://
repositories, so we should be reasonably covered in terms of
error handling for fetching.

Of course, we'll keep plain command-line svn compatibility as a
fallback for people running SVN 1.1 (I'm looking into library
support for 1.1.x SVN, too).  If you want to force command-line
SVN usage, set GIT_SVN_NO_LIB=1 in your environment.

We also require two simultaneous connections (just like
git-svnimport), but this shouldn't be a problem for most
servers.

Less important commands:

show-ignore is slower because it requires repository
access, but -r/--revision <num> can be specified.

graft-branches may use more memory, but it's a
short-term process and is funky-filename-safe.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
maint
Eric Wong 19 years ago
parent
commit
a5e0cedc0a
  1. 1068
      contrib/git-svn/git-svn.perl
  2. 2
      contrib/git-svn/t/lib-git-svn.sh
  3. 15
      contrib/git-svn/t/t0000-contrib-git-svn.sh

1068
contrib/git-svn/git-svn.perl

File diff suppressed because it is too large Load Diff

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

@ -11,7 +11,7 @@ fi @@ -11,7 +11,7 @@ fi

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

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

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

@ -31,6 +31,7 @@ test_expect_success \ @@ -31,6 +31,7 @@ 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 -f -b mybranch remotes/git-svn
@ -41,6 +42,7 @@ git commit -m "$name" @@ -41,6 +42,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"


@ -52,7 +54,7 @@ git update-index --remove dir/file @@ -52,7 +54,7 @@ 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

@ -67,7 +69,7 @@ git update-index --remove -- bar/zzz @@ -67,7 +69,7 @@ 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

@ -82,7 +84,7 @@ echo yyy > bar/zzz/yyy @@ -82,7 +84,7 @@ 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

@ -97,7 +99,7 @@ echo asdf > dir @@ -97,7 +99,7 @@ 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

@ -111,6 +113,7 @@ git commit -m "$name" @@ -111,6 +113,7 @@ 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"


@ -121,6 +124,7 @@ git commit -m "$name" @@ -121,6 +124,7 @@ 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"


@ -133,6 +137,7 @@ git commit -m "$name" @@ -133,6 +137,7 @@ 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"


@ -145,6 +150,7 @@ git commit -m "$name" @@ -145,6 +150,7 @@ 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"

@ -159,6 +165,7 @@ git commit -m "$name" @@ -159,6 +165,7 @@ 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"

Loading…
Cancel
Save