git-svn: Set svn.authorsfile to an absolute path when cloning
[gitweb.git] / git-svn.perl
index 2746895ae620a37c4b84419caf221db8f476e197..dc0e711593fec5a2d798f88ad70d20533622c1a2 100755 (executable)
@@ -392,9 +392,11 @@ sub cmd_clone {
                $path = $url;
        }
        $path = basename($url) if !defined $path || !length $path;
+       my $authors_absolute = $_authors ? File::Spec->rel2abs($_authors) : "";
        cmd_init($url, $path);
        Git::SVN::fetch_all($Git::SVN::default_repo_id);
-       command_oneline('config', 'svn.authorsfile', $_authors) if $_authors;
+       command_oneline('config', 'svn.authorsfile', $authors_absolute)
+           if $_authors;
 }
 
 sub cmd_init {
@@ -428,6 +430,7 @@ sub cmd_fetch {
        if (@_ > 1) {
                die "Usage: $0 fetch [--all] [--parent] [svn-remote]\n";
        }
+       $Git::SVN::no_reuse_existing = undef;
        if ($_fetch_parent) {
                my ($url, $rev, $uuid, $gs) = working_head_info('HEAD');
                unless ($gs) {
@@ -956,6 +959,7 @@ sub cmd_multi_init {
 }
 
 sub cmd_multi_fetch {
+       $Git::SVN::no_reuse_existing = undef;
        my $remotes = Git::SVN::read_all_remotes();
        foreach my $repo_id (sort keys %$remotes) {
                if ($remotes->{$repo_id}->{url}) {
@@ -2746,12 +2750,16 @@ sub mkemptydirs {
                } elsif (/^  \+empty_dir: (.+)$/) {
                        $empty_dirs{$1} = 1;
                } elsif (/^  \-empty_dir: (.+)$/) {
-                       delete $empty_dirs{$1};
+                       my @d = grep {m[^\Q$1\E(/|$)]} (keys %empty_dirs);
+                       delete @empty_dirs{@d};
                }
        }
        close $fh;
+
+       my $strip = qr/\A\Q$self->{path}\E(?:\/|$)/;
        foreach my $d (sort keys %empty_dirs) {
                $d = uri_decode($d);
+               $d =~ s/$strip//;
                next if -d $d;
                if (-e _) {
                        warn "$d exists but is not a directory\n";
@@ -2935,10 +2943,14 @@ sub find_extra_svk_parents {
                        if ( my $commit = $gs->rev_map_get($rev, $uuid) ) {
                                # wahey!  we found it, but it might be
                                # an old one (!)
-                               push @known_parents, $commit;
+                               push @known_parents, [ $rev, $commit ];
                        }
                }
        }
+       # Ordering matters; highest-numbered commit merge tickets
+       # first, as they may account for later merge ticket additions
+       # or changes.
+       @known_parents = map {$_->[1]} sort {$b->[0] <=> $a->[0]} @known_parents;
        for my $parent ( @known_parents ) {
                my @cmd = ('rev-list', $parent, map { "^$_" } @$parents );
                my ($msg_fh, $ctx) = command_output_pipe(@cmd);
@@ -3881,11 +3893,11 @@ sub delete_entry {
                }
                print "\tD\t$gpath/\n" unless $::_q;
                command_close_pipe($ls, $ctx);
-               $self->{empty}->{$path} = 0
        } else {
                $self->{gii}->remove($gpath);
                print "\tD\t$gpath\n" unless $::_q;
        }
+       $self->{empty}->{$path} = 0;
        undef;
 }