Code

git-svn: fix log with single revision against a non-HEAD branch
authorEric Wong <normalperson@yhbt.net>
Wed, 15 Aug 2007 16:55:18 +0000 (09:55 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 15 Aug 2007 19:09:48 +0000 (12:09 -0700)
Running git-svn log <ref> -r<rev> against a <ref> other than the
current HEAD did not work if the <rev> was exclusive to the
other branch.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-svn.perl
t/t9116-git-svn-log.sh [new file with mode: 0755]

index ee7ef693fa9300082ca090ebf97f7e242043fb72..d162114e26d64ff6a8a63dd8ff5d795c476868d4 100755 (executable)
@@ -3501,11 +3501,17 @@ sub log_use_color {
 sub git_svn_log_cmd {
        my ($r_min, $r_max, @args) = @_;
        my $head = 'HEAD';
+       my (@files, @log_opts);
        foreach my $x (@args) {
-               last if $x eq '--';
-               next unless ::verify_ref("$x^0");
-               $head = $x;
-               last;
+               if ($x eq '--' || @files) {
+                       push @files, $x;
+               } else {
+                       if (::verify_ref("$x^0")) {
+                               $head = $x;
+                       } else {
+                               push @log_opts, $x;
+                       }
+               }
        }
 
        my ($url, $rev, $uuid, $gs) = ::working_head_info($head);
@@ -3515,13 +3521,13 @@ sub git_svn_log_cmd {
        push @cmd, '-r' unless $non_recursive;
        push @cmd, qw/--raw --name-status/ if $verbose;
        push @cmd, '--color' if log_use_color();
-       return @cmd unless defined $r_max;
-       if ($r_max == $r_min) {
+       push @cmd, @log_opts;
+       if (defined $r_max && $r_max == $r_min) {
                push @cmd, '--max-count=1';
                if (my $c = $gs->rev_db_get($r_max)) {
                        push @cmd, $c;
                }
-       } else {
+       } elsif (defined $r_max) {
                my ($c_min, $c_max);
                $c_max = $gs->rev_db_get($r_max);
                $c_min = $gs->rev_db_get($r_min);
@@ -3537,7 +3543,7 @@ sub git_svn_log_cmd {
                        push @cmd, $c_min;
                }
        }
-       return @cmd;
+       return (@cmd, @files);
 }
 
 # adapted from pager.c
@@ -3702,7 +3708,7 @@ sub cmd_show_log {
        }
 
        config_pager();
-       @args = (git_svn_log_cmd($r_min, $r_max, @args), @args);
+       @args = git_svn_log_cmd($r_min, $r_max, @args);
        my $log = command_output_pipe(@args);
        run_pager();
        my (@k, $c, $d, $stat);
diff --git a/t/t9116-git-svn-log.sh b/t/t9116-git-svn-log.sh
new file mode 100755 (executable)
index 0000000..0d4e6b3
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/sh
+#
+# Copyright (c) 2007 Eric Wong
+#
+
+test_description='git-svn log tests'
+. ./lib-git-svn.sh
+
+test_expect_success 'setup repository and import' "
+       mkdir import &&
+       cd import &&
+               for i in trunk branches/a branches/b \
+                        tags/0.1 tags/0.2 tags/0.3; do
+                       mkdir -p \$i && \
+                       echo hello >> \$i/README || exit 1
+               done && \
+               svn import -m test . $svnrepo
+               cd .. &&
+       git-svn init $svnrepo -T trunk -b branches -t tags &&
+       git-svn fetch &&
+       git reset --hard trunk &&
+       echo bye >> README &&
+       git commit -a -m bye &&
+       git svn dcommit &&
+       git reset --hard a &&
+       echo why >> FEEDME &&
+       git update-index --add FEEDME &&
+       git commit -m feedme &&
+       git svn dcommit &&
+       git reset --hard trunk &&
+       echo aye >> README &&
+       git commit -a -m aye &&
+       git svn dcommit
+       "
+
+test_expect_success 'run log' "
+       git reset --hard a &&
+       git svn log -r2 trunk | grep ^r2 &&
+       git svn log -r4 trunk | grep ^r4 &&
+       git svn log -r3 | grep ^r3
+       "
+
+test_expect_success 'run log against a from trunk' "
+       git reset --hard trunk &&
+       git svn log -r3 a | grep ^r3
+       "
+
+test_done