Skip to content

Commit

Permalink
SVN import: Use one log call
Browse files Browse the repository at this point in the history
One "svn log" (or its equivalent) per revision adds delay and server load.
Instead, open two SVN connections -- one for the log, and one for the files.

Positive side effect: Only those log entries which actually contain data
are committed => no more empty commits.

Also, change the "-l" option to set the maximum revision to be pulled,
not the number of revisions.

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Matthias Urlichs authored and Junio C Hamano committed Nov 29, 2005
1 parent b020dcd commit 0349080
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 29 deletions.
13 changes: 5 additions & 8 deletions Documentation/git-svnimport.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ git-svnimport - Import a SVN repository into git
SYNOPSIS
--------
'git-svnimport' [ -o <branch-for-HEAD> ] [ -h ] [ -v ] [ -d | -D ]
[ -C <GIT_repository> ] [ -i ] [ -u ] [-l limit_nr_changes]
[ -C <GIT_repository> ] [ -i ] [ -u ] [-l limit_rev]
[ -b branch_subdir ] [ -t trunk_subdir ] [ -T tag_subdir ]
[ -s start_chg ] [ -m ] [ -M regex ]
<SVN_repository_URL> [ <path> ]
Expand Down Expand Up @@ -71,14 +71,11 @@ When importing incementally, you might need to edit the .git/svn2git file.
regex. It can be used with -m to also see the default regexes.
You must escape forward slashes.

-l <max_num_changes>::
Limit the number of SVN changesets we pull before quitting.
This option is necessary because the SVN library has serious memory
leaks; the recommended value for nontrivial imports is 100.
-l <max_rev>::
Specify a maximum revision number to pull.

git-svnimport will still exit with a zero exit code. You can check
the size of the file ".git/svn2git" to determine whether to call
the importer again.
Formerly, this option controlled how many revisions to pull, due to
SVN memory leaks. (These have been worked around.)

-v::
Verbosity: let 'svnimport' report what it is doing.
Expand Down
37 changes: 16 additions & 21 deletions git-svnimport.perl
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
sub usage() {
print STDERR <<END;
Usage: ${\basename $0} # fetch/update GIT from SVN
[-o branch-for-HEAD] [-h] [-v] [-l max_num_changes]
[-o branch-for-HEAD] [-h] [-v] [-l max_rev]
[-C GIT_repository] [-t tagname] [-T trunkname] [-b branchname]
[-d|-D] [-i] [-u] [-s start_chg] [-m] [-M regex] [SVN_URL]
END
Expand Down Expand Up @@ -126,8 +126,9 @@ sub file {
package main;
use URI;

my $svn = $svn_url;
our $svn = $svn_url;
$svn .= "/$svn_dir" if defined $svn_dir;
my $svn2 = SVNconn->new($svn);
$svn = SVNconn->new($svn);

my $lwp_ua;
Expand Down Expand Up @@ -198,7 +199,7 @@ ($$)
my $maxnum = 0;
my $last_rev = "";
my $last_branch;
my $current_rev = $opt_s-1;
my $current_rev = $opt_s || 1;
unless(-d $git_dir) {
system("git-init-db");
die "Cannot init the GIT db at $git_tree: $?\n" if $?;
Expand Down Expand Up @@ -254,7 +255,7 @@ ($$)
my($num,$branch,$ref) = split;
$branches{$branch}{$num} = $ref;
$branches{$branch}{"LAST"} = $ref;
$current_rev = $num if $current_rev < $num;
$current_rev = $num+1 if $current_rev <= $num;
}
close($B);
}
Expand Down Expand Up @@ -708,17 +709,17 @@ sub commit {
print "DONE: $revision $dest $cid\n" if $opt_v;
}

my ($changed_paths, $revision, $author, $date, $message, $pool) = @_;
sub _commit_all {
($changed_paths, $revision, $author, $date, $message, $pool) = @_;
sub commit_all {
# Recursive use of the SVN connection does not work
local $svn = $svn2;

my ($changed_paths, $revision, $author, $date, $message, $pool) = @_;
my %p;
while(my($path,$action) = each %$changed_paths) {
$p{$path} = [ $action->action,$action->copyfrom_path, $action->copyfrom_rev, $path ];
}
$changed_paths = \%p;
}

sub commit_all {
my %done;
my @col;
my $pref;
Expand All @@ -734,18 +735,12 @@ sub commit_all {
}
}

while(++$current_rev <= $svn->{'maxrev'}) {
if (defined $opt_l) {
$opt_l--;
if ($opt_l < 0) {
last;
}
}
my $pool=SVN::Pool->new;
$svn->{'svn'}->get_log("/",$current_rev,$current_rev,1,1,1,\&_commit_all,$pool);
$pool->clear;
commit_all();
}
$opt_l = $svn->{'maxrev'} if not defined $opt_l or $opt_l > $svn->{'maxrev'};
print "Fetching from $current_rev to $opt_l ...\n" if $opt_v;

my $pool=SVN::Pool->new;
$svn->{'svn'}->get_log("/",$current_rev,$opt_l,0,1,1,\&commit_all,$pool);
$pool->clear;


unlink($git_index);
Expand Down

0 comments on commit 0349080

Please sign in to comment.