* [PATCH] git-svn: bug fixes (some resends)
@ 2006-06-11 7:03 Eric Wong
2006-06-11 7:03 ` [PATCH 1/5] git-svn: t0000: add -f flag to checkout Eric Wong
0 siblings, 1 reply; 6+ messages in thread
From: Eric Wong @ 2006-06-11 7:03 UTC (permalink / raw)
To: Junio C Hamano, git
[PATCH 1/5] git-svn: t0000: add -f flag to checkout
[PATCH 2/5] git-svn: fix handling of filenames with embedded '@'
These two are resends, patch 2 only affects 1.1.0-pre.
[PATCH 3/5] git-svn: eol_cp corner-case fixes
Kinda urgent (but only affects 1.1.0-pre)
[PATCH 4/5] git-svn: restore original LC_ALL setting (or unset) for commit
For people that want to commit UTF-8 commit messages.
[PATCH 5/5] git-svn: don't allow commit if svn tree is not current
Extra sanity check, just in case.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/5] git-svn: t0000: add -f flag to checkout
2006-06-11 7:03 [PATCH] git-svn: bug fixes (some resends) Eric Wong
@ 2006-06-11 7:03 ` Eric Wong
2006-06-11 7:03 ` [PATCH 2/5] git-svn: fix handling of filenames with embedded '@' Eric Wong
0 siblings, 1 reply; 6+ messages in thread
From: Eric Wong @ 2006-06-11 7:03 UTC (permalink / raw)
To: Junio C Hamano, git; +Cc: Eric Wong
Some changes to the latest git.git made this test croak. So
we'll always just force everything when using a new branch.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
contrib/git-svn/t/t0000-contrib-git-svn.sh | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/contrib/git-svn/t/t0000-contrib-git-svn.sh b/contrib/git-svn/t/t0000-contrib-git-svn.sh
index 8b3a0d9..a07fbad 100644
--- a/contrib/git-svn/t/t0000-contrib-git-svn.sh
+++ b/contrib/git-svn/t/t0000-contrib-git-svn.sh
@@ -32,7 +32,7 @@ test_expect_success \
name='try a deep --rmdir with a commit'
-git checkout -b mybranch remotes/git-svn
+git checkout -f -b mybranch remotes/git-svn
mv dir/a/b/c/d/e/file dir/file
cp dir/file file
git update-index --add --remove dir/a/b/c/d/e/file dir/file file
@@ -58,7 +58,7 @@ test_expect_code 1 "$name" \
name='detect node change from directory to file #1'
rm -rf dir $GIT_DIR/index
-git checkout -b mybranch2 remotes/git-svn
+git checkout -f -b mybranch2 remotes/git-svn
mv bar/zzz zzz
rm -rf bar
mv zzz bar
@@ -73,7 +73,7 @@ test_expect_code 1 "$name" \
name='detect node change from file to directory #2'
rm -f $GIT_DIR/index
-git checkout -b mybranch3 remotes/git-svn
+git checkout -f -b mybranch3 remotes/git-svn
rm bar/zzz
git-update-index --remove bar/zzz
mkdir bar/zzz
@@ -88,7 +88,7 @@ test_expect_code 1 "$name" \
name='detect node change from directory to file #2'
rm -f $GIT_DIR/index
-git checkout -b mybranch4 remotes/git-svn
+git checkout -f -b mybranch4 remotes/git-svn
rm -rf dir
git update-index --remove -- dir/file
touch dir
@@ -103,7 +103,7 @@ test_expect_code 1 "$name" \
name='remove executable bit from a file'
rm -f $GIT_DIR/index
-git checkout -b mybranch5 remotes/git-svn
+git checkout -f -b mybranch5 remotes/git-svn
chmod -x exec.sh
git update-index exec.sh
git commit -m "$name"
--
1.3.3.g2dc7b-dirty
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/5] git-svn: fix handling of filenames with embedded '@'
2006-06-11 7:03 ` [PATCH 1/5] git-svn: t0000: add -f flag to checkout Eric Wong
@ 2006-06-11 7:03 ` Eric Wong
2006-06-11 7:03 ` [PATCH 3/5] git-svn: eol_cp corner-case fixes Eric Wong
0 siblings, 1 reply; 6+ messages in thread
From: Eric Wong @ 2006-06-11 7:03 UTC (permalink / raw)
To: Junio C Hamano, git; +Cc: Eric Wong
svn has trouble parsing files with embedded '@' characters. For
example,
svn propget svn:keywords foo@bar.c
svn: Syntax error parsing revision 'bar.c'
I asked about this on #svn and the workaround suggested was to append
an explicit revision specifier:
svn propget svn:keywords foo@bar.c@BASE
This patch appends '@BASE' to the filename in all calls to 'svn
propget'.
Patch originally by Seth Falcon <sethfalcon@gmail.com>
Seth: signoff?
[ew: Made to work with older svn that don't support peg revisions]
Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
contrib/git-svn/git-svn.perl | 17 +++++++++++++----
1 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/contrib/git-svn/git-svn.perl b/contrib/git-svn/git-svn.perl
index aac8779..7ed11ef 100755
--- a/contrib/git-svn/git-svn.perl
+++ b/contrib/git-svn/git-svn.perl
@@ -34,7 +34,7 @@ my $sha1_short = qr/[a-f\d]{4,40}/;
my ($_revision,$_stdin,$_no_ignore_ext,$_no_stop_copy,$_help,$_rmdir,$_edit,
$_find_copies_harder, $_l, $_version, $_upgrade, $_authors);
my (@_branch_from, %tree_map, %users);
-my $_svn_co_url_revs;
+my ($_svn_co_url_revs, $_svn_pg_peg_revs);
my %fc_opts = ( 'no-ignore-externals' => \$_no_ignore_ext,
'branch|b=s' => \@_branch_from,
@@ -336,7 +336,7 @@ sub show_ignore {
my %ign;
File::Find::find({wanted=>sub{if(lstat $_ && -d _ && -d "$_/.svn"){
s#^\./##;
- @{$ign{$_}} = safe_qx(qw(svn propget svn:ignore),$_);
+ @{$ign{$_}} = svn_propget_base('svn:ignore', $_);
}}, no_chdir=>1},'.');
print "\n# /\n";
@@ -859,7 +859,7 @@ sub sys { system(@_) == 0 or croak $? }
sub eol_cp {
my ($from, $to) = @_;
- my $es = safe_qx(qw/svn propget svn:eol-style/, $to);
+ my $es = svn_propget_base('svn:eol-style', $to);
open my $rfd, '<', $from or croak $!;
binmode $rfd or croak $!;
open my $wfd, '>', $to or croak $!;
@@ -897,7 +897,7 @@ sub do_update_index {
while (my $x = <$p>) {
chomp $x;
if (!$no_text_base && lstat $x && ! -l _ &&
- safe_qx(qw/svn propget svn:keywords/,$x)) {
+ svn_propget_base('svn:keywords', $x)) {
my $mode = -x _ ? 0755 : 0644;
my ($v,$d,$f) = File::Spec->splitpath($x);
my $tb = File::Spec->catfile($d, '.svn', 'tmp',
@@ -1135,6 +1135,9 @@ sub svn_compat_check {
if (grep /usage: checkout URL\[\@REV\]/,@co_help) {
$_svn_co_url_revs = 1;
}
+ if (grep /\[TARGET\[\@REV\]\.\.\.\]/, `svn propget -h`) {
+ $_svn_pg_peg_revs = 1;
+ }
# I really, really hope nobody hits this...
unless (grep /stop-on-copy/, (safe_qx(qw(svn log -h)))) {
@@ -1214,6 +1217,12 @@ sub load_authors {
close $authors or croak $!;
}
+sub svn_propget_base {
+ my ($p, $f) = @_;
+ $f .= '@BASE' if $_svn_pg_peg_revs;
+ return safe_qx(qw/svn propget/, $p, $f);
+}
+
__END__
Data structures:
--
1.3.3.g2dc7b-dirty
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/5] git-svn: eol_cp corner-case fixes
2006-06-11 7:03 ` [PATCH 2/5] git-svn: fix handling of filenames with embedded '@' Eric Wong
@ 2006-06-11 7:03 ` Eric Wong
2006-06-11 7:03 ` [PATCH 4/5] git-svn: restore original LC_ALL setting (or unset) for commit Eric Wong
0 siblings, 1 reply; 6+ messages in thread
From: Eric Wong @ 2006-06-11 7:03 UTC (permalink / raw)
To: Junio C Hamano, git; +Cc: Eric Wong
If we read the maximum size of our buffer into $buf, and the
last character is '\015', there's a chance that the character is
'\012', which means our regex won't work correctly. At the
worst case, this could introduce an extra newline into the code.
We'll now read an extra character if we see '\015' is the last
character in $buf.
We also forgot to recalculate the length of $buf after doing the
newline substitution, causing some files to appeare truncated.
We'll do that now and force byte semantics in length() for good
measure.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
contrib/git-svn/git-svn.perl | 15 +++++++++++----
1 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/contrib/git-svn/git-svn.perl b/contrib/git-svn/git-svn.perl
index 7ed11ef..8d2e7f7 100755
--- a/contrib/git-svn/git-svn.perl
+++ b/contrib/git-svn/git-svn.perl
@@ -866,19 +866,26 @@ sub eol_cp {
binmode $wfd or croak $!;
my $eol = $EOL{$es} or undef;
- if ($eol) {
- print "$eol: $from => $to\n";
- }
my $buf;
+ use bytes;
while (1) {
my ($r, $w, $t);
defined($r = sysread($rfd, $buf, 4096)) or croak $!;
return unless $r;
- $buf =~ s/(?:\015|\012|\015\012)/$eol/gs if $eol;
+ if ($eol) {
+ if ($buf =~ /\015$/) {
+ my $c;
+ defined($r = sysread($rfd,$c,1)) or croak $!;
+ $buf .= $c if $r > 0;
+ }
+ $buf =~ s/(?:\015\012|\015|\012)/$eol/gs;
+ $r = length($buf);
+ }
for ($w = 0; $w < $r; $w += $t) {
$t = syswrite($wfd, $buf, $r - $w, $w) or croak $!;
}
}
+ no bytes;
}
sub do_update_index {
--
1.3.3.g2dc7b-dirty
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 4/5] git-svn: restore original LC_ALL setting (or unset) for commit
2006-06-11 7:03 ` [PATCH 3/5] git-svn: eol_cp corner-case fixes Eric Wong
@ 2006-06-11 7:03 ` Eric Wong
2006-06-11 7:03 ` [PATCH 5/5] git-svn: don't allow commit if svn tree is not current Eric Wong
0 siblings, 1 reply; 6+ messages in thread
From: Eric Wong @ 2006-06-11 7:03 UTC (permalink / raw)
To: Junio C Hamano, git; +Cc: Eric Wong
svn forces UTF-8 for commit messages, and with LC_ALL set to 'C'
it is unable to determine encoding of the git commit message.
Now we'll just assume the user has set LC_* correctly for
the commit message they're using.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
contrib/git-svn/git-svn.perl | 34 +++++++++++++++++++++++-----------
1 files changed, 23 insertions(+), 11 deletions(-)
diff --git a/contrib/git-svn/git-svn.perl b/contrib/git-svn/git-svn.perl
index 8d2e7f7..8bc3d69 100755
--- a/contrib/git-svn/git-svn.perl
+++ b/contrib/git-svn/git-svn.perl
@@ -14,6 +14,7 @@ use Cwd qw/abs_path/;
$GIT_DIR = abs_path($ENV{GIT_DIR} || '.git');
$ENV{GIT_DIR} = $GIT_DIR;
+my $LC_ALL = $ENV{LC_ALL};
# make sure the svn binary gives consistent output between locales and TZs:
$ENV{TZ} = 'UTC';
$ENV{LC_ALL} = 'C';
@@ -704,23 +705,34 @@ sub svn_commit_tree {
my ($oneline) = ($log_msg{msg} =~ /([^\n\r]+)/);
print "Committing $commit: $oneline\n";
+ if (defined $LC_ALL) {
+ $ENV{LC_ALL} = $LC_ALL;
+ } else {
+ delete $ENV{LC_ALL};
+ }
my @ci_output = safe_qx(qw(svn commit -F),$commit_msg);
- my ($committed) = grep(/^Committed revision \d+\./,@ci_output);
+ $ENV{LC_ALL} = 'C';
unlink $commit_msg;
- defined $committed or croak
+ my ($committed) = ($ci_output[$#ci_output] =~ /(\d+)/);
+ if (!defined $committed) {
+ my $out = join("\n",@ci_output);
+ print STDERR "W: Trouble parsing \`svn commit' output:\n\n",
+ $out, "\n\nAssuming English locale...";
+ ($committed) = ($out =~ /^Committed revision \d+\./sm);
+ defined $committed or die " FAILED!\n",
"Commit output failed to parse committed revision!\n",
- join("\n",@ci_output),"\n";
- my ($rev_committed) = ($committed =~ /^Committed revision (\d+)\./);
+ print STDERR " OK\n";
+ }
my @svn_up = qw(svn up);
push @svn_up, '--ignore-externals' unless $_no_ignore_ext;
- if ($rev_committed == ($svn_rev + 1)) {
- push @svn_up, "-r$rev_committed";
+ if ($committed == ($svn_rev + 1)) {
+ push @svn_up, "-r$committed";
sys(@svn_up);
my $info = svn_info('.');
my $date = $info->{'Last Changed Date'} or die "Missing date\n";
- if ($info->{'Last Changed Rev'} != $rev_committed) {
- croak "$info->{'Last Changed Rev'} != $rev_committed\n"
+ if ($info->{'Last Changed Rev'} != $committed) {
+ croak "$info->{'Last Changed Rev'} != $committed\n"
}
my ($Y,$m,$d,$H,$M,$S,$tz) = ($date =~
/(\d{4})\-(\d\d)\-(\d\d)\s
@@ -728,16 +740,16 @@ sub svn_commit_tree {
or croak "Failed to parse date: $date\n";
$log_msg{date} = "$tz $Y-$m-$d $H:$M:$S";
$log_msg{author} = $info->{'Last Changed Author'};
- $log_msg{revision} = $rev_committed;
+ $log_msg{revision} = $committed;
$log_msg{msg} .= "\n";
my $parent = file_to_s("$REV_DIR/$svn_rev");
git_commit(\%log_msg, $parent, $commit);
- return $rev_committed;
+ return $committed;
}
# resync immediately
push @svn_up, "-r$svn_rev";
sys(@svn_up);
- return fetch("$rev_committed=$commit")->{revision};
+ return fetch("$committed=$commit")->{revision};
}
# read the entire log into a temporary file (which is removed ASAP)
--
1.3.3.g2dc7b-dirty
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 5/5] git-svn: don't allow commit if svn tree is not current
2006-06-11 7:03 ` [PATCH 4/5] git-svn: restore original LC_ALL setting (or unset) for commit Eric Wong
@ 2006-06-11 7:03 ` Eric Wong
0 siblings, 0 replies; 6+ messages in thread
From: Eric Wong @ 2006-06-11 7:03 UTC (permalink / raw)
To: Junio C Hamano, git; +Cc: Eric Wong
If new revisions are fetched, that implies we haven't merged,
acked, or nacked them yet, and attempting to write the tree
we're committing means we'd silently clobber the newly fetched
changes.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
contrib/git-svn/git-svn.perl | 11 +++++++++--
1 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/contrib/git-svn/git-svn.perl b/contrib/git-svn/git-svn.perl
index 8bc3d69..72129de 100755
--- a/contrib/git-svn/git-svn.perl
+++ b/contrib/git-svn/git-svn.perl
@@ -309,9 +309,16 @@ sub commit {
}
chomp @revs;
- fetch();
- chdir $SVN_WC or croak $!;
+ chdir $SVN_WC or croak "Unable to chdir $SVN_WC: $!\n";
my $info = svn_info('.');
+ my $fetched = fetch();
+ if ($info->{Revision} != $fetched->{revision}) {
+ print STDERR "There are new revisions that were fetched ",
+ "and need to be merged (or acknowledged) ",
+ "before committing.\n";
+ exit 1;
+ }
+ $info = svn_info('.');
read_uuid($info);
my $svn_current_rev = $info->{'Last Changed Rev'};
foreach my $c (@revs) {
--
1.3.3.g2dc7b-dirty
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2006-06-11 7:04 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-06-11 7:03 [PATCH] git-svn: bug fixes (some resends) Eric Wong
2006-06-11 7:03 ` [PATCH 1/5] git-svn: t0000: add -f flag to checkout Eric Wong
2006-06-11 7:03 ` [PATCH 2/5] git-svn: fix handling of filenames with embedded '@' Eric Wong
2006-06-11 7:03 ` [PATCH 3/5] git-svn: eol_cp corner-case fixes Eric Wong
2006-06-11 7:03 ` [PATCH 4/5] git-svn: restore original LC_ALL setting (or unset) for commit Eric Wong
2006-06-11 7:03 ` [PATCH 5/5] git-svn: don't allow commit if svn tree is not current Eric Wong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).