X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-svnimport.perl;h=c536d7026d4c56dbf5ca0ccb1a93c25a956a64ba;hb=39c015c556f285106931e0500f301de462b0e46e;hp=e97f47059fda6cf058e43f2b77ff784ed2b5ee13;hpb=a16db4f472887a9050bf528bc7f0b94d6f7e8319;p=git.git diff --git a/git-svnimport.perl b/git-svnimport.perl index e97f4705..c536d702 100755 --- a/git-svnimport.perl +++ b/git-svnimport.perl @@ -25,24 +25,24 @@ use IPC::Open2; use SVN::Core; use SVN::Ra; -die "Need CVN:Core 1.2.1 or better" if $SVN::Core::VERSION lt "1.2.1"; +die "Need SVN:Core 1.2.1 or better" if $SVN::Core::VERSION lt "1.2.1"; $SIG{'PIPE'}="IGNORE"; $ENV{'TZ'}="UTC"; -our($opt_h,$opt_o,$opt_v,$opt_u,$opt_C,$opt_i,$opt_m,$opt_M,$opt_t,$opt_T,$opt_b,$opt_s,$opt_l,$opt_d,$opt_D); +our($opt_h,$opt_o,$opt_v,$opt_u,$opt_C,$opt_i,$opt_m,$opt_M,$opt_t,$opt_T,$opt_b,$opt_r,$opt_s,$opt_l,$opt_d,$opt_D); sub usage() { print STDERR <{'fullrep'}; - my $s = SVN::Ra->new($repo); - + my $auth = SVN::Core::auth_open ([SVN::Client::get_simple_provider, + SVN::Client::get_ssl_server_trust_file_provider, + SVN::Client::get_username_provider]); + my $s = SVN::Ra->new(url => $repo, auth => $auth); die "SVN connection to $repo: $!\n" unless defined $s; $self->{'svn'} = $s; $self->{'repo'} = $repo; @@ -127,8 +128,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; @@ -199,7 +201,7 @@ $ENV{GIT_INDEX_FILE} = $git_index; 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 $?; @@ -217,7 +219,11 @@ unless(-d $git_dir) { -f "$git_dir/svn2git" or die "'$git_dir/svn2git' does not exist.\n". "You need that file for incremental imports.\n"; - $last_branch = basename(readlink("$git_dir/HEAD")); + open(F, "git-symbolic-ref HEAD |") or + die "Cannot run git-symbolic-ref: $!\n"; + chomp ($last_branch = ); + $last_branch = basename($last_branch); + close(F); unless($last_branch) { warn "Cannot read the last branch name: $! -- assuming 'master'\n"; $last_branch = "master"; @@ -251,7 +257,7 @@ EOM 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); } @@ -281,7 +287,8 @@ sub revert_split_path($$) { $svnpath = "$branch_name/$branch/$path"; } - return $svnpath + $svnpath =~ s#/+$##; + return $svnpath; } sub get_file($$$) { @@ -311,7 +318,7 @@ sub get_file($$$) { die $res->status_line." at $url\n"; } } else { - $name = $svn->file("/$svnpath",$rev); + $name = $svn->file("$svnpath",$rev); return undef unless defined $name; } @@ -373,6 +380,10 @@ sub copy_path($$$$$$$$) { my($newrev,$newbranch,$path,$oldpath,$rev,$node_kind,$new,$parents) = @_; my($srcbranch,$srcpath) = split_path($rev,$oldpath); + unless(defined $srcbranch) { + print "Path not found when copying from $oldpath @ $rev\n"; + return; + } my $therev = branch_rev($srcbranch, $rev); my $gitrev = $branches{$srcbranch}{$therev}; unless($gitrev) { @@ -535,23 +546,30 @@ sub commit { } } - if(@old) { - open my $F, "-|", "git-ls-files", "-z", @old or die $!; - @old = (); + while(@old) { + my @o1; + if(@old > 55) { + @o1 = splice(@old,0,50); + } else { + @o1 = @old; + @old = (); + } + open my $F, "-|", "git-ls-files", "-z", @o1 or die $!; + @o1 = (); local $/ = "\0"; while(<$F>) { chomp; - push(@old,$_); + push(@o1,$_); } close($F); - while(@old) { + while(@o1) { my @o2; - if(@old > 55) { - @o2 = splice(@old,0,50); + if(@o1 > 55) { + @o2 = splice(@o1,0,50); } else { - @o2 = @old; - @old = (); + @o2 = @o1; + @o1 = (); } system("git-update-index","--force-remove","--",@o2); die "Cannot remove files: $?\n" if $?; @@ -632,6 +650,7 @@ sub commit { $pr->reader(); $message =~ s/[\s\n]+\z//; + $message = "r$revision: $message" if $opt_r; print $pw "$message\n" or die "Error writing to git-commit-tree: $!\n"; @@ -700,17 +719,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; @@ -726,18 +745,20 @@ sub commit_all { } } -while(++$current_rev <= $svn->{'maxrev'}) { - my $pool=SVN::Pool->new; - $svn->{'svn'}->get_log("/",$current_rev,$current_rev,1,1,1,\&_commit_all,$pool); - $pool->clear; - commit_all(); - if($opt_l and not --$opt_l) { - print STDERR "Stopping, because there is a memory leak (in the SVN library).\n"; - print STDERR "Please repeat this command; it will continue safely\n"; - last; - } +$opt_l = $svn->{'maxrev'} if not defined $opt_l or $opt_l > $svn->{'maxrev'}; + +if ($svn->{'maxrev'} < $current_rev) { + print "Up to date: no new revisions to fetch!\n" if $opt_v; + unlink("$git_dir/SVN2GIT_HEAD"); + exit; } +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); @@ -761,8 +782,7 @@ if($orig_branch) { print "DONE; creating $orig_branch branch\n" if $opt_v and (not defined $opt_l or $opt_l > 0); system("cp","$git_dir/refs/heads/$opt_o","$git_dir/refs/heads/master") unless -f "$git_dir/refs/heads/master"; - unlink("$git_dir/HEAD"); - symlink("refs/heads/$orig_branch","$git_dir/HEAD"); + system('git-update-ref', 'HEAD', "$orig_branch"); unless ($opt_i) { system('git checkout'); die "checkout failed: $?\n" if $?;