Skip to content

Commit 675fff4

Browse files
committed
Merge branch 'master' of git://bogomips.org/git-svn
* 'master' of git://bogomips.org/git-svn: git-svn.perl: fix a false-positive in the "already exists" test git-svn.perl: perform deletions before anything else git-svn: Fix time zone in --localtime git-svn: un-break "git svn rebase" when log.abbrevCommit=true git-svn: remove redundant porcelain option to rev-list completion: add --interactive option to git svn dcommit
2 parents bd444ca + 379862e commit 675fff4

File tree

3 files changed

+59
-44
lines changed

3 files changed

+59
-44
lines changed

contrib/completion/git-completion.bash

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2512,7 +2512,7 @@ _git_svn ()
25122512
__gitcomp "
25132513
--merge --strategy= --verbose --dry-run
25142514
--fetch-all --no-rebase --commit-url
2515-
--revision $cmt_opts $fc_opts
2515+
--revision --interactive $cmt_opts $fc_opts
25162516
"
25172517
;;
25182518
set-tree,--*)

git-svn.perl

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1878,8 +1878,7 @@ sub cmt_sha2rev_batch {
18781878

18791879
sub working_head_info {
18801880
my ($head, $refs) = @_;
1881-
my @args = qw/log --no-color --no-decorate --first-parent
1882-
--pretty=medium/;
1881+
my @args = qw/rev-list --first-parent --pretty=medium/;
18831882
my ($fh, $ctx) = command_output_pipe(@args, $head);
18841883
my $hash;
18851884
my %max;
@@ -2029,6 +2028,7 @@ package Git::SVN;
20292028
use File::Path qw/mkpath/;
20302029
use File::Copy qw/copy/;
20312030
use IPC::Open3;
2031+
use Time::Local;
20322032
use Memoize; # core since 5.8.0, Jul 2002
20332033
use Memoize::Storable;
20342034

@@ -3287,6 +3287,14 @@ sub get_untracked {
32873287
\@out;
32883288
}
32893289

3290+
sub get_tz {
3291+
# some systmes don't handle or mishandle %z, so be creative.
3292+
my $t = shift || time;
3293+
my $gm = timelocal(gmtime($t));
3294+
my $sign = qw( + + - )[ $t <=> $gm ];
3295+
return sprintf("%s%02d%02d", $sign, (gmtime(abs($t - $gm)))[2,1]);
3296+
}
3297+
32903298
# parse_svn_date(DATE)
32913299
# --------------------
32923300
# Given a date (in UTC) from Subversion, return a string in the format
@@ -3319,8 +3327,7 @@ sub parse_svn_date {
33193327
delete $ENV{TZ};
33203328
}
33213329

3322-
my $our_TZ =
3323-
POSIX::strftime('%Z', $S, $M, $H, $d, $m - 1, $Y - 1900);
3330+
my $our_TZ = get_tz();
33243331

33253332
# This converts $epoch_in_UTC into our local timezone.
33263333
my ($sec, $min, $hour, $mday, $mon, $year,
@@ -3920,7 +3927,7 @@ sub rebuild {
39203927
my ($base_rev, $head) = ($partial ? $self->rev_map_max_norebuild(1) :
39213928
(undef, undef));
39223929
my ($log, $ctx) =
3923-
command_output_pipe(qw/rev-list --pretty=raw --no-color --reverse/,
3930+
command_output_pipe(qw/rev-list --pretty=raw --reverse/,
39243931
($head ? "$head.." : "") . $self->refname,
39253932
'--');
39263933
my $metadata_url = $self->metadata_url;
@@ -5130,7 +5137,7 @@ sub rmdirs {
51305137
}
51315138

51325139
sub open_or_add_dir {
5133-
my ($self, $full_path, $baton) = @_;
5140+
my ($self, $full_path, $baton, $deletions) = @_;
51345141
my $t = $self->{types}->{$full_path};
51355142
if (!defined $t) {
51365143
die "$full_path not known in r$self->{r} or we have a bug!\n";
@@ -5139,7 +5146,7 @@ sub open_or_add_dir {
51395146
no warnings 'once';
51405147
# SVN::Node::none and SVN::Node::file are used only once,
51415148
# so we're shutting up Perl's warnings about them.
5142-
if ($t == $SVN::Node::none) {
5149+
if ($t == $SVN::Node::none || defined($deletions->{$full_path})) {
51435150
return $self->add_directory($full_path, $baton,
51445151
undef, -1, $self->{pool});
51455152
} elsif ($t == $SVN::Node::dir) {
@@ -5154,17 +5161,18 @@ sub open_or_add_dir {
51545161
}
51555162

51565163
sub ensure_path {
5157-
my ($self, $path) = @_;
5164+
my ($self, $path, $deletions) = @_;
51585165
my $bat = $self->{bat};
51595166
my $repo_path = $self->repo_path($path);
51605167
return $bat->{''} unless (length $repo_path);
5168+
51615169
my @p = split m#/+#, $repo_path;
51625170
my $c = shift @p;
5163-
$bat->{$c} ||= $self->open_or_add_dir($c, $bat->{''});
5171+
$bat->{$c} ||= $self->open_or_add_dir($c, $bat->{''}, $deletions);
51645172
while (@p) {
51655173
my $c0 = $c;
51665174
$c .= '/' . shift @p;
5167-
$bat->{$c} ||= $self->open_or_add_dir($c, $bat->{$c0});
5175+
$bat->{$c} ||= $self->open_or_add_dir($c, $bat->{$c0}, $deletions);
51685176
}
51695177
return $bat->{$c};
51705178
}
@@ -5221,9 +5229,9 @@ sub apply_autoprops {
52215229
}
52225230

52235231
sub A {
5224-
my ($self, $m) = @_;
5232+
my ($self, $m, $deletions) = @_;
52255233
my ($dir, $file) = split_path($m->{file_b});
5226-
my $pbat = $self->ensure_path($dir);
5234+
my $pbat = $self->ensure_path($dir, $deletions);
52275235
my $fbat = $self->add_file($self->repo_path($m->{file_b}), $pbat,
52285236
undef, -1);
52295237
print "\tA\t$m->{file_b}\n" unless $::_q;
@@ -5233,9 +5241,9 @@ sub A {
52335241
}
52345242

52355243
sub C {
5236-
my ($self, $m) = @_;
5244+
my ($self, $m, $deletions) = @_;
52375245
my ($dir, $file) = split_path($m->{file_b});
5238-
my $pbat = $self->ensure_path($dir);
5246+
my $pbat = $self->ensure_path($dir, $deletions);
52395247
my $fbat = $self->add_file($self->repo_path($m->{file_b}), $pbat,
52405248
$self->url_path($m->{file_a}), $self->{r});
52415249
print "\tC\t$m->{file_a} => $m->{file_b}\n" unless $::_q;
@@ -5252,9 +5260,9 @@ sub delete_entry {
52525260
}
52535261

52545262
sub R {
5255-
my ($self, $m) = @_;
5263+
my ($self, $m, $deletions) = @_;
52565264
my ($dir, $file) = split_path($m->{file_b});
5257-
my $pbat = $self->ensure_path($dir);
5265+
my $pbat = $self->ensure_path($dir, $deletions);
52585266
my $fbat = $self->add_file($self->repo_path($m->{file_b}), $pbat,
52595267
$self->url_path($m->{file_a}), $self->{r});
52605268
print "\tR\t$m->{file_a} => $m->{file_b}\n" unless $::_q;
@@ -5263,14 +5271,14 @@ sub R {
52635271
$self->close_file($fbat,undef,$self->{pool});
52645272

52655273
($dir, $file) = split_path($m->{file_a});
5266-
$pbat = $self->ensure_path($dir);
5274+
$pbat = $self->ensure_path($dir, $deletions);
52675275
$self->delete_entry($m->{file_a}, $pbat);
52685276
}
52695277

52705278
sub M {
5271-
my ($self, $m) = @_;
5279+
my ($self, $m, $deletions) = @_;
52725280
my ($dir, $file) = split_path($m->{file_b});
5273-
my $pbat = $self->ensure_path($dir);
5281+
my $pbat = $self->ensure_path($dir, $deletions);
52745282
my $fbat = $self->open_file($self->repo_path($m->{file_b}),
52755283
$pbat,$self->{r},$self->{pool});
52765284
print "\t$m->{chg}\t$m->{file_b}\n" unless $::_q;
@@ -5340,9 +5348,9 @@ sub chg_file {
53405348
}
53415349

53425350
sub D {
5343-
my ($self, $m) = @_;
5351+
my ($self, $m, $deletions) = @_;
53445352
my ($dir, $file) = split_path($m->{file_b});
5345-
my $pbat = $self->ensure_path($dir);
5353+
my $pbat = $self->ensure_path($dir, $deletions);
53465354
print "\tD\t$m->{file_b}\n" unless $::_q;
53475355
$self->delete_entry($m->{file_b}, $pbat);
53485356
}
@@ -5374,11 +5382,19 @@ sub DESTROY {
53745382
sub apply_diff {
53755383
my ($self) = @_;
53765384
my $mods = $self->{mods};
5377-
my %o = ( D => 1, R => 0, C => -1, A => 3, M => 3, T => 3 );
5385+
my %o = ( D => 0, C => 1, R => 2, A => 3, M => 4, T => 5 );
5386+
my %deletions;
5387+
5388+
foreach my $m (@$mods) {
5389+
if ($m->{chg} eq "D") {
5390+
$deletions{$m->{file_b}} = 1;
5391+
}
5392+
}
5393+
53785394
foreach my $m (sort { $o{$a->{chg}} <=> $o{$b->{chg}} } @$mods) {
53795395
my $f = $m->{chg};
53805396
if (defined $o{$f}) {
5381-
$self->$f($m);
5397+
$self->$f($m, \%deletions);
53825398
} else {
53835399
fatal("Invalid change type: $f");
53845400
}
@@ -5994,7 +6010,6 @@ package Git::SVN::Log;
59946010
use strict;
59956011
use warnings;
59966012
use POSIX qw/strftime/;
5997-
use Time::Local;
59986013
use constant commit_log_separator => ('-' x 72) . "\n";
59996014
use vars qw/$TZ $limit $color $pager $non_recursive $verbose $oneline
60006015
%rusers $show_commit $incremental/;
@@ -6104,11 +6119,8 @@ sub run_pager {
61046119
}
61056120

61066121
sub format_svn_date {
6107-
# some systmes don't handle or mishandle %z, so be creative.
61086122
my $t = shift || time;
6109-
my $gm = timelocal(gmtime($t));
6110-
my $sign = qw( + + - )[ $t <=> $gm ];
6111-
my $gmoff = sprintf("%s%02d%02d", $sign, (gmtime(abs($t - $gm)))[2,1]);
6123+
my $gmoff = Git::SVN::get_tz($t);
61126124
return strftime("%Y-%m-%d %H:%M:%S $gmoff (%a, %d %b %Y)", localtime($t));
61136125
}
61146126

t/t9100-git-svn-basic.sh

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,11 @@ test_expect_success "$name" '
9292
echo yyy > bar/zzz/yyy &&
9393
git update-index --add bar/zzz/yyy &&
9494
git commit -m "$name" &&
95-
test_must_fail git svn set-tree --find-copies-harder --rmdir \
96-
${remotes_git_svn}..mybranch3' || true
97-
95+
git svn set-tree --find-copies-harder --rmdir \
96+
${remotes_git_svn}..mybranch3 &&
97+
svn_cmd up "$SVN_TREE" &&
98+
test -d "$SVN_TREE"/bar/zzz &&
99+
test -e "$SVN_TREE"/bar/zzz/yyy ' || true
98100

99101
name='detect node change from directory to file #2'
100102
test_expect_success "$name" '
@@ -134,10 +136,10 @@ test_expect_success "$name" '
134136
test -x "$SVN_TREE"/exec.sh'
135137

136138

137-
name='executable file becomes a symlink to bar/zzz (file)'
139+
name='executable file becomes a symlink to file'
138140
test_expect_success "$name" '
139141
rm exec.sh &&
140-
ln -s bar/zzz exec.sh &&
142+
ln -s file exec.sh &&
141143
git update-index exec.sh &&
142144
git commit -m "$name" &&
143145
git svn set-tree --find-copies-harder --rmdir \
@@ -148,14 +150,14 @@ test_expect_success "$name" '
148150
name='new symlink is added to a file that was also just made executable'
149151

150152
test_expect_success "$name" '
151-
chmod +x bar/zzz &&
152-
ln -s bar/zzz exec-2.sh &&
153-
git update-index --add bar/zzz exec-2.sh &&
153+
chmod +x file &&
154+
ln -s file exec-2.sh &&
155+
git update-index --add file exec-2.sh &&
154156
git commit -m "$name" &&
155157
git svn set-tree --find-copies-harder --rmdir \
156158
${remotes_git_svn}..mybranch5 &&
157159
svn_cmd up "$SVN_TREE" &&
158-
test -x "$SVN_TREE"/bar/zzz &&
160+
test -x "$SVN_TREE"/file &&
159161
test -h "$SVN_TREE"/exec-2.sh'
160162

161163
name='modify a symlink to become a file'
@@ -195,14 +197,15 @@ name='check imported tree checksums expected tree checksums'
195197
rm -f expected
196198
if test_have_prereq UTF8
197199
then
198-
echo tree bf522353586b1b883488f2bc73dab0d9f774b9a9 > expected
200+
echo tree dc68b14b733e4ec85b04ab6f712340edc5dc936e > expected
199201
fi
200202
cat >> expected <<\EOF
201-
tree 83654bb36f019ae4fe77a0171f81075972087624
202-
tree 031b8d557afc6fea52894eaebb45bec52f1ba6d1
203-
tree 0b094cbff17168f24c302e297f55bfac65eb8bd3
204-
tree d667270a1f7b109f5eb3aaea21ede14b56bfdd6e
205-
tree 56a30b966619b863674f5978696f4a3594f2fca9
203+
tree c3322890dcf74901f32d216f05c5044f670ce632
204+
tree d3ccd5035feafd17b030c5732e7808cc49122853
205+
tree d03e1630363d4881e68929d532746b20b0986b83
206+
tree 149d63cd5878155c846e8c55d7d8487de283f89e
207+
tree 312b76e4f64ce14893aeac8591eb3960b065e247
208+
tree 149d63cd5878155c846e8c55d7d8487de283f89e
206209
tree d667270a1f7b109f5eb3aaea21ede14b56bfdd6e
207210
tree 8f51f74cf0163afc9ad68a4b1537288c4558b5a4
208211
EOF

0 commit comments

Comments
 (0)