Skip to content

Commit

Permalink
Merge git://git.bogomips.org/git-svn
Browse files Browse the repository at this point in the history
* git://git.bogomips.org/git-svn:
  git-svn: Fix a typo and add a comma in an error message in git-svn
  git-svn log: handle unreachable revisions like "svn log"
  git-svn log: include commit log for the smallest revision in a range
  git-svn log: fix ascending revision ranges
  git-svn's dcommit must use subversion's config
  git-svn: add tests for command-line usage of init and clone commands
  • Loading branch information
gitster committed Nov 18, 2007
2 parents dee1b1e + 826a933 commit 9716f21
Show file tree
Hide file tree
Showing 3 changed files with 184 additions and 21 deletions.
70 changes: 49 additions & 21 deletions git-svn.perl
Expand Up @@ -391,7 +391,7 @@ sub cmd_set_tree {
sub cmd_dcommit { sub cmd_dcommit {
my $head = shift; my $head = shift;
git_cmd_try { command_oneline(qw/diff-index --quiet HEAD/) } git_cmd_try { command_oneline(qw/diff-index --quiet HEAD/) }
'Cannot dcommit with a dirty index. Commit your changes first' 'Cannot dcommit with a dirty index. Commit your changes first, '
. "or stash them with `git stash'.\n"; . "or stash them with `git stash'.\n";
$head ||= 'HEAD'; $head ||= 'HEAD';
my @refs; my @refs;
Expand Down Expand Up @@ -425,6 +425,9 @@ sub cmd_dcommit {
my %ed_opts = ( r => $last_rev, my %ed_opts = ( r => $last_rev,
log => get_commit_entry($d)->{log}, log => get_commit_entry($d)->{log},
ra => Git::SVN::Ra->new($gs->full_url), ra => Git::SVN::Ra->new($gs->full_url),
config => SVN::Core::config_get_config(
$Git::SVN::Ra::config_dir
),
tree_a => "$d~1", tree_a => "$d~1",
tree_b => $d, tree_b => $d,
editor_cb => sub { editor_cb => sub {
Expand Down Expand Up @@ -2396,10 +2399,15 @@ sub rev_db_get {
$ret; $ret;
} }


# Finds the first svn revision that exists on (if $eq_ok is true) or
# before $rev for the current branch. It will not search any lower
# than $min_rev. Returns the git commit hash and svn revision number
# if found, else (undef, undef).
sub find_rev_before { sub find_rev_before {
my ($self, $rev, $eq_ok) = @_; my ($self, $rev, $eq_ok, $min_rev) = @_;
--$rev unless $eq_ok; --$rev unless $eq_ok;
while ($rev > 0) { $min_rev ||= 1;
while ($rev >= $min_rev) {
if (my $c = $self->rev_db_get($rev)) { if (my $c = $self->rev_db_get($rev)) {
return ($rev, $c); return ($rev, $c);
} }
Expand All @@ -2408,6 +2416,23 @@ sub find_rev_before {
return (undef, undef); return (undef, undef);
} }


# Finds the first svn revision that exists on (if $eq_ok is true) or
# after $rev for the current branch. It will not search any higher
# than $max_rev. Returns the git commit hash and svn revision number
# if found, else (undef, undef).
sub find_rev_after {
my ($self, $rev, $eq_ok, $max_rev) = @_;
++$rev unless $eq_ok;
$max_rev ||= $self->rev_db_max();
while ($rev <= $max_rev) {
if (my $c = $self->rev_db_get($rev)) {
return ($rev, $c);
}
++$rev;
}
return (undef, undef);
}

sub _new { sub _new {
my ($class, $repo_id, $ref_id, $path) = @_; my ($class, $repo_id, $ref_id, $path) = @_;
unless (defined $repo_id && length $repo_id) { unless (defined $repo_id && length $repo_id) {
Expand Down Expand Up @@ -3698,6 +3723,7 @@ package Git::SVN::Log;
use strict; use strict;
use warnings; use warnings;
use POSIX qw/strftime/; use POSIX qw/strftime/;
use constant commit_log_separator => ('-' x 72) . "\n";
use vars qw/$TZ $limit $color $pager $non_recursive $verbose $oneline use vars qw/$TZ $limit $color $pager $non_recursive $verbose $oneline
%rusers $show_commit $incremental/; %rusers $show_commit $incremental/;
my $l_fmt; my $l_fmt;
Expand Down Expand Up @@ -3791,19 +3817,19 @@ sub git_svn_log_cmd {
push @cmd, $c; push @cmd, $c;
} }
} elsif (defined $r_max) { } elsif (defined $r_max) {
my ($c_min, $c_max); if ($r_max < $r_min) {
$c_max = $gs->rev_db_get($r_max); ($r_min, $r_max) = ($r_max, $r_min);
$c_min = $gs->rev_db_get($r_min); }
if (defined $c_min && defined $c_max) { my (undef, $c_max) = $gs->find_rev_before($r_max, 1, $r_min);
if ($r_max > $r_max) { my (undef, $c_min) = $gs->find_rev_after($r_min, 1, $r_max);
push @cmd, "$c_min..$c_max"; # If there are no commits in the range, both $c_max and $c_min
} else { # will be undefined. If there is at least 1 commit in the
push @cmd, "$c_max..$c_min"; # range, both will be defined.
} return () if !defined $c_min || !defined $c_max;
} elsif ($r_max > $r_min) { if ($c_min eq $c_max) {
push @cmd, $c_max; push @cmd, '--max-count=1', $c_min;
} else { } else {
push @cmd, $c_min; push @cmd, '--boundary', "$c_min..$c_max";
} }
} }
return (@cmd, @files); return (@cmd, @files);
Expand Down Expand Up @@ -3911,7 +3937,7 @@ sub show_commit_changed_paths {


sub show_commit_normal { sub show_commit_normal {
my ($c) = @_; my ($c) = @_;
print '-' x72, "\nr$c->{r} | "; print commit_log_separator, "r$c->{r} | ";
print "$c->{c} | " if $show_commit; print "$c->{c} | " if $show_commit;
print "$c->{a} | ", strftime("%Y-%m-%d %H:%M:%S %z (%a, %d %b %Y)", print "$c->{a} | ", strftime("%Y-%m-%d %H:%M:%S %z (%a, %d %b %Y)",
localtime($c->{t_utc})), ' | '; localtime($c->{t_utc})), ' | ';
Expand Down Expand Up @@ -3972,12 +3998,16 @@ sub cmd_show_log {


config_pager(); config_pager();
@args = git_svn_log_cmd($r_min, $r_max, @args); @args = git_svn_log_cmd($r_min, $r_max, @args);
if (!@args) {
print commit_log_separator unless $incremental || $oneline;
return;
}
my $log = command_output_pipe(@args); my $log = command_output_pipe(@args);
run_pager(); run_pager();
my (@k, $c, $d, $stat); my (@k, $c, $d, $stat);
my $esc_color = qr/(?:\033\[(?:(?:\d+;)*\d*)?m)*/; my $esc_color = qr/(?:\033\[(?:(?:\d+;)*\d*)?m)*/;
while (<$log>) { while (<$log>) {
if (/^${esc_color}commit ($::sha1_short)/o) { if (/^${esc_color}commit -?($::sha1_short)/o) {
my $cmt = $1; my $cmt = $1;
if ($c && cmt_showable($c) && $c->{r} != $r_last) { if ($c && cmt_showable($c) && $c->{r} != $r_last) {
$r_last = $c->{r}; $r_last = $c->{r};
Expand Down Expand Up @@ -4020,14 +4050,12 @@ sub cmd_show_log {
process_commit($c, $r_min, $r_max, \@k); process_commit($c, $r_min, $r_max, \@k);
} }
if (@k) { if (@k) {
my $swap = $r_max; ($r_min, $r_max) = ($r_max, $r_min);
$r_max = $r_min;
$r_min = $swap;
process_commit($_, $r_min, $r_max) foreach reverse @k; process_commit($_, $r_min, $r_max) foreach reverse @k;
} }
out: out:
close $log; close $log;
print '-' x72,"\n" unless $incremental || $oneline; print commit_log_separator unless $incremental || $oneline;
} }


package Git::SVN::Migration; package Git::SVN::Migration;
Expand Down
80 changes: 80 additions & 0 deletions t/t9116-git-svn-log.sh
Expand Up @@ -30,6 +30,12 @@ test_expect_success 'setup repository and import' "
git reset --hard trunk && git reset --hard trunk &&
echo aye >> README && echo aye >> README &&
git commit -a -m aye && git commit -a -m aye &&
git svn dcommit &&
git reset --hard b &&
echo spy >> README &&
git commit -a -m spy &&
echo try >> README &&
git commit -a -m try &&
git svn dcommit git svn dcommit
" "


Expand All @@ -45,4 +51,78 @@ test_expect_success 'run log against a from trunk' "
git svn log -r3 a | grep ^r3 git svn log -r3 a | grep ^r3
" "


printf 'r1 \nr2 \nr4 \n' > expected-range-r1-r2-r4

test_expect_success 'test ascending revision range' "
git reset --hard trunk &&
git svn log -r 1:4 | grep '^r[0-9]' | cut -d'|' -f1 | diff -u expected-range-r1-r2-r4 -
"

printf 'r4 \nr2 \nr1 \n' > expected-range-r4-r2-r1

test_expect_success 'test descending revision range' "
git reset --hard trunk &&
git svn log -r 4:1 | grep '^r[0-9]' | cut -d'|' -f1 | diff -u expected-range-r4-r2-r1 -
"

printf 'r1 \nr2 \n' > expected-range-r1-r2

test_expect_success 'test ascending revision range with unreachable revision' "
git reset --hard trunk &&
git svn log -r 1:3 | grep '^r[0-9]' | cut -d'|' -f1 | diff -u expected-range-r1-r2 -
"

printf 'r2 \nr1 \n' > expected-range-r2-r1

test_expect_success 'test descending revision range with unreachable revision' "
git reset --hard trunk &&
git svn log -r 3:1 | grep '^r[0-9]' | cut -d'|' -f1 | diff -u expected-range-r2-r1 -
"

printf 'r2 \n' > expected-range-r2

test_expect_success 'test ascending revision range with unreachable upper boundary revision and 1 commit' "
git reset --hard trunk &&
git svn log -r 2:3 | grep '^r[0-9]' | cut -d'|' -f1 | diff -u expected-range-r2 -
"

test_expect_success 'test descending revision range with unreachable upper boundary revision and 1 commit' "
git reset --hard trunk &&
git svn log -r 3:2 | grep '^r[0-9]' | cut -d'|' -f1 | diff -u expected-range-r2 -
"

printf 'r4 \n' > expected-range-r4

test_expect_success 'test ascending revision range with unreachable lower boundary revision and 1 commit' "
git reset --hard trunk &&
git svn log -r 3:4 | grep '^r[0-9]' | cut -d'|' -f1 | diff -u expected-range-r4 -
"

test_expect_success 'test descending revision range with unreachable lower boundary revision and 1 commit' "
git reset --hard trunk &&
git svn log -r 4:3 | grep '^r[0-9]' | cut -d'|' -f1 | diff -u expected-range-r4 -
"

printf -- '------------------------------------------------------------------------\n' > expected-separator

test_expect_success 'test ascending revision range with unreachable boundary revisions and no commits' "
git reset --hard trunk &&
git svn log -r 5:6 | diff -u expected-separator -
"

test_expect_success 'test descending revision range with unreachable boundary revisions and no commits' "
git reset --hard trunk &&
git svn log -r 6:5 | diff -u expected-separator -
"

test_expect_success 'test ascending revision range with unreachable boundary revisions and 1 commit' "
git reset --hard trunk &&
git svn log -r 3:5 | grep '^r[0-9]' | cut -d'|' -f1 | diff -u expected-range-r4 -
"

test_expect_success 'test descending revision range with unreachable boundary revisions and 1 commit' "
git reset --hard trunk &&
git svn log -r 5:3 | grep '^r[0-9]' | cut -d'|' -f1 | diff -u expected-range-r4 -
"

test_done test_done
55 changes: 55 additions & 0 deletions t/t9117-git-svn-init-clone.sh
@@ -0,0 +1,55 @@
#!/bin/sh
#
# Copyright (c) 2007 Eric Wong
#

test_description='git-svn init/clone tests'

. ./lib-git-svn.sh

# setup, run inside tmp so we don't have any conflicts with $svnrepo
set -e
rm -r .git
mkdir tmp
cd tmp

test_expect_success 'setup svnrepo' "
mkdir project project/trunk project/branches project/tags &&
echo foo > project/trunk/foo &&
svn import -m '$test_description' project $svnrepo/project &&
rm -rf project
"

test_expect_success 'basic clone' "
test ! -d trunk &&
git svn clone $svnrepo/project/trunk &&
test -d trunk/.git/svn &&
test -e trunk/foo &&
rm -rf trunk
"

test_expect_success 'clone to target directory' "
test ! -d target &&
git svn clone $svnrepo/project/trunk target &&
test -d target/.git/svn &&
test -e target/foo &&
rm -rf target
"

test_expect_success 'clone with --stdlayout' "
test ! -d project &&
git svn clone -s $svnrepo/project &&
test -d project/.git/svn &&
test -e project/foo &&
rm -rf project
"

test_expect_success 'clone to target directory with --stdlayout' "
test ! -d target &&
git svn clone -s $svnrepo/project target &&
test -d target/.git/svn &&
test -e target/foo &&
rm -rf target
"

test_done

0 comments on commit 9716f21

Please sign in to comment.