diff options
author | Matthias Urlichs <smurf@smurf.noris.de> | 2005-10-10 12:41:15 +0200 |
---|---|---|
committer | Matthias Urlichs <smurf@smurf.noris.de> | 2005-10-10 12:41:15 +0200 |
commit | f0daa628a297819ed039e6b61d337fde02d8a6dd (patch) | |
tree | e2226a50707ea40be337be156148171c1d6a3f66 /git-svnimport.perl | |
parent | c015bf2bcbdc2021410753b4a024dd35dfef6a33 (diff) | |
download | git-f0daa628a297819ed039e6b61d337fde02d8a6dd.tar.gz git-f0daa628a297819ed039e6b61d337fde02d8a6dd.tar.xz |
svn import: copy path information
Due to a bug in the SVN library, path information is freed as soon as the
callback returns, even if it still refers to the data.
Workaround: Copy it. (Also fix a wrong-method-name bug while we're at it.)
Signed-Off-By: Matthias Urlichs <smurf@smurf.noris.de>
Diffstat (limited to 'git-svnimport.perl')
-rwxr-xr-x | git-svnimport.perl | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/git-svnimport.perl b/git-svnimport.perl index 27d964cab..3844cc50d 100755 --- a/git-svnimport.perl +++ b/git-svnimport.perl @@ -346,9 +346,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 +385,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 +408,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,7 +432,7 @@ 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"; } } @@ -596,7 +596,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; |