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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Jens Seidel <jensseidel@xxxxxxxxxxxx>

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@xxxxxxxxx>
---
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
-- 
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]