git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH/WIP] git-svn: tweak log format to match "svn log" output

From
JSJens Seidel <jensseidel@users.sf.net>
Date
Jul 25, 2010, 17:52 UTC
Message-ID
<20100725175237.GB7930@merkur.sol.de>
In-Reply-To
<20100725090943.GA1998@merkur.sol.de>
On Sun, Jul 25, 2010 at 11:09:46AM +0200, Jens Seidel wrote:
Show 13 quoted lines
> 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";
 


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
Previous: Jens Seidel
Message 9 of 9 in “git-svn: tweak log format to match "svn log" output”
  1. git-svn: tweak log format to match "svn log" outputJonathan Nieder, Jul 25, 2010
  2. Eric WongJul 25, 2010
  3. 2/1 git svn: remove extraneous newline from log outputEric Wong, Jul 25, 2010
  4. Jens SeidelJul 25, 2010
  5. Eric WongJul 26, 2010
  6. Jonathan NiederJul 25, 2010
  7. Eric WongJul 25, 2010
  8. Jens SeidelJul 25, 2010
  9. Jens SeidelJul 25, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.