svn import: avoid reconnecting
[git.git] / git-svnimport.perl
index 27d964c..ba9f818 100755 (executable)
@@ -26,6 +26,8 @@ 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";
+
 $SIG{'PIPE'}="IGNORE";
 $ENV{'TZ'}="UTC";
 
@@ -98,8 +100,6 @@ sub new {
        $self->{'fullrep'} = $repo;
        $self->conn();
 
-       $self->{'lines'} = undef;
-
        return $self;
 }
 
@@ -110,6 +110,7 @@ sub conn {
 
        die "SVN connection to $repo: $!\n" unless defined $s;
        $self->{'svn'} = $s;
+       print STDERR "*** SVN *** $s ***\n";
        $self->{'repo'} = $repo;
        $self->{'maxrev'} = $s->get_latest_revnum();
 }
@@ -122,13 +123,15 @@ sub file {
                    DIR => File::Spec->tmpdir(), UNLINK => 1);
 
        print "... $rev $path ...\n" if $opt_v;
-       eval { $self->{'svn'}->get_file($path,$rev,$fh); };
-       if (defined $@ and $@ !~ /Attempted to get checksum/) {
+       my $s = $self->{'svn'};
+       print STDERR "*** GET *** $s ***\n";
+       eval { $s->get_file($path,$rev,$fh); };
+       if ($@ and $@ !~ /Attempted to get checksum/) {
            # retry
            $self->conn();
                eval { $self->{'svn'}->get_file($path,$rev,$fh); };
        };
-       return () if defined $@ and $@ !~ /Attempted to get checksum/;
+       return () if $@ and $@ !~ /Attempted to get checksum/;
        die $@ if $@;
        close ($fh);
 
@@ -290,7 +293,7 @@ sub get_file($$$) {
        my ($name, $res) = eval { $svn->file($svnpath,$rev); };
        return () unless defined $name;
 
-       open my $F, '-|', "git-hash-object -w $name"
+       open my $F, '-|', "git-hash-object", "-w", $name
                or die "Cannot create object: $!\n";
        my $sha = <$F>;
        chomp $sha;
@@ -346,9 +349,9 @@ sub commit {
        $dest = $parent;
 
        my $prev = $changed_paths->{"/"};
-       if($prev and $prev->action eq "A") {
+       if($prev and $prev->[0] eq "A") {
                delete $changed_paths->{"/"};
-               my $oldpath = $prev->copyfrom_path;
+               my $oldpath = $prev->[1];
                my $rev;
                if(defined $oldpath) {
                        my $p;
@@ -385,7 +388,7 @@ sub commit {
                $rev = undef;
        }
 
-#      if($prev and $prev->action eq "A") {
+#      if($prev and $prev->[0] eq "A") {
 #              if(not $tag) {
 #                      unless(open(H,"> $git_dir/refs/heads/$branch")) {
 #                              print STDERR "$revision: Could not create branch $branch: $!\n";
@@ -408,21 +411,21 @@ sub commit {
        }
 
        while(my($path,$action) = each %$changed_paths) {
-               if ($action->action eq "A") {
+               if ($action->[0] eq "A") {
                        my $f = get_file($revision,$branch,$path);
                        push(@new,$f) if $f;
-               } elsif ($action->action eq "D") {
+               } elsif ($action->[0] eq "D") {
                        push(@old,$path);
-               } elsif ($action->action eq "M") {
+               } elsif ($action->[0] eq "M") {
                        my $f = get_file($revision,$branch,$path);
                        push(@new,$f) if $f;
-               } elsif ($action->action eq "R") {
+               } elsif ($action->[0] eq "R") {
                        # refer to a file/tree in an earlier commit
                        push(@old,$path); # remove any old stuff
 
                        # ... and add any new stuff
-                       my($b,$p) = split_path($revision,$action->oldpath);
-                       open my $F,"-|","git-ls-tree","-r","-z", $branches{$b}{$action->oldrev}, $p;
+                       my($b,$p) = split_path($revision,$action->[1]);
+                       open my $F,"-|","git-ls-tree","-r","-z", $branches{$b}{$action->[2]}, $p;
                        local $/ = '\0';
                        while(<$F>) {
                                chomp;
@@ -432,19 +435,19 @@ sub commit {
                                push(@new,[$mode,$sha1,$p]);
                        }
                } else {
-                       die "$revision: unknown action '".$action->action."' for $path\n";
+                       die "$revision: unknown action '".$action->[0]."' for $path\n";
                }
        }
 
        if(@old) {
-               open F, "-│", "git-ls-files", "-z", @old or die $!;
+               open my $F, "-│", "git-ls-files", "-z", @old or die $!;
                @old = ();
                local $/ = '\0';
-               while(<F>) {
+               while(<$F>) {
                        chomp;
                        push(@old,$_);
                }
-               close(F);
+               close($F);
 
                while(@old) {
                        my @o2;
@@ -596,7 +599,13 @@ sub commit {
 my ($changed_paths, $revision, $author, $date, $message, $pool) = @_;
 sub _commit_all {
        ($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 ];
+       }
+       $changed_paths = \%p;
 }
+
 sub commit_all {
        my %done;
        my @col;