From: Jens Seidel <jensseidel@users.sf.net>
To: git@vger.kernel.org
Cc: Jens Seidel <jensseidel@users.sf.net>,
Eric Wong <normalperson@yhbt.net>,
Jonathan Nieder <jrnieder@gmail.com>
Subject: Re: [PATCH/WIP] git-svn: tweak log format to match "svn log" output
Date: Sun, 25 Jul 2010 19:52:39 +0200 [thread overview]
Message-ID: <20100725175237.GB7930@merkur.sol.de> (raw)
In-Reply-To: <20100725090943.GA1998@merkur.sol.de>
[-- Attachment #1: Type: text/plain, Size: 3054 bytes --]
On Sun, Jul 25, 2010 at 11:09:46AM +0200, Jens Seidel wrote:
> No, this is still wrong, we have to use $d->nget as some languages can have
> multiple plural forms. Russian e.g. has two: one if the last digit ends with
> 2-4 and a second one if it ends with 5-9. Exact rule:
> "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 &&
> n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
>
> That's why it's wrong to use $plur_fmt at all (and also "10" from above
> makes no sense). Let's use:
> $d->nget(" | %d line", " | %d lines", $nr_line), $nr_line)
> where $nr_line is the variable.
>
> Sorry for not providing a patch now but I need more time ... I suggest one
> of you try it again and I check it :-)
Here is a new patch:
(Please check the last stanza, Jonathan introduced $nr_line for the
output where 1 was used before. I reverted it.)
Since the partial patches get difficult to handle I attached also the
combined patch which includes everything from this thread.
And a further minor issue. The current locale for the test is extracted from
$LANG. It's possible that this variable isn't set but another one such as
LC_MESSAGES. So the test doesn't determine the locale but $LANG :-))
commit 239c97380df384162ebe8399754d072300d8b52f
Author: Jens Seidel <jensseidel@users.sf.net>
Date: Sun Jul 25 18:35:28 2010 +0200
Proper use of plural forms
diff --git a/git-svn.perl b/git-svn.perl
index f9b7711..71c2c9a 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -5639,14 +5639,22 @@ sub show_commit_normal {
print "$c->{c} | " if $show_commit;
print "$c->{a} | ", format_svn_date($c->{t_utc});
my $nr_line = 0;
- my $sing_fmt = " | %d line";
- my $plur_fmt = " | %d lines";
- if ($can_localize) {
- my $d = Locale::gettext->domain("subversion");
- $sing_fmt = $d->nget($sing_fmt, $plur_fmt, 1);
- $plur_fmt = $d->nget($sing_fmt, $plur_fmt, 10);
- }
+ # returns " | $1 lines" properly translated
+ local *get_line_msg = sub {
+ my $n = shift;
+ if ($can_localize) {
+ my $d = Locale::gettext->domain("subversion");
+ return sprintf($d->nget(" | %d line", " | %d lines", $n), $n);
+ } else {
+ if ($n == 1) {
+ return " | 1 line";
+ } else {
+ return " | " . $n . " lines";
+ }
+ }
+ };
+
if (my $l = $c->{l}) {
while ($l->[$#$l] eq "\n" && $#$l > 0
&& $l->[($#$l - 1)] eq "\n") {
@@ -5654,23 +5662,15 @@ sub show_commit_normal {
}
$nr_line = scalar @$l;
if (!$nr_line) {
- print sprintf($sing_fmt, 1), "\n\n\n";
+ print get_line_msg(1), "\n\n\n";
} else {
- if ($nr_line == 1) {
- print sprintf($sing_fmt, $nr_line), "\n";
- } else {
- print sprintf($plur_fmt, $nr_line), "\n";
- }
+ print get_line_msg($nr_line), "\n";
show_commit_changed_paths($c);
print "\n";
print $_ foreach @$l;
}
} else {
- if ($nr_line == 1) {
- print sprintf($sing_fmt, $nr_line), "\n";
- } else {
- print sprintf($plur_fmt, $nr_line), "\n";
- }
+ print get_line_msg(1), "\n";
show_commit_changed_paths($c);
print "\n";
[-- Attachment #2: git-svn.diff --]
[-- Type: text/x-diff, Size: 4112 bytes --]
diff --git a/git-svn.perl b/git-svn.perl
index c416358..71c2c9a 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -45,6 +45,7 @@ sub _req_svn {
}
}
my $can_compress = eval { require Compress::Zlib; 1};
+my $can_localize = eval { require Locale::gettext; 1};
push @Git::SVN::Ra::ISA, 'SVN::Ra';
push @SVN::Git::Editor::ISA, 'SVN::Delta::Editor';
push @SVN::Git::Fetcher::ISA, 'SVN::Delta::Editor';
@@ -5535,7 +5536,12 @@ sub format_svn_date {
my $gm = timelocal(gmtime($t));
my $sign = qw( + + - )[ $t <=> $gm ];
my $gmoff = sprintf("%s%02d%02d", $sign, (gmtime(abs($t - $gm)))[2,1]);
- return strftime("%Y-%m-%d %H:%M:%S $gmoff (%a, %d %b %Y)", localtime($t));
+ my $format = " (%a, %d %b %Y)";
+ if ($can_localize) {
+ my $d = Locale::gettext->domain("subversion");
+ $format = $d->get($format);
+ }
+ return strftime("%Y-%m-%d %H:%M:%S $gmoff$format", localtime($t));
}
sub parse_git_date {
@@ -5631,9 +5637,24 @@ sub show_commit_normal {
my ($c) = @_;
print commit_log_separator, "r$c->{r} | ";
print "$c->{c} | " if $show_commit;
- print "$c->{a} | ", format_svn_date($c->{t_utc}), ' | ';
+ print "$c->{a} | ", format_svn_date($c->{t_utc});
my $nr_line = 0;
+ # returns " | $1 lines" properly translated
+ local *get_line_msg = sub {
+ my $n = shift;
+ if ($can_localize) {
+ my $d = Locale::gettext->domain("subversion");
+ return sprintf($d->nget(" | %d line", " | %d lines", $n), $n);
+ } else {
+ if ($n == 1) {
+ return " | 1 line";
+ } else {
+ return " | " . $n . " lines";
+ }
+ }
+ };
+
if (my $l = $c->{l}) {
while ($l->[$#$l] eq "\n" && $#$l > 0
&& $l->[($#$l - 1)] eq "\n") {
@@ -5641,20 +5662,15 @@ sub show_commit_normal {
}
$nr_line = scalar @$l;
if (!$nr_line) {
- print "1 line\n\n\n";
+ print get_line_msg(1), "\n\n\n";
} else {
- if ($nr_line == 1) {
- $nr_line = '1 line';
- } else {
- $nr_line .= ' lines';
- }
- print $nr_line, "\n";
+ print get_line_msg($nr_line), "\n";
show_commit_changed_paths($c);
print "\n";
print $_ foreach @$l;
}
} else {
- print "1 line\n";
+ print get_line_msg(1), "\n";
show_commit_changed_paths($c);
print "\n";
@@ -5727,6 +5743,9 @@ sub cmd_show_log {
push @{$c->{stat}}, $_;
$stat = undef;
} elsif (/^${esc_color} (git-svn-id:.+)$/o) {
+ if (@{$c->{l}} && $c->{l}->[-1] eq "\n") {
+ pop @{$c->{l}};
+ }
($c->{url}, $c->{r}, undef) = ::extract_metadata($1);
} elsif (s/^${esc_color} //o) {
push @{$c->{l}}, $_;
diff --git a/t/t9116-git-svn-log.sh b/t/t9116-git-svn-log.sh
index 0374a74..586f64b 100755
--- a/t/t9116-git-svn-log.sh
+++ b/t/t9116-git-svn-log.sh
@@ -16,6 +16,7 @@ test_expect_success 'setup repository and import' '
done && \
svn_cmd import -m test . "$svnrepo"
cd .. &&
+ svn_cmd checkout "$svnrepo"/branches/a checkout &&
git svn init "$svnrepo" -T trunk -b branches -t tags &&
git svn fetch &&
git reset --hard trunk &&
@@ -36,7 +37,38 @@ test_expect_success 'setup repository and import' '
git commit -a -m spy &&
echo try >> README &&
git commit -a -m try &&
- git svn dcommit
+ git svn dcommit &&
+ (
+ cd checkout &&
+ svn_cmd update
+ ) &&
+
+ if test -n "$ORIGINAL_LANG" && test "$ORIGINAL_LANG" != C
+ then
+ test_set_prereq NONCLOCALE
+ fi
+ '
+
+test_expect_success 'log matches svn log' '
+ git reset --hard a &&
+ (
+ cd checkout &&
+ svn_cmd log >../expected
+ ) &&
+ git svn log >actual &&
+ test_cmp expected actual
+ '
+
+test_expect_success NONCLOCALE 'log matches svn log, original locale' '
+ (
+ LC_ALL=$ORIGINAL_LANG &&
+ (
+ cd checkout &&
+ svn_cmd log >../expected
+ ) &&
+ git svn log >actual
+ ) &&
+ test_cmp expected actual
'
test_expect_success 'run log' "
diff --git a/t/test-lib.sh b/t/test-lib.sh
index e5523dd..62aa48c 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -34,6 +34,9 @@ esac
# Keep the original TERM for say_color
ORIGINAL_TERM=$TERM
+# Keep the original locale for tests
+ORIGINAL_LANG=$LANG
+
# For repeatability, reset the environment to known value.
LANG=C
LC_ALL=C
prev parent reply other threads:[~2010-07-25 17:53 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20100423134611.GA3440@merkur.sol.de>
[not found] ` <20100426132710.GA9930@progeny.tock>
[not found] ` <20100427112656.GB16323@merkur.sol.de>
2010-07-25 2:31 ` [PATCH/WIP] git-svn: tweak log format to match "svn log" output Jonathan Nieder
2010-07-25 8:10 ` Eric Wong
2010-07-25 8:13 ` [PATCH 2/1] git svn: remove extraneous newline from log output Eric Wong
2010-07-25 17:35 ` Jens Seidel
2010-07-26 19:09 ` Eric Wong
2010-07-25 8:37 ` [PATCH/WIP] git-svn: tweak log format to match "svn log" output Jonathan Nieder
2010-07-25 8:40 ` Eric Wong
2010-07-25 9:09 ` Jens Seidel
2010-07-25 17:52 ` Jens Seidel [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100725175237.GB7930@merkur.sol.de \
--to=jensseidel@users.sf.net \
--cc=git@vger.kernel.org \
--cc=jrnieder@gmail.com \
--cc=normalperson@yhbt.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.