commit f986eca10f367e6f1d1f20665041f9c65a6b2389
Author: Kornel Benko <[email protected]>
Date: Wed Sep 25 16:43:23 2013 +0200
Modified the revision selection while comparing po-files$
If revision-parameter is set to e.g. '-3', now we search for the previous
3-rd change of the relevant po-file instead of the previous 3-rd commit.
We now also pass options through the environment, though it is not needed
for git.
This way we overcome the deficiency of "hg" and "svn", which do not allow
to pass self-defined options to underlying diff-command.
diff --git a/po/diff_po.pl b/po/diff_po.pl
index 7f4fba0..cd4d3ef 100755
--- a/po/diff_po.pl
+++ b/po/diff_po.pl
@@ -60,10 +60,37 @@ my %options = (
# Check for options
my ($opt, $val);
+
+sub get_env_name($)
+{
+ my ($e) = @_;
+ return undef if ($e !~ s/^\-\-//);
+ $e = uc($e);
+ $e =~ s/\-/_/g;
+ return "DIFF_PO_" . $e;
+}
+
+# Set option-defaults from environment
+# git: not needed, diff is not recursive here
+# svn: needed to pass options through --diff-cmd parameter
+# hg: needed to pass options through extdiff parameter
+for my $opt (keys %options) {
+ my $e = &get_env_name($opt);
+ if (defined($e)) {
+ if (defined($ENV{$e})) {
+ $options{$opt} = $ENV{$e};
+ }
+ }
+}
+
while (($opt=$ARGV[0]) =~ s/=(\d+)$//) {
$val = $1;
if (defined($options{$opt})) {
$options{$opt} = $val;
+ my $e = &get_env_name($opt);
+ if (defined($e)) {
+ $ENV{$e} = $val;
+ }
shift(@ARGV);
}
else {
@@ -119,7 +146,7 @@ if ($ARGV[0] =~ /^-r(.*)/) {
if ($repo eq ".git") {
my @args = ();
my $tmpfile = File::Temp->new();
- $rev = &getrev($repo, $rev);
+ $rev = &getrev($repo, $rev, $argf);
push(@args, "-L", $argf . " (" . $rev . ")");
push(@args, "-L", $argf . " (local copy)");
print "git show $rev:$relargf\n";
@@ -136,7 +163,7 @@ if ($ARGV[0] =~ /^-r(.*)/) {
}
elsif ($repo eq ".svn") {
# program svnversion needed here
- $rev = &getrev($repo, $rev);
+ $rev = &getrev($repo, $rev, $argf);
# call it again indirectly
my @cmd = ("svn", "diff", "-r$rev", "--diff-cmd", $0, $relargf);
print "cmd = " . join(' ', @cmd) . "\n";
@@ -148,7 +175,7 @@ if ($ARGV[0] =~ /^-r(.*)/) {
# [extensions]
# hgext.extdiff =
#
- $rev = &getrev($repo, $rev);
+ $rev = &getrev($repo, $rev, $argf);
my @cmd = ("hg", "extdiff", "-r", "$rev", "-p", $0, $relargf);
print "cmd = " . join(' ', @cmd) . "\n";
system(@cmd);
@@ -201,12 +228,14 @@ sub diff_po($$)
%Untranslated = ();
%Fuzzy = ();
@names = ();
+ my $switchargs = 0;
while(defined($args[0])) {
last if ($args[0] !~ /^\-/);
my $param = shift(@args);
if ($param eq "-L") {
my $name = shift(@args);
push(@names, $name);
+ $switchargs = 1;
}
}
if (! defined($names[0])) {
@@ -220,6 +249,11 @@ sub diff_po($$)
die("names = \"", join('" "', @names) . "\"... args = \"" . join('" "',
@args) . "\" Expected exactly 2 parameters");
}
+ if ($switchargs) {
+ my $tmp = $args[0];
+ $args[0] = $args[1];
+ $args[1] = $tmp;
+ }
&check_po_file_readable($names[0], $args[0]);
&check_po_file_readable($names[1], $args[1]);
@@ -365,9 +399,9 @@ sub printExtraMessages($$$)
#
# get repository dependent revision representation
-sub getrev($$)
+sub getrev($$$)
{
- my ($repo, $rev) = @_;
+ my ($repo, $rev, $argf) = @_;
my $revnum;
if ($rev eq "HEAD") {
@@ -378,22 +412,68 @@ sub getrev($$)
$revnum = $2;
}
if ($repo eq ".hg") {
- return "-$revnum";
+ # try to get the revision of n-th previous change of the po-file
+ if (open(FIR, "hg log '$argf'|")) {
+ my $count = $revnum;
+ my $res = "-$revnum";
+ while (my $l = <FIR>) {
+ chomp($l);
+ if ($l =~ /:\s+(\d+):([^\s]+)$/) {
+ $res = $2;
+ last if ($count-- <= 0);
+ }
+ }
+ close(FIR);
+ return($res);
+ }
+ else {
+ return "-$revnum";
+ }
}
elsif ($repo eq ".git") {
- return("HEAD~$revnum");
+ # try to get the revision of n-th previous change of the po-file
+ if (open(FIR, "git log --skip=$revnum -1 '$argf'|")) {
+ my $res = "HEAD~$revnum";
+ while (my $l = <FIR>) {
+ chomp($l);
+ if ($l =~ /^commit\s+([^\s]+)$/) {
+ $res = $1;
+ last;
+ }
+ }
+ close(FIR);
+ return($res);
+ }
+ else {
+ return("HEAD~$revnum");
+ }
}
elsif ($repo eq ".svn") {
- if (open(VI, "svnversion |")) {
- while (my $r1 = <VI>) {
- chomp($r1);
- if ($r1 =~ /^((\d+):)?(\d+)M?$/) {
- $rev = $3-$revnum;
+ if (open(FIR, "svn log '$argf'|")) {
+ my $count = $revnum;
+ my $res = $rev;
+ while (my $l = <FIR>) {
+ chomp($l);
+ if ($l =~ /^r(\d+)\s+\|/) {
+ $res = $1;
+ last if ($count-- <= 0);
+ }
+ }
+ close(FIR);
+ return $res;
+ }
+ else {
+ if (open(VI, "svnversion |")) {
+ while (my $r1 = <VI>) {
+ chomp($r1);
+ if ($r1 =~ /^((\d+):)?(\d+)M?$/) {
+ $rev = $3-$revnum;
+ }
}
+ close(VI);
}
- close(VI);
+ return $rev;
}
- return $rev;
}
return $rev;
}