svnimport: Convert executable flag
[git.git] / git-svnimport.perl
index c536d70..6603b96 100755 (executable)
@@ -10,7 +10,6 @@
 # The head revision is on branch "origin" by default.
 # You can change that with the '-o' option.
 
-require 5.008; # for shell-safe open("-|",LIST)
 use strict;
 use warnings;
 use Getopt::Std;
@@ -113,16 +112,22 @@ sub file {
                    DIR => File::Spec->tmpdir(), UNLINK => 1);
 
        print "... $rev $path ...\n" if $opt_v;
-       my $pool = SVN::Pool->new();
-       eval { $self->{'svn'}->get_file($path,$rev,$fh,$pool); };
-       $pool->clear;
+       my (undef, $properties);
+       eval { (undef, $properties)
+                  = $self->{'svn'}->get_file($path,$rev,$fh); };
        if($@) {
                return undef if $@ =~ /Attempted to get checksum/;
                die $@;
        }
+       my $mode;
+       if (exists $properties->{'svn:executable'}) {
+               $mode = '0755';
+       } else {
+               $mode = '0644';
+       }
        close ($fh);
 
-       return $name;
+       return ($name, $mode);
 }
 
 package main;
@@ -297,7 +302,7 @@ sub get_file($$$) {
        my $svnpath = revert_split_path($branch,$path);
 
        # now get it
-       my $name;
+       my ($name,$mode);
        if($opt_d) {
                my($req,$res);
 
@@ -317,18 +322,22 @@ sub get_file($$$) {
                        return undef if $res->code == 301; # directory?
                        die $res->status_line." at $url\n";
                }
+               $mode = '0644'; # can't obtain mode via direct http request?
        } else {
-               $name = $svn->file("$svnpath",$rev);
+               ($name,$mode) = $svn->file("$svnpath",$rev);
                return undef unless defined $name;
        }
 
-       open my $F, '-|', "git-hash-object", "-w", $name
+       my $pid = open(my $F, '-|');
+       die $! unless defined $pid;
+       if (!$pid) {
+           exec("git-hash-object", "-w", $name)
                or die "Cannot create object: $!\n";
+       }
        my $sha = <$F>;
        chomp $sha;
        close $F;
        unlink $name;
-       my $mode = "0644"; # SV does not seem to store any file modes
        return [$mode, $sha, $path];
 }
 
@@ -398,7 +407,12 @@ sub copy_path($$$$$$$$) {
                        $srcpath =~ s#/*$#/#;
        }
        
-       open my $f,"-|","git-ls-tree","-r","-z",$gitrev,$srcpath;
+       my $pid = open my $f,'-|';
+       die $! unless defined $pid;
+       if (!$pid) {
+               exec("git-ls-tree","-r","-z",$gitrev,$srcpath)
+                       or die $!;
+       }
        local $/ = "\0";
        while(<$f>) {
                chomp;
@@ -554,7 +568,11 @@ sub commit {
                                @o1 = @old;
                                @old = ();
                        }
-                       open my $F, "-|", "git-ls-files", "-z", @o1 or die $!;
+                       my $pid = open my $F, "-|";
+                       die "$!" unless defined $pid;
+                       if (!$pid) {
+                               exec("git-ls-files", "-z", @o1) or die $!;
+                       }
                        @o1 = ();
                        local $/ = "\0";
                        while(<$F>) {