From 2d0c8accc3fa7de75d7cbe732873ce5a57379020 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Sun, 31 Aug 2008 17:05:09 +0200 Subject: git-svn: extract base blob in generate_diff We need the base blob to compute a delta to be sent to the server. Signed-off-by: Florian Weimer Acked-by: Eric Wong diff --git a/git-svn.perl b/git-svn.perl index 7a1d26d..0479f41 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -3380,11 +3380,12 @@ sub generate_diff { while (<$diff_fh>) { chomp $_; # this gets rid of the trailing "\0" if ($state eq 'meta' && /^:(\d{6})\s(\d{6})\s - $::sha1\s($::sha1)\s + ($::sha1)\s($::sha1)\s ([MTCRAD])\d*$/xo) { push @mods, { mode_a => $1, mode_b => $2, - sha1_b => $3, chg => $4 }; - if ($4 =~ /^(?:C|R)$/) { + sha1_a => $3, sha1_b => $4, + chg => $5 }; + if ($5 =~ /^(?:C|R)$/) { $state = 'file_a'; } else { $state = 'file_b'; -- cgit v0.10.2-6-g49f6 From 214a34d22ec59ec7e1166772f06ecf8799f96c96 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Sun, 31 Aug 2008 17:45:04 +0200 Subject: git-svn: Introduce SVN::Git::Editor::_chg_file_get_blob Signed-off-by: Florian Weimer Acked-by: Eric Wong diff --git a/git-svn.perl b/git-svn.perl index 0479f41..2c3e13f 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -3663,28 +3663,35 @@ sub change_file_prop { $self->SUPER::change_file_prop($fbat, $pname, $pval, $self->{pool}); } -sub chg_file { - my ($self, $fbat, $m) = @_; - if ($m->{mode_b} =~ /755$/ && $m->{mode_a} !~ /755$/) { - $self->change_file_prop($fbat,'svn:executable','*'); - } elsif ($m->{mode_b} !~ /755$/ && $m->{mode_a} =~ /755$/) { - $self->change_file_prop($fbat,'svn:executable',undef); - } - my $fh = Git::temp_acquire('git_blob'); - if ($m->{mode_b} =~ /^120/) { +sub _chg_file_get_blob ($$$$) { + my ($self, $fbat, $m, $which) = @_; + my $fh = Git::temp_acquire("git_blob_$which"); + if ($m->{"mode_$which"} =~ /^120/) { print $fh 'link ' or croak $!; $self->change_file_prop($fbat,'svn:special','*'); - } elsif ($m->{mode_a} =~ /^120/ && $m->{mode_b} !~ /^120/) { + } elsif ($m->{mode_a} =~ /^120/ && $m->{"mode_$which"} !~ /^120/) { $self->change_file_prop($fbat,'svn:special',undef); } - my $size = $::_repository->cat_blob($m->{sha1_b}, $fh); - croak "Failed to read object $m->{sha1_b}" if ($size < 0); + my $blob = $m->{"sha1_$which"}; + return ($fh,) if ($blob =~ /^0{40}$/); + my $size = $::_repository->cat_blob($blob, $fh); + croak "Failed to read object $blob" if ($size < 0); $fh->flush == 0 or croak $!; seek $fh, 0, 0 or croak $!; my $exp = ::md5sum($fh); seek $fh, 0, 0 or croak $!; + return ($fh, $exp); +} +sub chg_file { + my ($self, $fbat, $m) = @_; + if ($m->{mode_b} =~ /755$/ && $m->{mode_a} !~ /755$/) { + $self->change_file_prop($fbat,'svn:executable','*'); + } elsif ($m->{mode_b} !~ /755$/ && $m->{mode_a} =~ /755$/) { + $self->change_file_prop($fbat,'svn:executable',undef); + } + my ($fh, $exp) = _chg_file_get_blob $self, $fbat, $m, 'b'; my $pool = SVN::Pool->new; my $atd = $self->apply_textdelta($fbat, undef, $pool); my $got = SVN::TxDelta::send_stream($fh, @$atd, $pool); -- cgit v0.10.2-6-g49f6 From 8598db935b653c638109aecab3e345c45d53af07 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Sun, 31 Aug 2008 17:47:09 +0200 Subject: git-svn: Send deltas during commits Signed-off-by: Florian Weimer Acked-by: Eric Wong diff --git a/git-svn.perl b/git-svn.perl index 2c3e13f..fdf4e4a 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -3691,12 +3691,20 @@ sub chg_file { } elsif ($m->{mode_b} !~ /755$/ && $m->{mode_a} =~ /755$/) { $self->change_file_prop($fbat,'svn:executable',undef); } - my ($fh, $exp) = _chg_file_get_blob $self, $fbat, $m, 'b'; + my ($fh_a, $exp_a) = _chg_file_get_blob $self, $fbat, $m, 'a'; + my ($fh_b, $exp_b) = _chg_file_get_blob $self, $fbat, $m, 'b'; my $pool = SVN::Pool->new; - my $atd = $self->apply_textdelta($fbat, undef, $pool); - my $got = SVN::TxDelta::send_stream($fh, @$atd, $pool); - die "Checksum mismatch\nexpected: $exp\ngot: $got\n" if ($got ne $exp); - Git::temp_release($fh, 1); + my $atd = $self->apply_textdelta($fbat, $exp_a, $pool); + if (-s $fh_a) { + my $txstream = SVN::TxDelta::new ($fh_a, $fh_b, $pool); + SVN::TxDelta::send_txstream($txstream, @$atd, $pool); + } else { + my $got = SVN::TxDelta::send_stream($fh_b, @$atd, $pool); + die "Checksum mismatch\nexpected: $exp_b\ngot: $got\n" + if ($got ne $exp_b); + } + Git::temp_release($fh_b, 1); + Git::temp_release($fh_a, 1); $pool->clear; } -- cgit v0.10.2-6-g49f6 From 991255c634500fe51a70aae6a8e7c8d7b73db0cc Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 31 Aug 2008 19:45:07 -0700 Subject: git-svn: check error code of send_txstream Not checking the error code of a function used to transform and send data makes me nervous. It currently returns "undef" on success; so die if we get any result other than "undef" because it's likely something went wrong somewhere. I really wish this function returned an MD5 like send_stream (or better yet, SHA1) for verification. Signed-off-by: Eric Wong diff --git a/git-svn.perl b/git-svn.perl index fdf4e4a..2d355c1 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -3697,7 +3697,11 @@ sub chg_file { my $atd = $self->apply_textdelta($fbat, $exp_a, $pool); if (-s $fh_a) { my $txstream = SVN::TxDelta::new ($fh_a, $fh_b, $pool); - SVN::TxDelta::send_txstream($txstream, @$atd, $pool); + my $res = SVN::TxDelta::send_txstream($txstream, @$atd, $pool); + if (defined $res) { + die "Unexpected result from send_txstream: $res\n", + "(SVN::Core::VERSION: $SVN::Core::VERSION)\n"; + } } else { my $got = SVN::TxDelta::send_stream($fh_b, @$atd, $pool); die "Checksum mismatch\nexpected: $exp_b\ngot: $got\n" -- cgit v0.10.2-6-g49f6 From 2cb611054a9597a00e9387c77e75d82e78982e60 Mon Sep 17 00:00:00 2001 From: Thomas Rast Date: Sun, 31 Aug 2008 15:50:59 +0200 Subject: git svn: catch lack of upstream info for dcommit earlier Since 711521e 'git svn dcommit' attempts to use the upstream information to determine the SVN URL, before it verifies that it even found an upstream. Move up the corresponding check. Signed-off-by: Thomas Rast Acked-by: Eric Wong diff --git a/git-svn.perl b/git-svn.perl index 2d355c1..484b4ab 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -421,15 +421,15 @@ sub cmd_dcommit { $head ||= 'HEAD'; my @refs; my ($url, $rev, $uuid, $gs) = working_head_info($head, \@refs); + unless ($gs) { + die "Unable to determine upstream SVN information from ", + "$head history.\nPerhaps the repository is empty."; + } $url = defined $_commit_url ? $_commit_url : $gs->full_url; my $last_rev = $_revision if defined $_revision; if ($url) { print "Committing to $url ...\n"; } - unless ($gs) { - die "Unable to determine upstream SVN information from ", - "$head history.\nPerhaps the repository is empty."; - } my ($linear_refs, $parents) = linearize_history($gs, \@refs); if ($_no_rebase && scalar(@$linear_refs) > 1) { warn "Attempting to commit more than one change while ", -- cgit v0.10.2-6-g49f6 From c9ab9ee47836b7c3d8a0c23f7b98c5f14da40c39 Mon Sep 17 00:00:00 2001 From: Thomas Rast Date: Tue, 26 Aug 2008 21:32:32 +0200 Subject: git svn info: tests: let 'init' test run with SVN 1.5 Signed-off-by: Thomas Rast Acked-by: Eric Wong diff --git a/t/t9119-git-svn-info.sh b/t/t9119-git-svn-info.sh index 5fd36a1..46676bc 100755 --- a/t/t9119-git-svn-info.sh +++ b/t/t9119-git-svn-info.sh @@ -9,9 +9,9 @@ test_description='git-svn info' set -e # Tested with: svn, version 1.4.4 (r25188) -v=`svn --version | sed -n -e 's/^svn, version \(1\.4\.[0-9]\).*$/\1/p'` +v=`svn --version | sed -n -e 's/^svn, version \(1\.[0-9]*\.[0-9]*\).*$/\1/p'` case $v in -1.4.*) +1.[45].*) ;; *) say "skipping svn-info test (SVN version: $v not supported)" -- cgit v0.10.2-6-g49f6 From e9a805aa2ac18621853271e33b9aef963bf4e272 Mon Sep 17 00:00:00 2001 From: Thomas Rast Date: Tue, 26 Aug 2008 21:32:33 +0200 Subject: git svn info: tests: do not use set -e Exiting in the middle of a test confuses the test suite, which will just say "FATAL: Unexpected exit with code 1" in response to a failed test, instead of actually diagnosing failure and continuing with the next test. Signed-off-by: Thomas Rast Acked-by: Eric Wong diff --git a/t/t9119-git-svn-info.sh b/t/t9119-git-svn-info.sh index 46676bc..a70f2b9 100755 --- a/t/t9119-git-svn-info.sh +++ b/t/t9119-git-svn-info.sh @@ -6,8 +6,6 @@ test_description='git-svn info' . ./lib-git-svn.sh -set -e - # Tested with: svn, version 1.4.4 (r25188) v=`svn --version | sed -n -e 's/^svn, version \(1\.[0-9]*\.[0-9]*\).*$/\1/p'` case $v in -- cgit v0.10.2-6-g49f6 From 67214c85af7245a1f75da968334c529ec2610e70 Mon Sep 17 00:00:00 2001 From: Thomas Rast Date: Tue, 26 Aug 2008 21:32:34 +0200 Subject: git svn info: tests: use test_cmp instead of git-diff git-diff does not appear to return the correct exit values, and gives a false success for more than half (!) of the tests due to the space in "trash directory" which git-svn fails to encode. Signed-off-by: Thomas Rast Acked-by: Eric Wong diff --git a/t/t9119-git-svn-info.sh b/t/t9119-git-svn-info.sh index a70f2b9..7798dcc 100755 --- a/t/t9119-git-svn-info.sh +++ b/t/t9119-git-svn-info.sh @@ -60,7 +60,7 @@ test_expect_success 'setup repository and import' ' test_expect_success 'info' " (cd svnwc; svn info) > expected.info && (cd gitwc; git-svn info) > actual.info && - git-diff expected.info actual.info + test_cmp expected.info actual.info " test_expect_success 'info --url' ' @@ -70,7 +70,7 @@ test_expect_success 'info --url' ' test_expect_success 'info .' " (cd svnwc; svn info .) > expected.info-dot && (cd gitwc; git-svn info .) > actual.info-dot && - git-diff expected.info-dot actual.info-dot + test_cmp expected.info-dot actual.info-dot " test_expect_success 'info --url .' ' @@ -80,7 +80,7 @@ test_expect_success 'info --url .' ' test_expect_success 'info file' " (cd svnwc; svn info file) > expected.info-file && (cd gitwc; git-svn info file) > actual.info-file && - git-diff expected.info-file actual.info-file + test_cmp expected.info-file actual.info-file " test_expect_success 'info --url file' ' @@ -90,7 +90,7 @@ test_expect_success 'info --url file' ' test_expect_success 'info directory' " (cd svnwc; svn info directory) > expected.info-directory && (cd gitwc; git-svn info directory) > actual.info-directory && - git-diff expected.info-directory actual.info-directory + test_cmp expected.info-directory actual.info-directory " test_expect_success 'info --url directory' ' @@ -100,7 +100,7 @@ test_expect_success 'info --url directory' ' test_expect_success 'info symlink-file' " (cd svnwc; svn info symlink-file) > expected.info-symlink-file && (cd gitwc; git-svn info symlink-file) > actual.info-symlink-file && - git-diff expected.info-symlink-file actual.info-symlink-file + test_cmp expected.info-symlink-file actual.info-symlink-file " test_expect_success 'info --url symlink-file' ' @@ -113,7 +113,7 @@ test_expect_success 'info symlink-directory' " > expected.info-symlink-directory && (cd gitwc; git-svn info symlink-directory) \ > actual.info-symlink-directory && - git-diff expected.info-symlink-directory actual.info-symlink-directory + test_cmp expected.info-symlink-directory actual.info-symlink-directory " test_expect_success 'info --url symlink-directory' ' @@ -133,7 +133,7 @@ test_expect_success 'info added-file' " cd .. && (cd svnwc; svn info added-file) > expected.info-added-file && (cd gitwc; git-svn info added-file) > actual.info-added-file && - git-diff expected.info-added-file actual.info-added-file + test_cmp expected.info-added-file actual.info-added-file " test_expect_success 'info --url added-file' ' @@ -155,7 +155,7 @@ test_expect_success 'info added-directory' " > expected.info-added-directory && (cd gitwc; git-svn info added-directory) \ > actual.info-added-directory && - git-diff expected.info-added-directory actual.info-added-directory + test_cmp expected.info-added-directory actual.info-added-directory " test_expect_success 'info --url added-directory' ' @@ -177,7 +177,7 @@ test_expect_success 'info added-symlink-file' " > expected.info-added-symlink-file && (cd gitwc; git-svn info added-symlink-file) \ > actual.info-added-symlink-file && - git-diff expected.info-added-symlink-file \ + test_cmp expected.info-added-symlink-file \ actual.info-added-symlink-file " @@ -200,7 +200,7 @@ test_expect_success 'info added-symlink-directory' " > expected.info-added-symlink-directory && (cd gitwc; git-svn info added-symlink-directory) \ > actual.info-added-symlink-directory && - git-diff expected.info-added-symlink-directory \ + test_cmp expected.info-added-symlink-directory \ actual.info-added-symlink-directory " @@ -227,7 +227,7 @@ test_expect_success 'info deleted-file' " (cd gitwc; git-svn info file) | sed -e 's/^\(Text Last Updated:\).*/\1 TEXT-LAST-UPDATED-STRING/' \ > actual.info-deleted-file && - git-diff expected.info-deleted-file actual.info-deleted-file + test_cmp expected.info-deleted-file actual.info-deleted-file " test_expect_success 'info --url file (deleted)' ' @@ -248,7 +248,7 @@ test_expect_success 'info deleted-directory' " (cd gitwc; git-svn info directory) | sed -e 's/^\(Text Last Updated:\).*/\1 TEXT-LAST-UPDATED-STRING/' \ > actual.info-deleted-directory && - git-diff expected.info-deleted-directory actual.info-deleted-directory + test_cmp expected.info-deleted-directory actual.info-deleted-directory " test_expect_success 'info --url directory (deleted)' ' @@ -269,7 +269,7 @@ test_expect_success 'info deleted-symlink-file' " (cd gitwc; git-svn info symlink-file) | sed -e 's/^\(Text Last Updated:\).*/\1 TEXT-LAST-UPDATED-STRING/' \ > actual.info-deleted-symlink-file && - git-diff expected.info-deleted-symlink-file \ + test_cmp expected.info-deleted-symlink-file \ actual.info-deleted-symlink-file " @@ -291,7 +291,7 @@ test_expect_success 'info deleted-symlink-directory' " (cd gitwc; git-svn info symlink-directory) | sed -e 's/^\(Text Last Updated:\).*/\1 TEXT-LAST-UPDATED-STRING/' \ > actual.info-deleted-symlink-directory && - git-diff expected.info-deleted-symlink-directory \ + test_cmp expected.info-deleted-symlink-directory \ actual.info-deleted-symlink-directory " @@ -309,13 +309,13 @@ test_expect_success 'info unknown-file' " ptouch gitwc/unknown-file svnwc/unknown-file && (cd svnwc; svn info unknown-file) 2> expected.info-unknown-file && (cd gitwc; git-svn info unknown-file) 2> actual.info-unknown-file && - git-diff expected.info-unknown-file actual.info-unknown-file + test_cmp expected.info-unknown-file actual.info-unknown-file " test_expect_success 'info --url unknown-file' ' test -z "$(cd gitwc; git-svn info --url unknown-file \ 2> ../actual.info--url-unknown-file)" && - git-diff expected.info-unknown-file actual.info--url-unknown-file + test_cmp expected.info-unknown-file actual.info--url-unknown-file ' test_expect_success 'info unknown-directory' " @@ -326,13 +326,13 @@ test_expect_success 'info unknown-directory' " 2> expected.info-unknown-directory && (cd gitwc; git-svn info unknown-directory) \ 2> actual.info-unknown-directory && - git-diff expected.info-unknown-directory actual.info-unknown-directory + test_cmp expected.info-unknown-directory actual.info-unknown-directory " test_expect_success 'info --url unknown-directory' ' test -z "$(cd gitwc; git-svn info --url unknown-directory \ 2> ../actual.info--url-unknown-directory)" && - git-diff expected.info-unknown-directory \ + test_cmp expected.info-unknown-directory \ actual.info--url-unknown-directory ' @@ -348,14 +348,14 @@ test_expect_success 'info unknown-symlink-file' " 2> expected.info-unknown-symlink-file && (cd gitwc; git-svn info unknown-symlink-file) \ 2> actual.info-unknown-symlink-file && - git-diff expected.info-unknown-symlink-file \ + test_cmp expected.info-unknown-symlink-file \ actual.info-unknown-symlink-file " test_expect_success 'info --url unknown-symlink-file' ' test -z "$(cd gitwc; git-svn info --url unknown-symlink-file \ 2> ../actual.info--url-unknown-symlink-file)" && - git-diff expected.info-unknown-symlink-file \ + test_cmp expected.info-unknown-symlink-file \ actual.info--url-unknown-symlink-file ' @@ -372,14 +372,14 @@ test_expect_success 'info unknown-symlink-directory' " 2> expected.info-unknown-symlink-directory && (cd gitwc; git-svn info unknown-symlink-directory) \ 2> actual.info-unknown-symlink-directory && - git-diff expected.info-unknown-symlink-directory \ + test_cmp expected.info-unknown-symlink-directory \ actual.info-unknown-symlink-directory " test_expect_success 'info --url unknown-symlink-directory' ' test -z "$(cd gitwc; git-svn info --url unknown-symlink-directory \ 2> ../actual.info--url-unknown-symlink-directory)" && - git-diff expected.info-unknown-symlink-directory \ + test_cmp expected.info-unknown-symlink-directory \ actual.info--url-unknown-symlink-directory ' -- cgit v0.10.2-6-g49f6 From 8d5100c7a81e7f638241b5af957e05216cd56579 Mon Sep 17 00:00:00 2001 From: Thomas Rast Date: Tue, 26 Aug 2008 21:32:35 +0200 Subject: git svn info: tests: fix ptouch argument order in setup The arguments must be , otherwise it fails to update the timestamps (without setting a failure exit code) and results in bad test output later on. Signed-off-by: Thomas Rast Acked-by: Eric Wong diff --git a/t/t9119-git-svn-info.sh b/t/t9119-git-svn-info.sh index 7798dcc..821507d 100755 --- a/t/t9119-git-svn-info.sh +++ b/t/t9119-git-svn-info.sh @@ -51,10 +51,10 @@ test_expect_success 'setup repository and import' ' git-svn fetch && cd .. && svn co "$svnrepo" svnwc && - ptouch svnwc/file gitwc/file && - ptouch svnwc/directory gitwc/directory && - ptouch svnwc/symlink-file gitwc/symlink-file && - ptouch svnwc/symlink-directory gitwc/symlink-directory + ptouch gitwc/file svnwc/file && + ptouch gitwc/directory svnwc/directory && + ptouch gitwc/symlink-file svnwc/symlink-file && + ptouch gitwc/symlink-directory svnwc/symlink-directory ' test_expect_success 'info' " -- cgit v0.10.2-6-g49f6 From edde9112abd1ef5f4565468e8a9a500e0c03f900 Mon Sep 17 00:00:00 2001 From: Thomas Rast Date: Tue, 26 Aug 2008 21:32:36 +0200 Subject: git svn info: make info relative to the current directory Previously 'git svn info ' would always treat the as relative to the working directory root, with a default of ".". This does not match the behaviour of 'svn info'. Prepend $(git rev-parse --show-prefix) to the path used inside cmd_info to make it relative to the current working directory. Signed-off-by: Thomas Rast Acked-by: Eric Wong diff --git a/git-svn.perl b/git-svn.perl index 484b4ab..5e61dd9 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -805,6 +805,7 @@ sub cmd_commit_diff { sub cmd_info { my $path = canonicalize_path(defined($_[0]) ? $_[0] : "."); + my $fullpath = canonicalize_path($cmd_dir_prefix . $path); if (exists $_[1]) { die "Too many arguments specified\n"; } @@ -825,7 +826,7 @@ sub cmd_info { # canonicalize_path() will return "" to make libsvn 1.5.x happy, $path = "." if $path eq ""; - my $full_url = $url . ($path eq "." ? "" : "/$path"); + my $full_url = $url . ($fullpath eq "" ? "" : "/$fullpath"); if ($_url) { print $full_url, "\n"; @@ -861,7 +862,7 @@ sub cmd_info { } my ($lc_author, $lc_rev, $lc_date_utc); - my @args = Git::SVN::Log::git_svn_log_cmd($rev, $rev, "--", $path); + my @args = Git::SVN::Log::git_svn_log_cmd($rev, $rev, "--", $fullpath); my $log = command_output_pipe(@args); my $esc_color = qr/(?:\033\[(?:(?:\d+;)*\d*)?m)*/; while (<$log>) { diff --git a/t/t9119-git-svn-info.sh b/t/t9119-git-svn-info.sh index 821507d..8709bcc 100755 --- a/t/t9119-git-svn-info.sh +++ b/t/t9119-git-svn-info.sh @@ -45,12 +45,18 @@ test_expect_success 'setup repository and import' ' ln -s directory symlink-directory && svn import -m "initial" . "$svnrepo" && cd .. && + svn co "$svnrepo" svnwc && + cd svnwc && + echo foo > foo && + svn add foo && + svn commit -m "change outside directory" && + svn update && + cd .. && mkdir gitwc && cd gitwc && git-svn init "$svnrepo" && git-svn fetch && cd .. && - svn co "$svnrepo" svnwc && ptouch gitwc/file svnwc/file && ptouch gitwc/directory svnwc/directory && ptouch gitwc/symlink-file svnwc/symlink-file && @@ -93,6 +99,12 @@ test_expect_success 'info directory' " test_cmp expected.info-directory actual.info-directory " +test_expect_success 'info inside directory' " + (cd svnwc/directory; svn info) > expected.info-inside-directory && + (cd gitwc/directory; git-svn info) > actual.info-inside-directory && + test_cmp expected.info-inside-directory actual.info-inside-directory + " + test_expect_success 'info --url directory' ' test "$(cd gitwc; git-svn info --url directory)" = "$svnrepo/directory" ' -- cgit v0.10.2-6-g49f6 From 05427b91f0b5e45688cbea21faf0f2d79ec07b21 Mon Sep 17 00:00:00 2001 From: Thomas Rast Date: Tue, 26 Aug 2008 21:32:37 +0200 Subject: git svn info: always quote URLs in 'info' output Changes 'git svn info' to always URL-escape the 'URL' and 'Repository' fields and --url output, like SVN (at least 1.5) does. Note that reusing the escape_url() further down in Git::SVN::Ra is not possible because it only triggers for http(s) URLs. I did not know whether extending it to all schemes would break SVN access anywhere, so I made a new one that quotes in all schemes. Signed-off-by: Thomas Rast Acked-by: Eric Wong diff --git a/git-svn.perl b/git-svn.perl index 5e61dd9..42d0679 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -803,6 +803,25 @@ sub cmd_commit_diff { } } +sub escape_uri_only { + my ($uri) = @_; + my @tmp; + foreach (split m{/}, $uri) { + s/([^\w.%+-]|%(?![a-fA-F0-9]{2}))/sprintf("%%%02X",ord($1))/eg; + push @tmp, $_; + } + join('/', @tmp); +} + +sub escape_url { + my ($url) = @_; + if ($url =~ m#^([^:]+)://([^/]*)(.*)$#) { + my ($scheme, $domain, $uri) = ($1, $2, escape_uri_only($3)); + $url = "$scheme://$domain$uri"; + } + $url; +} + sub cmd_info { my $path = canonicalize_path(defined($_[0]) ? $_[0] : "."); my $fullpath = canonicalize_path($cmd_dir_prefix . $path); @@ -829,18 +848,18 @@ sub cmd_info { my $full_url = $url . ($fullpath eq "" ? "" : "/$fullpath"); if ($_url) { - print $full_url, "\n"; + print escape_url($full_url), "\n"; return; } my $result = "Path: $path\n"; $result .= "Name: " . basename($path) . "\n" if $file_type ne "dir"; - $result .= "URL: " . $full_url . "\n"; + $result .= "URL: " . escape_url($full_url) . "\n"; eval { my $repos_root = $gs->repos_root; Git::SVN::remove_username($repos_root); - $result .= "Repository Root: $repos_root\n"; + $result .= "Repository Root: " . escape_url($repos_root) . "\n"; }; if ($@) { $result .= "Repository Root: (offline)\n"; diff --git a/t/t9119-git-svn-info.sh b/t/t9119-git-svn-info.sh index 8709bcc..1811010 100755 --- a/t/t9119-git-svn-info.sh +++ b/t/t9119-git-svn-info.sh @@ -34,6 +34,8 @@ ptouch() { ' "`svn info $2 | grep '^Text Last Updated:'`" "$1" } +quoted_svnrepo="$(echo $svnrepo | sed 's/ /%20/')" + test_expect_success 'setup repository and import' ' mkdir info && cd info && @@ -70,7 +72,7 @@ test_expect_success 'info' " " test_expect_success 'info --url' ' - test "$(cd gitwc; git-svn info --url)" = "$svnrepo" + test "$(cd gitwc; git-svn info --url)" = "$quoted_svnrepo" ' test_expect_success 'info .' " @@ -80,7 +82,7 @@ test_expect_success 'info .' " " test_expect_success 'info --url .' ' - test "$(cd gitwc; git-svn info --url .)" = "$svnrepo" + test "$(cd gitwc; git-svn info --url .)" = "$quoted_svnrepo" ' test_expect_success 'info file' " @@ -90,7 +92,7 @@ test_expect_success 'info file' " " test_expect_success 'info --url file' ' - test "$(cd gitwc; git-svn info --url file)" = "$svnrepo/file" + test "$(cd gitwc; git-svn info --url file)" = "$quoted_svnrepo/file" ' test_expect_success 'info directory' " @@ -106,7 +108,7 @@ test_expect_success 'info inside directory' " " test_expect_success 'info --url directory' ' - test "$(cd gitwc; git-svn info --url directory)" = "$svnrepo/directory" + test "$(cd gitwc; git-svn info --url directory)" = "$quoted_svnrepo/directory" ' test_expect_success 'info symlink-file' " @@ -117,7 +119,7 @@ test_expect_success 'info symlink-file' " test_expect_success 'info --url symlink-file' ' test "$(cd gitwc; git-svn info --url symlink-file)" \ - = "$svnrepo/symlink-file" + = "$quoted_svnrepo/symlink-file" ' test_expect_success 'info symlink-directory' " @@ -130,7 +132,7 @@ test_expect_success 'info symlink-directory' " test_expect_success 'info --url symlink-directory' ' test "$(cd gitwc; git-svn info --url symlink-directory)" \ - = "$svnrepo/symlink-directory" + = "$quoted_svnrepo/symlink-directory" ' test_expect_success 'info added-file' " @@ -150,7 +152,7 @@ test_expect_success 'info added-file' " test_expect_success 'info --url added-file' ' test "$(cd gitwc; git-svn info --url added-file)" \ - = "$svnrepo/added-file" + = "$quoted_svnrepo/added-file" ' test_expect_success 'info added-directory' " @@ -172,7 +174,7 @@ test_expect_success 'info added-directory' " test_expect_success 'info --url added-directory' ' test "$(cd gitwc; git-svn info --url added-directory)" \ - = "$svnrepo/added-directory" + = "$quoted_svnrepo/added-directory" ' test_expect_success 'info added-symlink-file' " @@ -195,7 +197,7 @@ test_expect_success 'info added-symlink-file' " test_expect_success 'info --url added-symlink-file' ' test "$(cd gitwc; git-svn info --url added-symlink-file)" \ - = "$svnrepo/added-symlink-file" + = "$quoted_svnrepo/added-symlink-file" ' test_expect_success 'info added-symlink-directory' " @@ -218,7 +220,7 @@ test_expect_success 'info added-symlink-directory' " test_expect_success 'info --url added-symlink-directory' ' test "$(cd gitwc; git-svn info --url added-symlink-directory)" \ - = "$svnrepo/added-symlink-directory" + = "$quoted_svnrepo/added-symlink-directory" ' # The next few tests replace the "Text Last Updated" value with a @@ -244,7 +246,7 @@ test_expect_success 'info deleted-file' " test_expect_success 'info --url file (deleted)' ' test "$(cd gitwc; git-svn info --url file)" \ - = "$svnrepo/file" + = "$quoted_svnrepo/file" ' test_expect_success 'info deleted-directory' " @@ -265,7 +267,7 @@ test_expect_success 'info deleted-directory' " test_expect_success 'info --url directory (deleted)' ' test "$(cd gitwc; git-svn info --url directory)" \ - = "$svnrepo/directory" + = "$quoted_svnrepo/directory" ' test_expect_success 'info deleted-symlink-file' " @@ -287,7 +289,7 @@ test_expect_success 'info deleted-symlink-file' " test_expect_success 'info --url symlink-file (deleted)' ' test "$(cd gitwc; git-svn info --url symlink-file)" \ - = "$svnrepo/symlink-file" + = "$quoted_svnrepo/symlink-file" ' test_expect_success 'info deleted-symlink-directory' " @@ -309,7 +311,7 @@ test_expect_success 'info deleted-symlink-directory' " test_expect_success 'info --url symlink-directory (deleted)' ' test "$(cd gitwc; git-svn info --url symlink-directory)" \ - = "$svnrepo/symlink-directory" + = "$quoted_svnrepo/symlink-directory" ' # NOTE: git does not have the concept of replaced objects, -- cgit v0.10.2-6-g49f6 From 2cf3e3ac02c42cf0ba9299589db644beb395c4c5 Mon Sep 17 00:00:00 2001 From: Thomas Rast Date: Fri, 29 Aug 2008 15:42:48 +0200 Subject: git-svn: match SVN 1.5 behaviour of info' on unknown item Previously 'git svn info unknown-file' only announced its failure (in the SVN 1.4 style, "not a versioned resource"), and exited successfully. It is desirable to actually exit with failure, so change the code to exit(1) under this condition. Since that is already halfway SVN 1.5 compatibility, also change the error output to match 1.5. Signed-off-by: Thomas Rast Acked-by: Eric Wong diff --git a/git-svn.perl b/git-svn.perl index 42d0679..2cc6487 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -832,8 +832,8 @@ sub cmd_info { my ($file_type, $diff_status) = find_file_type_and_diff_status($path); if (!$file_type && !$diff_status) { - print STDERR "$path: (Not a versioned resource)\n\n"; - return; + print STDERR "svn: '$path' is not under version control\n"; + exit 1; } my ($url, $rev, $uuid, $gs) = working_head_info('HEAD'); -- cgit v0.10.2-6-g49f6 From 4457d4f767f0744e7936be449c3d25c507b7591a Mon Sep 17 00:00:00 2001 From: Thomas Rast Date: Fri, 29 Aug 2008 15:42:49 +0200 Subject: git-svn: fix 'info' tests for unknown items The previous tests all expected the results from SVN and Git to be identical, and expected both to return success. This cannot be guaranteed: SVN changed the message style between 1.4 and 1.5, and in 1.5, sets a failure exit code. Change the tests to verify that 'git svn info ' sets a failure exit code, and that its output contains the file name. This should hopefully catch all other errors. Signed-off-by: Thomas Rast Acked-by: Eric Wong diff --git a/t/t9119-git-svn-info.sh b/t/t9119-git-svn-info.sh index 1811010..3e48459 100755 --- a/t/t9119-git-svn-info.sh +++ b/t/t9119-git-svn-info.sh @@ -319,82 +319,59 @@ test_expect_success 'info --url symlink-directory (deleted)' ' test_expect_success 'info unknown-file' " echo two > gitwc/unknown-file && - cp gitwc/unknown-file svnwc/unknown-file && - ptouch gitwc/unknown-file svnwc/unknown-file && - (cd svnwc; svn info unknown-file) 2> expected.info-unknown-file && - (cd gitwc; git-svn info unknown-file) 2> actual.info-unknown-file && - test_cmp expected.info-unknown-file actual.info-unknown-file + (cd gitwc; test_must_fail git-svn info unknown-file) \ + 2> actual.info-unknown-file && + grep unknown-file actual.info-unknown-file " test_expect_success 'info --url unknown-file' ' - test -z "$(cd gitwc; git-svn info --url unknown-file \ - 2> ../actual.info--url-unknown-file)" && - test_cmp expected.info-unknown-file actual.info--url-unknown-file + echo two > gitwc/unknown-file && + (cd gitwc; test_must_fail git-svn info --url unknown-file) \ + 2> actual.info-url-unknown-file && + grep unknown-file actual.info-url-unknown-file ' test_expect_success 'info unknown-directory' " mkdir gitwc/unknown-directory svnwc/unknown-directory && - ptouch gitwc/unknown-directory svnwc/unknown-directory && - touch gitwc/unknown-directory/.placeholder && - (cd svnwc; svn info unknown-directory) \ - 2> expected.info-unknown-directory && - (cd gitwc; git-svn info unknown-directory) \ - 2> actual.info-unknown-directory && - test_cmp expected.info-unknown-directory actual.info-unknown-directory + (cd gitwc; test_must_fail git-svn info unknown-directory) \ + 2> actual.info-unknown-directory && + grep unknown-directory actual.info-unknown-directory " test_expect_success 'info --url unknown-directory' ' - test -z "$(cd gitwc; git-svn info --url unknown-directory \ - 2> ../actual.info--url-unknown-directory)" && - test_cmp expected.info-unknown-directory \ - actual.info--url-unknown-directory + (cd gitwc; test_must_fail git-svn info --url unknown-directory) \ + 2> actual.info-url-unknown-directory && + grep unknown-directory actual.info-url-unknown-directory ' test_expect_success 'info unknown-symlink-file' " cd gitwc && ln -s unknown-file unknown-symlink-file && cd .. && - cd svnwc && - ln -s unknown-file unknown-symlink-file && - cd .. && - ptouch gitwc/unknown-symlink-file svnwc/unknown-symlink-file && - (cd svnwc; svn info unknown-symlink-file) \ - 2> expected.info-unknown-symlink-file && - (cd gitwc; git-svn info unknown-symlink-file) \ - 2> actual.info-unknown-symlink-file && - test_cmp expected.info-unknown-symlink-file \ - actual.info-unknown-symlink-file + (cd gitwc; test_must_fail git-svn info unknown-symlink-file) \ + 2> actual.info-unknown-symlink-file && + grep unknown-symlink-file actual.info-unknown-symlink-file " test_expect_success 'info --url unknown-symlink-file' ' - test -z "$(cd gitwc; git-svn info --url unknown-symlink-file \ - 2> ../actual.info--url-unknown-symlink-file)" && - test_cmp expected.info-unknown-symlink-file \ - actual.info--url-unknown-symlink-file + (cd gitwc; test_must_fail git-svn info --url unknown-symlink-file) \ + 2> actual.info-url-unknown-symlink-file && + grep unknown-symlink-file actual.info-url-unknown-symlink-file ' test_expect_success 'info unknown-symlink-directory' " cd gitwc && ln -s unknown-directory unknown-symlink-directory && cd .. && - cd svnwc && - ln -s unknown-directory unknown-symlink-directory && - cd .. && - ptouch gitwc/unknown-symlink-directory \ - svnwc/unknown-symlink-directory && - (cd svnwc; svn info unknown-symlink-directory) \ - 2> expected.info-unknown-symlink-directory && - (cd gitwc; git-svn info unknown-symlink-directory) \ - 2> actual.info-unknown-symlink-directory && - test_cmp expected.info-unknown-symlink-directory \ - actual.info-unknown-symlink-directory + (cd gitwc; test_must_fail git-svn info unknown-symlink-directory) \ + 2> actual.info-unknown-symlink-directory && + grep unknown-symlink-directory actual.info-unknown-symlink-directory " test_expect_success 'info --url unknown-symlink-directory' ' - test -z "$(cd gitwc; git-svn info --url unknown-symlink-directory \ - 2> ../actual.info--url-unknown-symlink-directory)" && - test_cmp expected.info-unknown-symlink-directory \ - actual.info--url-unknown-symlink-directory + (cd gitwc; test_must_fail git-svn info --url unknown-symlink-directory) \ + 2> actual.info-url-unknown-symlink-directory && + grep unknown-symlink-directory actual.info-url-unknown-symlink-directory ' test_done -- cgit v0.10.2-6-g49f6 From a786091b4a487bc08bbff4864717cf5d8383e983 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 6 Sep 2008 18:29:12 -0700 Subject: t9124: clean up chdir usage Spawn subshells when running things in subdirectories instead of chdir-ing to the path of an undefined variable, which is confusing. Signed-off-by: Eric Wong diff --git a/t/t9124-git-svn-dcommit-auto-props.sh b/t/t9124-git-svn-dcommit-auto-props.sh index 8223c59..54276bf 100755 --- a/t/t9124-git-svn-dcommit-auto-props.sh +++ b/t/t9124-git-svn-dcommit-auto-props.sh @@ -29,13 +29,11 @@ test_expect_success 'initialize git-svn' ' ' test_expect_success 'enable auto-props config' ' - cd "$gittestrepo" && mkdir user && generate_auto_props yes >user/config ' test_expect_success 'add files matching auto-props' ' - cd "$gittestrepo" && echo "#!$SHELL_PATH" >exec1.sh && chmod +x exec1.sh && echo "hello" >hello.txt && @@ -46,12 +44,10 @@ test_expect_success 'add files matching auto-props' ' ' test_expect_success 'disable auto-props config' ' - cd "$gittestrepo" && generate_auto_props no >user/config ' test_expect_success 'add files matching disabled auto-props' ' - cd "$gittestrepo" && echo "#$SHELL_PATH" >exec2.sh && chmod +x exec2.sh && echo "world" >world.txt && @@ -62,6 +58,7 @@ test_expect_success 'add files matching disabled auto-props' ' ' test_expect_success 'check resulting svn repository' ' +( mkdir work && cd work && svn co "$svnrepo" && @@ -81,6 +78,7 @@ test_expect_success 'check resulting svn repository' ' test "x$(svn propget svn:mime-type world.txt)" = "x" && test "x$(svn propget svn:eol-style world.txt)" = "x" && test "x$(svn propget svn:mime-type zot)" = "x" +) ' test_done -- cgit v0.10.2-6-g49f6 From 7c4d0219cf9ab6a7738a09ad7fec72d5e9f2ac67 Mon Sep 17 00:00:00 2001 From: Paul Talacko Date: Sat, 6 Sep 2008 18:50:38 -0700 Subject: git-svn: set auto_props when renaming files Patch-by: Paul Talacko : > Hello, > > There's an issue in git-svn as autoprops are not applied to > renamed files, only to added files. > > This patch fixes the bug. [ew: added test case] Signed-off-by: Eric Wong diff --git a/git-svn.perl b/git-svn.perl index 2cc6487..ee3f5ed 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -3657,6 +3657,7 @@ sub R { my $fbat = $self->add_file($self->repo_path($m->{file_b}), $pbat, $self->url_path($m->{file_a}), $self->{r}); print "\tR\t$m->{file_a} => $m->{file_b}\n" unless $::_q; + $self->apply_autoprops($file, $fbat); $self->chg_file($fbat, $m); $self->close_file($fbat,undef,$self->{pool}); diff --git a/t/t9124-git-svn-dcommit-auto-props.sh b/t/t9124-git-svn-dcommit-auto-props.sh index 54276bf..31193a3 100755 --- a/t/t9124-git-svn-dcommit-auto-props.sh +++ b/t/t9124-git-svn-dcommit-auto-props.sh @@ -81,4 +81,21 @@ test_expect_success 'check resulting svn repository' ' ) ' +test_expect_success 'check renamed file' ' + test -d user && + generate_auto_props yes > user/config && + git mv foo foo.sh && + git commit -m "foo => foo.sh" && + git svn dcommit --config-dir=user && + ( + cd work/svnrepo && + svn up && + test ! -e foo && + test -e foo.sh && + test "x$(svn propget svn:mime-type foo.sh)" = \ + "xapplication/x-shellscript" && + test "x$(svn propget svn:eol-style foo.sh)" = "xLF" + ) +' + test_done -- cgit v0.10.2-6-g49f6