Code

git-svn: ensure fetch always works chronologically.
[git.git] / contrib / git-svn / git-svn
index 62fc14fb0de5df23c889ee6106406639906a3002..2caf0570ff7753f59b1e9709590a793a7940a2a6 100755 (executable)
@@ -168,14 +168,15 @@ sub fetch {
        my (@parents) = @_;
        $SVN_URL ||= file_to_s("$GIT_DIR/$GIT_SVN/info/url");
        my @log_args = -d $SVN_WC ? ($SVN_WC) : ($SVN_URL);
-       if (-d $SVN_WC && !$_revision) {
-               $_revision = 'BASE:HEAD';
+       unless ($_revision) {
+               $_revision = -d $SVN_WC ? 'BASE:HEAD' : '0:HEAD';
        }
-       push @log_args, "-r$_revision" if $_revision;
+       push @log_args, "-r$_revision";
        push @log_args, '--stop-on-copy' unless $_no_stop_copy;
 
        eval { require XML::Simple or croak $! };
        my $svn_log = $@ ? svn_log_raw(@log_args) : svn_log_xml(@log_args);
+       @$svn_log = sort { $a->{revision} <=> $b->{revision} } @$svn_log;
 
        my $base = shift @$svn_log or croak "No base revision!\n";
        my $last_commit = undef;
@@ -523,7 +524,7 @@ sub svn_log_raw {
 
                        # if we have an empty log message, put something there:
                        if (@svn_log) {
-                               $svn_log[0]->{msg} ||= "\n";
+                               $svn_log[$#svn_log]->{msg} ||= "\n";
                        }
                        next;
                }
@@ -538,7 +539,7 @@ sub svn_log_raw {
                                        date => "$tz $Y-$m-$d $H:$M:$S",
                                        author => $author,
                                        msg => '' );
-                       unshift @svn_log, \%log_msg;
+                       push @svn_log, \%log_msg;
                        $state = 'msg_start';
                        next;
                }
@@ -546,7 +547,7 @@ sub svn_log_raw {
                if ($state eq 'msg_start' && /^$/) {
                        $state = 'msg';
                } elsif ($state eq 'msg') {
-                       $svn_log[0]->{msg} .= $_."\n";
+                       $svn_log[$#svn_log]->{msg} .= $_."\n";
                }
        }
        close $log_fh or croak $?;