* [PATCH/WIP] git-svn: tweak log format to match "svn log" output
[not found] ` <20100427112656.GB16323@merkur.sol.de>
@ 2010-07-25 2:31 ` Jonathan Nieder
2010-07-25 8:10 ` Eric Wong
0 siblings, 1 reply; 9+ messages in thread
From: Jonathan Nieder @ 2010-07-25 2:31 UTC (permalink / raw)
To: git; +Cc: Eric Wong, Jens Seidel
From: Jens Seidel <jensseidel@users.sf.net>
Tweak "git svn log" output to more closely match what svn produces.
In particular, if Locale::gettext is available, use that to produce
localized output using svn’s translations.
So now instead of
git:
r2105 | viktor | 2010-03-19 13:40:54 +0100 (Fr, 19 Mär 2010) | 2 lines
svn:
r2105 | viktor | 2010-03-19 13:40:54 +0100 (Fr, 19. Mär 2010) | 1 Zeile
we get the much closer
git:
r2105 | viktor | 2010-03-19 13:40:54 +0100 (Fr, 19. Mär 2010) | 2 Zeilen
svn:
r2105 | viktor | 2010-03-19 13:40:54 +0100 (Fr, 19. Mär 2010) | 1 Zeile
and a script for munging to compare logs would only have to fuzz
out the extra blank lines in git svn’s commit log.
[jn: made Locale::gettext dependency optional; added a test script]
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Jens Seidel wrote at http://bugs.debian.org/578915:
>> Jens Seidel wrote:
> Ah, git svn ignores any locale, this explains the problem.
>
>>> The dot stands for an ordinal number (e.g. "19." == "19th").
>>> Second: "line(s)" is not translated. I can workaround by starting git/svn in an
>>> English locale ...
>
> I tried to fix both.
>
>>> Third: the git log often contains an addional empty line.
>
> This remains open. Probably that can be solved by setting a git config
> option and resyncing all git svn history from git.
Sorry to leave this hanging for so long. I think it is an improvement
as is, but I have not tested in the following scenarios:
- Locale::gettext not available
- subversion not translated
- subversion translated but not to the current language
And the extra blank line at the end of log messages remains unsolved.
Thoughts?
diff --git i/git-svn.perl w/git-svn.perl
index c416358..55dc50d 100755
--- i/git-svn.perl
+++ w/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,14 @@ 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;
+ if ($can_localize) {
+ my $d = Locale::gettext->domain("subversion");
+ $format = "%Y-%m-%d %H:%M:%S $gmoff" . $d->get(" (%a, %d %b %Y)");
+ } else {
+ $format = "%Y-%m-%d %H:%M:%S $gmoff (%a, %d %b %Y)";
+ }
+ return strftime($format, localtime($t));
}
sub parse_git_date {
@@ -5631,9 +5639,16 @@ 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;
+ my $sing_fmt = " | %d line";
+ my $plur_fmt = " | %d lines";
+ if ($can_localize) {
+ my $d = Locale::gettext->domain("subversion");
+ $sing_fmt = $d->nget(" | %d line", " | %d lines", 1);
+ $plur_fmt = $d->nget(" | %d line", " | %d lines", 10);
+ }
if (my $l = $c->{l}) {
while ($l->[$#$l] eq "\n" && $#$l > 0
&& $l->[($#$l - 1)] eq "\n") {
@@ -5641,20 +5656,23 @@ sub show_commit_normal {
}
$nr_line = scalar @$l;
if (!$nr_line) {
- print "1 line\n\n\n";
+ print sprintf($sing_fmt, 1), "\n\n\n";
} else {
if ($nr_line == 1) {
- $nr_line = '1 line';
+ print sprintf($sing_fmt, $nr_line), "\n";
} else {
- $nr_line .= ' lines';
+ print sprintf($plur_fmt, $nr_line), "\n";
}
- print $nr_line, "\n";
show_commit_changed_paths($c);
print "\n";
print $_ foreach @$l;
}
} else {
- print "1 line\n";
+ if ($nr_line == 1) {
+ print sprintf($sing_fmt, $nr_line), "\n";
+ } else {
+ print sprintf($plur_fmt, $nr_line), "\n";
+ }
show_commit_changed_paths($c);
print "\n";
diff --git i/t/t9116-git-svn-log.sh w/t/t9116-git-svn-log.sh
index 0374a74..586f64b 100755
--- i/t/t9116-git-svn-log.sh
+++ w/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_failure 'log matches svn log' '
+ git reset --hard a &&
+ (
+ cd checkout &&
+ svn_cmd log >../expected
+ ) &&
+ git svn log >actual &&
+ test_cmp expected actual
+ '
+
+test_expect_failure 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 i/t/test-lib.sh w/t/test-lib.sh
index e5523dd..62aa48c 100644
--- i/t/test-lib.sh
+++ w/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
--
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH/WIP] git-svn: tweak log format to match "svn log" output
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 8:37 ` [PATCH/WIP] git-svn: tweak log format to match "svn log" output Jonathan Nieder
0 siblings, 2 replies; 9+ messages in thread
From: Eric Wong @ 2010-07-25 8:10 UTC (permalink / raw)
To: Jens Seidel; +Cc: git, Jonathan Nieder
Jonathan Nieder <jrnieder@gmail.com> wrote:
> From: Jens Seidel <jensseidel@users.sf.net>
>
> Tweak "git svn log" output to more closely match what svn produces.
> In particular, if Locale::gettext is available, use that to produce
> localized output using svn’s translations.
<snip>
> [jn: made Locale::gettext dependency optional; added a test script]
>
> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
> ---
> Jens Seidel wrote at http://bugs.debian.org/578915:
> >> Jens Seidel wrote:
>
> > Ah, git svn ignores any locale, this explains the problem.
> >
> >>> The dot stands for an ordinal number (e.g. "19." == "19th").
> >>> Second: "line(s)" is not translated. I can workaround by starting git/svn in an
> >>> English locale ...
> >
> > I tried to fix both.
> >
> >>> Third: the git log often contains an addional empty line.
>
> > This remains open. Probably that can be solved by setting a git config
> > option and resyncing all git svn history from git.
Hi Jens, Jonathan,
I just made an additional patch that should solve the problem
(see my reply to this email).
> Sorry to leave this hanging for so long. I think it is an improvement
> as is, but I have not tested in the following scenarios:
>
> - Locale::gettext not available
> - subversion not translated
> - subversion translated but not to the current language
>
> And the extra blank line at the end of log messages remains unsolved.
>
> Thoughts?
Everything looks reasonable to me. gettext should just fall back to the
original string when a translation is not available.
I've squashed the following cleanup on top of Jens' original change:
diff --git a/git-svn.perl b/git-svn.perl
index 55dc50d..5252722 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -5536,14 +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]);
- my $format;
+ my $format = " (%a, %d %b %Y)";
if ($can_localize) {
my $d = Locale::gettext->domain("subversion");
- $format = "%Y-%m-%d %H:%M:%S $gmoff" . $d->get(" (%a, %d %b %Y)");
- } else {
- $format = "%Y-%m-%d %H:%M:%S $gmoff (%a, %d %b %Y)";
+ $format = $d->get($format);
}
- return strftime($format, localtime($t));
+ return strftime("%Y-%m-%d %H:%M:%S $gmoff$format", localtime($t));
}
sub parse_git_date {
@@ -5646,8 +5644,8 @@ sub show_commit_normal {
if ($can_localize) {
my $d = Locale::gettext->domain("subversion");
- $sing_fmt = $d->nget(" | %d line", " | %d lines", 1);
- $plur_fmt = $d->nget(" | %d line", " | %d lines", 10);
+ $sing_fmt = $d->nget($sing_fmt, $plur_fmt, 1);
+ $plur_fmt = $d->nget($sing_fmt, $plur_fmt, 10);
}
if (my $l = $c->{l}) {
while ($l->[$#$l] eq "\n" && $#$l > 0
--
Eric Wong
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/1] git svn: remove extraneous newline from log output
2010-07-25 8:10 ` Eric Wong
@ 2010-07-25 8:13 ` Eric Wong
2010-07-25 17:35 ` Jens Seidel
2010-07-25 8:37 ` [PATCH/WIP] git-svn: tweak log format to match "svn log" output Jonathan Nieder
1 sibling, 1 reply; 9+ messages in thread
From: Eric Wong @ 2010-07-25 8:13 UTC (permalink / raw)
To: Jens Seidel; +Cc: git, Jonathan Nieder
This is to match the output of "svn log", which does not
add an extra newline before the next log entry.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
The following are pushed to the master git svn repo at
git://git.bogomips.org/git-svn Let me know if everything looks
alright and I'll ask Junio to pull.
Eric Wong (1):
git svn: remove extraneous newline from log output
Jens Seidel (1):
git-svn: tweak log format to match "svn log" output
git-svn.perl | 3 +++
t/t9116-git-svn-log.sh | 4 ++--
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/git-svn.perl b/git-svn.perl
index 5252722..f9b7711 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -5743,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 4394fb2..586f64b 100755
--- a/t/t9116-git-svn-log.sh
+++ b/t/t9116-git-svn-log.sh
@@ -49,7 +49,7 @@ test_expect_success 'setup repository and import' '
fi
'
-test_expect_failure 'log matches svn log' '
+test_expect_success 'log matches svn log' '
git reset --hard a &&
(
cd checkout &&
@@ -59,7 +59,7 @@ test_expect_failure 'log matches svn log' '
test_cmp expected actual
'
-test_expect_failure NONCLOCALE 'log matches svn log, original locale' '
+test_expect_success NONCLOCALE 'log matches svn log, original locale' '
(
LC_ALL=$ORIGINAL_LANG &&
(
--
Eric Wong
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH/WIP] git-svn: tweak log format to match "svn log" output
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 8:37 ` Jonathan Nieder
2010-07-25 8:40 ` Eric Wong
1 sibling, 1 reply; 9+ messages in thread
From: Jonathan Nieder @ 2010-07-25 8:37 UTC (permalink / raw)
To: Eric Wong; +Cc: Jens Seidel, git
Eric Wong wrote:
> @@ -5646,8 +5644,8 @@ sub show_commit_normal {
>
> if ($can_localize) {
> my $d = Locale::gettext->domain("subversion");
> - $sing_fmt = $d->nget(" | %d line", " | %d lines", 1);
> - $plur_fmt = $d->nget(" | %d line", " | %d lines", 10);
> + $sing_fmt = $d->nget($sing_fmt, $plur_fmt, 1);
> + $plur_fmt = $d->nget($sing_fmt, $plur_fmt, 10);
This change gives me pause: wouldn’t it be a problem in
non-English locales, where $sing_fmt changes before it is
used to set $plur_fmt?
Of course there is no problem because the code is equivalent to
$sing_fmt = $d->get($sing_fmt);
$plur_fmt = $d->get($plur_fmt);
(or at least Locale::gettext is advertised to work that way.)
diff --git i/git-svn.perl w/git-svn.perl
index 5252722..75e7165 100755
--- i/git-svn.perl
+++ w/git-svn.perl
@@ -5644,8 +5644,8 @@ sub show_commit_normal {
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);
+ $sing_fmt = $d->get($sing_fmt);
+ $plur_fmt = $d->get($plur_fmt);
}
if (my $l = $c->{l}) {
while ($l->[$#$l] eq "\n" && $#$l > 0
--
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH/WIP] git-svn: tweak log format to match "svn log" output
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
0 siblings, 1 reply; 9+ messages in thread
From: Eric Wong @ 2010-07-25 8:40 UTC (permalink / raw)
To: Jonathan Nieder; +Cc: Jens Seidel, git
Jonathan Nieder <jrnieder@gmail.com> wrote:
> Eric Wong wrote:
>
> > @@ -5646,8 +5644,8 @@ sub show_commit_normal {
> >
> > if ($can_localize) {
> > my $d = Locale::gettext->domain("subversion");
> > - $sing_fmt = $d->nget(" | %d line", " | %d lines", 1);
> > - $plur_fmt = $d->nget(" | %d line", " | %d lines", 10);
> > + $sing_fmt = $d->nget($sing_fmt, $plur_fmt, 1);
> > + $plur_fmt = $d->nget($sing_fmt, $plur_fmt, 10);
>
> This change gives me pause: wouldn’t it be a problem in
> non-English locales, where $sing_fmt changes before it is
> used to set $plur_fmt?
>
> Of course there is no problem because the code is equivalent to
>
> $sing_fmt = $d->get($sing_fmt);
> $plur_fmt = $d->get($plur_fmt);
>
> (or at least Locale::gettext is advertised to work that way.)
>
> diff --git i/git-svn.perl w/git-svn.perl
> index 5252722..75e7165 100755
> --- i/git-svn.perl
> +++ w/git-svn.perl
> @@ -5644,8 +5644,8 @@ sub show_commit_normal {
>
> 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);
> + $sing_fmt = $d->get($sing_fmt);
> + $plur_fmt = $d->get($plur_fmt);
> }
> if (my $l = $c->{l}) {
> while ($l->[$#$l] eq "\n" && $#$l > 0
Thanks Jonathan, that looks much better. I'll squash that on top
Jens' first patch.
--
Eric Wong
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH/WIP] git-svn: tweak log format to match "svn log" output
2010-07-25 8:40 ` Eric Wong
@ 2010-07-25 9:09 ` Jens Seidel
2010-07-25 17:52 ` Jens Seidel
0 siblings, 1 reply; 9+ messages in thread
From: Jens Seidel @ 2010-07-25 9:09 UTC (permalink / raw)
To: Eric Wong; +Cc: Jonathan Nieder, Jens Seidel, git
On Sun, Jul 25, 2010 at 08:40:57AM +0000, Eric Wong wrote:
> Jonathan Nieder <jrnieder@gmail.com> wrote:
> > diff --git i/git-svn.perl w/git-svn.perl
> > index 5252722..75e7165 100755
> > --- i/git-svn.perl
> > +++ w/git-svn.perl
> > @@ -5644,8 +5644,8 @@ sub show_commit_normal {
> >
> > 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);
> > + $sing_fmt = $d->get($sing_fmt);
> > + $plur_fmt = $d->get($plur_fmt);
> > }
> > if (my $l = $c->{l}) {
> > while ($l->[$#$l] eq "\n" && $#$l > 0
>
> Thanks Jonathan, that looks much better. I'll squash that on top
> Jens' first patch.
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 :-)
Jens
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/1] git svn: remove extraneous newline from log output
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
0 siblings, 1 reply; 9+ messages in thread
From: Jens Seidel @ 2010-07-25 17:35 UTC (permalink / raw)
To: git; +Cc: Jonathan Nieder, Eric Wong
[-- Attachment #1: Type: text/plain, Size: 934 bytes --]
Hi Eric,
On Sun, Jul 25, 2010 at 08:13:44AM +0000, Eric Wong wrote:
> This is to match the output of "svn log", which does not
> add an extra newline before the next log entry.
thanks for the patch but it doesn't work in the general case.
I attached a sample Subversion repository dump where the output of
git svn log and svn log still differs by empty lines.
I also noticed the following error:
Can't use an undefined value as an ARRAY reference at
/usr/lib/git-core/git-svn line 5717, <$fh> line 53.
I'm not sure whether I introduced this error once I patched
git-svn ...
The affected line is the second one in:
} elsif (/^${esc_color} (git-svn-id:.+)$/o) {
if (@{$c->{l}} && $c->{l}->[-1] eq "\n") {
pop @{$c->{l}};
}
(is -1 valid?)
Jens
[-- Attachment #2: svn.log --]
[-- Type: text/plain, Size: 851 bytes --]
------------------------------------------------------------------------
r5 | jens | 2010-07-25 19:08:18 +0200 (So, 25. Jul 2010) | 4 lines
2 trailing newlines
------------------------------------------------------------------------
r4 | jens | 2010-07-25 19:07:42 +0200 (So, 25. Jul 2010) | 3 lines
trailing newline
------------------------------------------------------------------------
r3 | jens | 2010-07-25 19:06:58 +0200 (So, 25. Jul 2010) | 3 lines
one linebreak
line 2
------------------------------------------------------------------------
r2 | jens | 2010-07-25 19:06:05 +0200 (So, 25. Jul 2010) | 1 line
linebreak
------------------------------------------------------------------------
r1 | jens | 2010-07-25 19:05:21 +0200 (So, 25. Jul 2010) | 1 line
------------------------------------------------------------------------
[-- Attachment #3: git-svn.log --]
[-- Type: text/plain, Size: 740 bytes --]
------------------------------------------------------------------------
r5 | jens | 2010-07-25 19:08:18 +0200 (So, 25. Jul 2010) | 2 lines
2 trailing newlines
------------------------------------------------------------------------
r4 | jens | 2010-07-25 19:07:42 +0200 (So, 25. Jul 2010) | 2 lines
trailing newline
------------------------------------------------------------------------
r3 | jens | 2010-07-25 19:06:58 +0200 (So, 25. Jul 2010) | 3 lines
one linebreak
line 2
------------------------------------------------------------------------
r2 | jens | 2010-07-25 19:06:05 +0200 (So, 25. Jul 2010) | 1 line
linebreak
Can't use an undefined value as an ARRAY reference at
/usr/lib/git-core/git-svn line 5717, <$fh> line 53.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #4: repos.dump --]
[-- Type: text/plain; charset=base64, Size: 1937 bytes --]
SVN-fs-dump-format-version: 2
UUID: 83f09cc9-4635-489b-9736-9fad07b44175
Revision-number: 0
Prop-content-length: 56
Content-length: 56
K 8
svn:date
V 27
2010-07-25T17:03:46.899612Z
PROPS-END
Revision-number: 1
Prop-content-length: 98
Content-length: 98
K 7
svn:log
V 0
K 10
svn:author
V 4
jens
K 8
svn:date
V 27
2010-07-25T17:05:21.869208Z
PROPS-END
Node-path: file
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 0
Text-content-md5: d41d8cd98f00b204e9800998ecf8427e
Content-length: 10
PROPS-END
Revision-number: 2
Prop-content-length: 107
Content-length: 107
K 7
svn:log
V 9
linebreak
K 10
svn:author
V 4
jens
K 8
svn:date
V 27
2010-07-25T17:06:05.643604Z
PROPS-END
Node-path: file
Node-kind: file
Node-action: change
Text-content-length: 13
Text-content-md5: dcf4e97bd1c01e863bf8989b23429f9c
Content-length: 13
no linebreak
Revision-number: 3
Prop-content-length: 120
Content-length: 120
K 7
svn:log
V 21
one linebreak
line 2
K 10
svn:author
V 4
jens
K 8
svn:date
V 27
2010-07-25T17:06:58.264468Z
PROPS-END
Node-path: file
Node-kind: file
Node-action: change
Text-content-length: 21
Text-content-md5: 4e70c8b04910e92f9cc7fbd6424352f0
Content-length: 21
one linebreak
line 2
Revision-number: 4
Prop-content-length: 117
Content-length: 117
K 7
svn:log
V 18
trailing newline
K 10
svn:author
V 4
jens
K 8
svn:date
V 27
2010-07-25T17:07:42.901800Z
PROPS-END
Node-path: file
Node-kind: file
Node-action: change
Text-content-length: 19
Text-content-md5: b20aeff36821448c3bc3c85942bc1fc5
Content-length: 19
trailing newline
Revision-number: 5
Prop-content-length: 121
Content-length: 121
K 7
svn:log
V 22
2 trailing newlines
K 10
svn:author
V 4
jens
K 8
svn:date
V 27
2010-07-25T17:08:18.343554Z
PROPS-END
Node-path: file
Node-kind: file
Node-action: change
Text-content-length: 23
Text-content-md5: e1314ce7619ef512653071d690dbd789
Content-length: 23
2 trailing newlines
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH/WIP] git-svn: tweak log format to match "svn log" output
2010-07-25 9:09 ` Jens Seidel
@ 2010-07-25 17:52 ` Jens Seidel
0 siblings, 0 replies; 9+ messages in thread
From: Jens Seidel @ 2010-07-25 17:52 UTC (permalink / raw)
To: git; +Cc: Jens Seidel, Eric Wong, Jonathan Nieder
[-- 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
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/1] git svn: remove extraneous newline from log output
2010-07-25 17:35 ` Jens Seidel
@ 2010-07-26 19:09 ` Eric Wong
0 siblings, 0 replies; 9+ messages in thread
From: Eric Wong @ 2010-07-26 19:09 UTC (permalink / raw)
To: Jens Seidel; +Cc: git, Jonathan Nieder
Jens Seidel <jensseidel@users.sf.net> wrote:
> Hi Eric,
>
> On Sun, Jul 25, 2010 at 08:13:44AM +0000, Eric Wong wrote:
> > This is to match the output of "svn log", which does not
> > add an extra newline before the next log entry.
>
> thanks for the patch but it doesn't work in the general case.
>
> I attached a sample Subversion repository dump where the output of
> git svn log and svn log still differs by empty lines.
>
> I also noticed the following error:
> Can't use an undefined value as an ARRAY reference at
> /usr/lib/git-core/git-svn line 5717, <$fh> line 53.
>
> I'm not sure whether I introduced this error once I patched
> git-svn ...
> The affected line is the second one in:
> } elsif (/^${esc_color} (git-svn-id:.+)$/o) {
> if (@{$c->{l}} && $c->{l}->[-1] eq "\n") {
> pop @{$c->{l}};
> }
> (is -1 valid?)
Yes, -1 is valid but $c->{l} may not exist at that point..
But I had forgotten about a similar piece of code in the
"show_commit_normal" subroutine which does a similar job:
while ($l->[$#$l] eq "\n" && $#$l > 0
&& $l->[($#$l - 1)] eq "\n") {
pop @$l;
}
This is partially because SVN doesn't enforce a trailing "\n" in
commit messages (unlike "git commit"), so we always append one
when we fetch and add "\ngit-svn-id: ...\n". But then we also
need to take noMetadata users into account, too.
I'll let you ponder issues with this since you appear to care more than
I do about completely matching SVN output :)
For what it's worth, over the years, nobody ever "outed" me as a git-svn
user in SVN projects when I shared log output. Some folks worked with
for years in the same offices and never made indication to knowing I
used git-svn (even after they started using it themselves).
--
Eric Wong
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2010-07-26 19:09 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[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 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).