Merge branch 'np/delta' into next
[gitweb.git] / git-svnimport.perl
index 114784ff3e2fd7329dfb1eb48470bbfc0e5fd862..61f559f0a8ae69c04cfe9d8700591cedda41989c 100755 (executable)
@@ -98,6 +98,7 @@ package SVNconn;
 use File::Spec;
 use File::Temp qw(tempfile);
 use POSIX qw(strftime dup2);
+use Fcntl qw(SEEK_SET);
 
 sub new {
        my($what,$repo) = @_;
@@ -135,17 +136,32 @@ sub file {
 
        print "... $rev $path ...\n" if $opt_v;
        my (undef, $properties);
+       my $pool = SVN::Pool->new();
        eval { (undef, $properties)
-                  = $self->{'svn'}->get_file($path,$rev,$fh); };
+                  = $self->{'svn'}->get_file($path,$rev,$fh,$pool); };
+       $pool->clear;
        if($@) {
                return undef if $@ =~ /Attempted to get checksum/;
                die $@;
        }
        my $mode;
        if (exists $properties->{'svn:executable'}) {
-               $mode = '0755';
+               $mode = '100755';
+       } elsif (exists $properties->{'svn:special'}) {
+               my ($special_content, $filesize);
+               $filesize = tell $fh;
+               seek $fh, 0, SEEK_SET;
+               read $fh, $special_content, $filesize;
+               if ($special_content =~ s/^link //) {
+                       $mode = '120000';
+                       seek $fh, 0, SEEK_SET;
+                       truncate $fh, 0;
+                       print $fh $special_content;
+               } else {
+                       die "unexpected svn:special file encountered";
+               }
        } else {
-               $mode = '0644';
+               $mode = '100644';
        }
        close ($fh);
 
@@ -616,9 +632,7 @@ sub commit {
                        }
                        if(($action->[0] eq "A") || ($action->[0] eq "R")) {
                                my $node_kind = node_kind($branch,$path,$revision);
-                               if($action->[1]) {
-                                       copy_path($revision,$branch,$path,$action->[1],$action->[2],$node_kind,\@new,\@parents);
-                               } elsif ($node_kind eq $SVN::Node::file) {
+                               if ($node_kind eq $SVN::Node::file) {
                                        my $f = get_file($revision,$branch,$path);
                                        if ($f) {
                                                push(@new,$f) if $f;
@@ -627,8 +641,15 @@ sub commit {
                                                print STDERR "$revision: $branch: could not fetch '$opath'\n";
                                        }
                                } elsif ($node_kind eq $SVN::Node::dir) {
-                                       get_ignore(\@new, \@old, $revision,
-                                                  $branch,$path);
+                                       if($action->[1]) {
+                                               copy_path($revision, $branch,
+                                                         $path, $action->[1],
+                                                         $action->[2], $node_kind,
+                                                         \@new, \@parents);
+                                       } else {
+                                               get_ignore(\@new, \@old, $revision,
+                                                          $branch, $path);
+                                       }
                                }
                        } elsif ($action->[0] eq "D") {
                                push(@old,$path);