Browse Source

git-svn: restore original LC_ALL setting (or unset) for commit

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>
maint
Eric Wong 19 years ago
parent
commit
ce475dfcb5
  1. 34
      contrib/git-svn/git-svn.perl

34
contrib/git-svn/git-svn.perl

@ -14,6 +14,7 @@ use Cwd qw/abs_path/; @@ -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 { @@ -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 { @@ -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)

Loading…
Cancel
Save