# ./diff_po.pl cs.po.old cs.po
# svn diff -r38367 --diff-cmd ./diff_po.pl cs.po
# git difftool --extcmd=./diff_po.pl sk.po
-# ./diff_po.pl -r HEAD~100 cs.po #fetch git revision and compare
+# ./diff_po.pl -rHEAD~100 cs.po #fetch git revision and compare
# ./diff_po.pl -r39229 cs.po #fetch svn revision and compare
+# ./diff_po.pl -r-1 cs.po #fetch the previous change of cs.po and compare
#
# This file is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public
# TODO:
# 1.) Search for good correlations of deleted <==> inserted string
# using Text::Levenshtein or Algorithm::Diff
+#
+# val: '0' | '1' ;
+#
+# fuzzyopt: '--display-fuzzy=' val ;
+#
+# untranslatedopt: '--display-untranslated=' val ;
+#
+# option: fuzzyopt
+# | untranslatedopt
+# ;
+# options: | options option
+# ;
+#
+# revspec: revision-tag # e.g. 46c00bab7
+# | 'HEAD' relative-rev # e.g. HEAD~3, HEAD-3
+# | '-' number # -1 == previous commit of the following po-file
+# ;
+#
+# revision: '-r' revspec ;
+#
+# filespecold: revision | filespec ;
+#
+# filespec: # path to existing po-file
+#
+# filespecnew: filespec ;
+#
+# files: filespecold filespecnew ;
+#
+# diff: 'diff_po.pl' ' ' options files
+#
BEGIN {
use File::Spec;
unshift(@INC, "$p");
}
+# Prototypes
+sub get_env_name($ );
+sub buildParentDir($$);
+sub searchRepo($);
+sub diff_po(@);
+sub check_po_file_readable($$);
+sub printDiff($$$$);
+sub printIfDiff($$$);
+sub printExtraMessages($$$);
+sub getrev($$$);
+#########
+
use strict;
use parsePoLine;
use Term::ANSIColor qw(:constants);
# 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);
+ my $e = get_env_name($opt);
if (defined($e)) {
if (defined($ENV{$e})) {
$options{$opt} = $ENV{$e};
$val = $1;
if (defined($options{$opt})) {
$options{$opt} = $val;
- my $e = &get_env_name($opt);
+ my $e = get_env_name($opt);
if (defined($e)) {
$ENV{$e} = $val;
}
$filedir = ".";
}
$filedir = getcwd();
- my ($repo, $level) = &searchRepo($filedir);
+ my ($repo, $level) = searchRepo($filedir);
my $relargf = $baseargf; # argf relative to the top-most repo directory
my $topdir;
if (defined($level)) {
exit(-1);
}
#check po-file
- &check_po_file_readable($baseargf, $relargf);
+ check_po_file_readable($baseargf, $relargf);
if ($repo eq ".git") {
my @args = ();
my $tmpfile = File::Temp->new();
- $rev = &getrev($repo, $rev, $argf);
+ $rev = getrev($repo, $rev, $argf);
push(@args, "-L", $argf . " (" . $rev . ")");
push(@args, "-L", $argf . " (local copy)");
print "git show $rev:$relargf\n";
$tmpfile->seek( 0, SEEK_END ); # Flush()
push(@args, $tmpfile->filename, $argf);
print "===================================================================\n";
- &diff_po(@args);
+ diff_po(@args);
}
elsif ($repo eq ".svn") {
# program svnversion needed here
- $rev = &getrev($repo, $rev, $argf);
+ $rev = getrev($repo, $rev, $argf);
# call it again indirectly
my @cmd = ("svn", "diff", "-r$rev", "--diff-cmd", $0, $relargf);
print "cmd = " . join(' ', @cmd) . "\n";
# [extensions]
# hgext.extdiff =
#
- $rev = &getrev($repo, $rev, $argf);
+ $rev = getrev($repo, $rev, $argf);
my @cmd = ("hg", "extdiff", "-r", "$rev", "-p", $0, $relargf);
print "cmd = " . join(' ', @cmd) . "\n";
system(@cmd);
}
}
else {
- &diff_po(@ARGV);
+ diff_po(@ARGV);
}
exit($result);
#########################################################
# This routine builds n-th parent-path
-# E.g. &buildParentDir("abc", 1) --> "abc/.."
-# &buildParentDir("abc", 4) --> "abc/../../../.."
+# E.g. buildParentDir("abc", 1) --> "abc/.."
+# buildParentDir("abc", 4) --> "abc/../../../.."
sub buildParentDir($$)
{
my ($dir, $par) = @_;
if ($par > 0) {
- return &buildParentDir("$dir/..", $par-1);
+ return buildParentDir("$dir/..", $par-1);
}
else {
return $dir;
{
my ($dir) = @_;
for my $parent ( 0 .. 10 ) {
- my $f = &buildParentDir($dir, $parent);
+ my $f = buildParentDir($dir, $parent);
for my $s (".git", ".svn", ".hg") {
if (-d "$f/$s") {
#print "Found repo on level $parent\n";
return(""); # not found
}
-sub diff_po($$)
+sub diff_po(@)
{
my @args = @_;
%Messages = ();
die("names = \"", join('" "', @names) . "\"... args = \"" . join('" "', @args) . "\" Expected exactly 2 parameters");
}
- &check_po_file_readable($names[0], $args[0]);
- &check_po_file_readable($names[1], $args[1]);
+ check_po_file_readable($names[0], $args[0]);
+ check_po_file_readable($names[1], $args[1]);
- &parse_po_file($args[0], \%Messages);
- &parse_po_file($args[1], \%newMessages);
+ parse_po_file($args[0], %Messages);
+ parse_po_file($args[1], %newMessages);
- my @MsgKeys = &getLineSortedKeys(\%newMessages);
+ my @MsgKeys = getLineSortedKeys(%newMessages);
print RED "<<< \"$names[0]\"\n", RESET;
print GREEN ">>> \"$names[1]\"\n", RESET;
}
}
if (exists($Messages{$k})) {
- &printIfDiff($k, $Messages{$k}, $newMessages{$k});
+ printIfDiff($k, $Messages{$k}, $newMessages{$k});
delete($Messages{$k});
delete($newMessages{$k});
}
}
}
else {
- @MsgKeys = &getLineSortedKeys(\%Messages);
+ @MsgKeys = getLineSortedKeys(%Messages);
for my $k (@MsgKeys) {
$result |= 8;
print "deleted message\n";
print RED "< msgstr = \"" . $Messages{$k}->{msgstr} . "\"\n", RESET;
}
- @MsgKeys = &getLineSortedKeys(\%newMessages);
+ @MsgKeys = getLineSortedKeys(%newMessages);
for my $k (@MsgKeys) {
$result |= 16;
print "new message\n";
}
}
if ($options{"--display-fuzzy"}) {
- &printExtraMessages("fuzzy", \%Fuzzy, \@names);
+ printExtraMessages("fuzzy", \%Fuzzy, \@names);
}
if ($options{"--display-untranslated"}) {
- &printExtraMessages("untranslated", \%Untranslated, \@names);
+ printExtraMessages("untranslated", \%Untranslated, \@names);
}
}
print "diffline = " . $rM->{line} . "," . $rnM->{line} . "\n" if ($printlines);
print " msgid = \"$k\"\n";
if ($rM->{fuzzy} eq $rnM->{fuzzy}) {
- print " fuzzy = " . $rM->{fuzzy} . "\n" if ($printlines);
+ print " fuzzy = \"" . $rM->{fuzzy} . "\"\n" if ($printlines);
}
else {
- print RED "< fuzzy = " . $rM->{fuzzy} . "\n", RESET;
+ print RED "< fuzzy = \"" . $rM->{fuzzy} . "\"\n", RESET;
}
- print RED "< msgstr = " . $rM->{msgstr} . "\n", RESET;
+ print RED "< msgstr = \"" . $rM->{msgstr} . "\"\n", RESET;
if ($k ne $nk) {
print GREEN "> msgid = \"$nk\"\n", RESET;
}
if ($rM->{fuzzy} ne $rnM->{fuzzy}) {
- print GREEN "> fuzzy = " . $rnM->{fuzzy} . "\n", RESET;
+ print GREEN "> fuzzy = \"" . $rnM->{fuzzy} . "\"\n", RESET;
}
- print GREEN "> msgstr = " . $rnM->{msgstr} . "\n", RESET;
+ print GREEN "> msgstr = \"" . $rnM->{msgstr} . "\"\n", RESET;
print "\n";
}
$doprint = 1 if ($rM->{msgstr} ne $rnM->{msgstr});
if ($doprint) {
$result |= 4;
- &printDiff($k, $k, $rM, $rnM);
+ printDiff($k, $k, $rM, $rnM);
}
}