]> git.lyx.org Git - lyx.git/commitdiff
Modified the revision selection while comparing po-files$
authorKornel Benko <kornel@lyx.org>
Wed, 25 Sep 2013 14:43:23 +0000 (16:43 +0200)
committerKornel Benko <kornel@lyx.org>
Wed, 25 Sep 2013 14:43:23 +0000 (16:43 +0200)
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.

po/diff_po.pl

index 7f4fba0c20e700ebbefcb52aa17fd8d5a87c6c4e..cd4d3ef88785707eddecda4248a780442adbfdf8 100755 (executable)
@@ -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;
 }