SVN import: Use one log call
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>maint
							parent
							
								
									b020dcd54c
								
							
						
					
					
						commit
						034908047d
					
				|  | @ -10,7 +10,7 @@ git-svnimport - Import a SVN repository into git | ||||||
| SYNOPSIS | SYNOPSIS | ||||||
| -------- | -------- | ||||||
| 'git-svnimport' [ -o <branch-for-HEAD> ] [ -h ] [ -v ] [ -d | -D ] | '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 ] | 			[ -b branch_subdir ] [ -t trunk_subdir ] [ -T tag_subdir ] | ||||||
| 			[ -s start_chg ] [ -m ] [ -M regex ] | 			[ -s start_chg ] [ -m ] [ -M regex ] | ||||||
| 			<SVN_repository_URL> [ <path> ] | 			<SVN_repository_URL> [ <path> ] | ||||||
|  | @ -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. | 	regex. It can be used with -m to also see the default regexes. | ||||||
| 	You must escape forward slashes. | 	You must escape forward slashes. | ||||||
|  |  | ||||||
| -l <max_num_changes>:: | -l <max_rev>:: | ||||||
| 	Limit the number of SVN changesets we pull before quitting. | 	Specify a maximum revision number to pull. | ||||||
| 	This option is necessary because the SVN library has serious memory |  | ||||||
| 	leaks; the recommended value for nontrivial imports is 100. |  | ||||||
|  |  | ||||||
| 	git-svnimport will still exit with a zero exit code. You can check | 	Formerly, this option controlled how many revisions to pull, due to | ||||||
| 	the size of the file ".git/svn2git" to determine whether to call | 	SVN memory leaks. (These have been worked around.) | ||||||
| 	the importer again. |  | ||||||
|  |  | ||||||
| -v:: | -v:: | ||||||
| 	Verbosity: let 'svnimport' report what it is doing. | 	Verbosity: let 'svnimport' report what it is doing. | ||||||
|  |  | ||||||
|  | @ -35,7 +35,7 @@ our($opt_h,$opt_o,$opt_v,$opt_u,$opt_C,$opt_i,$opt_m,$opt_M,$opt_t,$opt_T,$opt_b | ||||||
| sub usage() { | sub usage() { | ||||||
| 	print STDERR <<END; | 	print STDERR <<END; | ||||||
| Usage: ${\basename $0}     # fetch/update GIT from SVN | 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] |        [-C GIT_repository] [-t tagname] [-T trunkname] [-b branchname] | ||||||
|        [-d|-D] [-i] [-u] [-s start_chg] [-m] [-M regex] [SVN_URL] |        [-d|-D] [-i] [-u] [-s start_chg] [-m] [-M regex] [SVN_URL] | ||||||
| END | END | ||||||
|  | @ -126,8 +126,9 @@ sub file { | ||||||
| package main; | package main; | ||||||
| use URI; | use URI; | ||||||
|  |  | ||||||
| my $svn = $svn_url; | our $svn = $svn_url; | ||||||
| $svn .= "/$svn_dir" if defined $svn_dir; | $svn .= "/$svn_dir" if defined $svn_dir; | ||||||
|  | my $svn2 = SVNconn->new($svn); | ||||||
| $svn = SVNconn->new($svn); | $svn = SVNconn->new($svn); | ||||||
|  |  | ||||||
| my $lwp_ua; | my $lwp_ua; | ||||||
|  | @ -198,7 +199,7 @@ $ENV{GIT_INDEX_FILE} = $git_index; | ||||||
| my $maxnum = 0; | my $maxnum = 0; | ||||||
| my $last_rev = ""; | my $last_rev = ""; | ||||||
| my $last_branch; | my $last_branch; | ||||||
| my $current_rev = $opt_s-1; | my $current_rev = $opt_s || 1; | ||||||
| unless(-d $git_dir) { | unless(-d $git_dir) { | ||||||
| 	system("git-init-db"); | 	system("git-init-db"); | ||||||
| 	die "Cannot init the GIT db at $git_tree: $?\n" if $?; | 	die "Cannot init the GIT db at $git_tree: $?\n" if $?; | ||||||
|  | @ -254,7 +255,7 @@ EOM | ||||||
| 		my($num,$branch,$ref) = split; | 		my($num,$branch,$ref) = split; | ||||||
| 		$branches{$branch}{$num} = $ref; | 		$branches{$branch}{$num} = $ref; | ||||||
| 		$branches{$branch}{"LAST"} = $ref; | 		$branches{$branch}{"LAST"} = $ref; | ||||||
| 		$current_rev = $num if $current_rev < $num; | 		$current_rev = $num+1 if $current_rev <= $num; | ||||||
| 	} | 	} | ||||||
| 	close($B); | 	close($B); | ||||||
| } | } | ||||||
|  | @ -708,17 +709,17 @@ sub commit { | ||||||
| 	print "DONE: $revision $dest $cid\n" if $opt_v; | 	print "DONE: $revision $dest $cid\n" if $opt_v; | ||||||
| } | } | ||||||
|  |  | ||||||
| my ($changed_paths, $revision, $author, $date, $message, $pool) = @_; | sub commit_all { | ||||||
| sub _commit_all { | 	# Recursive use of the SVN connection does not work | ||||||
| 	($changed_paths, $revision, $author, $date, $message, $pool) = @_; | 	local $svn = $svn2; | ||||||
|  |  | ||||||
|  | 	my ($changed_paths, $revision, $author, $date, $message, $pool) = @_; | ||||||
| 	my %p; | 	my %p; | ||||||
| 	while(my($path,$action) = each %$changed_paths) { | 	while(my($path,$action) = each %$changed_paths) { | ||||||
| 		$p{$path} = [ $action->action,$action->copyfrom_path, $action->copyfrom_rev, $path ]; | 		$p{$path} = [ $action->action,$action->copyfrom_path, $action->copyfrom_rev, $path ]; | ||||||
| 	} | 	} | ||||||
| 	$changed_paths = \%p; | 	$changed_paths = \%p; | ||||||
| } |  | ||||||
|  |  | ||||||
| sub commit_all { |  | ||||||
| 	my %done; | 	my %done; | ||||||
| 	my @col; | 	my @col; | ||||||
| 	my $pref; | 	my $pref; | ||||||
|  | @ -734,18 +735,12 @@ sub commit_all { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| while(++$current_rev <= $svn->{'maxrev'}) { | $opt_l = $svn->{'maxrev'} if not defined $opt_l or $opt_l > $svn->{'maxrev'}; | ||||||
| 	if (defined $opt_l) { | print "Fetching from $current_rev to $opt_l ...\n" if $opt_v; | ||||||
| 		$opt_l--; |  | ||||||
| 		if ($opt_l < 0) { | my $pool=SVN::Pool->new; | ||||||
| 			last; | $svn->{'svn'}->get_log("/",$current_rev,$opt_l,0,1,1,\&commit_all,$pool); | ||||||
| 		} | $pool->clear; | ||||||
| 	} |  | ||||||
| 	my $pool=SVN::Pool->new; |  | ||||||
| 	$svn->{'svn'}->get_log("/",$current_rev,$current_rev,1,1,1,\&_commit_all,$pool); |  | ||||||
| 	$pool->clear; |  | ||||||
| 	commit_all(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| unlink($git_index); | unlink($git_index); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Matthias Urlichs
						Matthias Urlichs