) {
if ($ARG =~ /Package:\s+(.+)$/) {
$sourcePackage = $1
}
if ($sourcePackage ne "") {
$sourcePackagesDependingOnLibmeegotouch{$sourcePackage} = "yes";
}
}
close (APTSHOW);
}
for my $sourcePackage (sort (keys %sourcePackagesDependingOnLibmeegotouch)) {
push (@sourcePackagesToDownloadAndScan, $sourcePackage);
}
}
sub findEngineeringEnglishFiles {
my %engineeringEnglishPackages = ();
for my $package (@engineeringEnglishPackages) {
if (grep(/^${package}$/, @engineeringEnglishPackagesObsolete)
|| grep(/^${package}$/, @engineeringEnglishPackagesIgnore)
|| grep(/^${package}$/, @engineeringEnglishPackagesBroken)) {
if ($OPT_VERBOSITY >=1) {
printf (STDOUT "ignoring %s\n", $package);
}
}
else {
$engineeringEnglishPackages{$package} = "";
}
}
@engineeringEnglishPackages = (sort (keys %engineeringEnglishPackages));
my @engineeringEnglishFiles = ();
for my $package (@engineeringEnglishPackages) {
if ($OPT_VERBOSITY >= 1) {
printf (STDOUT "using %s\n", $package);
}
my @qmFiles = grep (/\.qm$/, qx(dpkg -L $package));
if ($#qmFiles < 0) {
printf (STDOUT "ERROR: %s has no .qm files.\n", $package);
exit (1);
}
else {
for my $file (@qmFiles) {
chomp ($file);
if ($OPT_VERBOSITY >= 1) {
printf (STDOUT " %s\n", $file);
}
push (@engineeringEnglishFiles, $file);
}
}
}
return @engineeringEnglishFiles;
}
sub readHandoffXmlTrees {
for my $handoffFile (glob ("$OPT_HANDOFF_DIR/*.ts")) {
my $xmlParser = new XML::Parser(Style => 'Tree', ProtocolEncoding => 'UTF-8');
if ($OPT_VERBOSITY >= 1) {
printf STDOUT "parsing %s\n", $handoffFile;
}
$handoffXmlTrees{$handoffFile} = $xmlParser->parsefile($handoffFile);
}
}
sub getIdsFromOneContextTreeFromSourcePackages {
my (@contextTree) = @_;
#print Dumper(@contextTree);
if ($contextTree[3] ne "name") {
printf STDERR "context tree has no name tag. Should not happen, exiting...\n";
myExit(1);
}
my $name = $contextTree[3+1][2];
if ($name ne "") {
printf STDOUT "ignoring context tree with non-empty name “%s”\n", $name;
}
else {
for (my $i = 0; $i < $#contextTree; ++$i) {
if ($contextTree[$i] eq "message") {
my @messageTree = @{$contextTree[$i+1]};
my $messageId = $messageTree[0]{"id"};
my $source = "";
my $location = "";
for (my $j = 0; $j < $#messageTree; ++$j) {
SWITCH: {
if ($messageTree[$j] eq "source") {
$source = $messageTree[$j+1][2];
last SWITCH;
}
if ($messageTree[$j] eq "location") {
my @locationTree = @{$messageTree[$j+1]};
my $filename = $locationTree[0]{"filename"};
my $line = $locationTree[0]{"line"};
if (!defined $filename) {
$filename = "unknown";
}
if (!defined $line) {
$line = "unknown";
}
if ($location eq "") {
$location = "filename=$filename line=$line";
}
else {
$location .= ", filename=$filename line=$line";
}
last SWITCH;
}
}
}
if (defined $messageId) { # ignore messages which do not have ids
$idsFromSourcePackages{$messageId} = $location;
}
}
}
}
$totalNumberOfIdsFromSourcePackages = scalar (keys %idsFromSourcePackages);
}
sub getIdsFromHandoffFiles {
for my $handoffFile (@handoffFiles) {
my $tree = $handoffXmlTrees{$handoffFile};
my @tsTree = @{$tree->[1]};
# print Dumper(@tsTree);
my $extra_application_info = "";
my $extra_ui_spec_document = "";
my $extra_ts_date = "";
my $extra_ts_macroversion = "";
my @contextTree = ();
for (my $i = 0; $i < $#tsTree; ++$i) {
SWITCH: {
if ($tsTree[$i] eq "extra-application-info") {
$extra_application_info = $tsTree[$i+1][2];
last SWITCH;
}
if ($tsTree[$i] eq "extra-uispec-document") {
$extra_ui_spec_document = $tsTree[$i+1][2];
last SWITCH;
}
if ($tsTree[$i] eq "extra-ts-date") {
$extra_ts_date = $tsTree[$i+1][2];
last SWITCH;
}
if ($tsTree[$i] eq "extra-ts-macroversion") {
$extra_ts_macroversion = $tsTree[$i+1][2];
last SWITCH;
}
if ($tsTree[$i] eq "context") {
@contextTree = @{$tsTree[$i+1]};
last SWITCH;
}
}
}
for (my $i = 0; $i < $#contextTree; ++$i) {
if ($contextTree[$i] eq "message") {
my @messageTree = @{$contextTree[$i+1]};
my $messageId = $messageTree[0]{"id"};
my $source = "";
my $extracomment = "";
for (my $j = 0; $j < $#messageTree; ++$j) {
SWITCH: {
if ($messageTree[$j] eq "source") {
$source = $messageTree[$j+1][2];
last SWITCH;
}
if ($messageTree[$j] eq "extracomment") {
$extracomment = $messageTree[$j+1][2];
last SWITCH;
}
}
}
my $messageIdSpecDescription = "";
$messageIdSpecDescription .= "uispec-document=“$extra_ui_spec_document” ";
$messageIdSpecDescription .= "ts-file=“" . myBasename($handoffFile) . "” ";
$messageIdSpecDescription .= "ts-date=“$extra_ts_date” ";
$messageIdSpecDescription .= "source-english=“$source” ";
$messageIdSpecDescription .= "extracomment=“$extracomment” ";
if (defined $idsFromHandoffFiles{$messageId}
&& $idsFromHandoffFiles{$messageId} ne "") {
$idsFromHandoffFiles{$messageId} .= " ☺ $messageIdSpecDescription";
}
else {
$idsFromHandoffFiles{$messageId} = "$messageIdSpecDescription";
}
# init this id in the hash used later to check
# whether this id is used:
$idsFromSpecUsage{$messageId} = "";
}
}
}
}
sub getIdsFromSourcePackages {
@sourcePackagesScanned = glob ("$OPT_SOURCEPACKAGES_DIR/*.tar.gz");
my $sourcePackagesTsFile = "$OPT_SOURCEPACKAGES_DIR/sourcepackages.ts";
unlink ($sourcePackagesTsFile);
my $command = "lupdate /usr/bin/lupdate -no-obsolete -locations absolute -no-ui-lines -no-sort -extensions ui,c,c++,cc,cpp,cxx,ch,h,h++,hh,hpp,hxx $OPT_SOURCEPACKAGES_DIR -ts $sourcePackagesTsFile";
if (mySystem($command)) {
printf (STDERR "“%s” didn’t work.\n", $command);
exit (1);
}
else {
printf (STDOUT "“%s” OK.\n", $command);
}
my $xmlParser = new XML::Parser(Style => 'Tree', ProtocolEncoding => 'UTF-8');
if ($OPT_VERBOSITY >= 1) {
printf STDOUT "parsing %s\n", $sourcePackagesTsFile;
}
my $tree = $xmlParser->parsefile($sourcePackagesTsFile);
my @tsTree = @{$tree->[1]};
# print Dumper(@tsTree);
my @contextTree = ();
for (my $i = 0; $i < $#tsTree; ++$i) {
SWITCH: {
if ($tsTree[$i] eq "context") {
@contextTree = @{$tsTree[$i+1]};
# print Dumper(@contextTree);
getIdsFromOneContextTreeFromSourcePackages(@contextTree);
last SWITCH;
}
}
}
}
sub checkMessageIdFromEngineeringEnglishAgainstHandoff {
my ($engineeringEnglishFile, $eeMessageId, $htmlOutRef) = @_;
my $eeMessageIdIsInSpec = 0;
if (defined $idsFromHandoffFiles{$eeMessageId}) {
$eeMessageIdIsInSpec = 1;
if ($OPT_VERBOSITY >= 2) {
printf STDOUT "++++++OK: id “%s” spec: %s\n",
$eeMessageId, $idsFromHandoffFiles{$eeMessageId};
}
${$htmlOutRef} .= "";
${$htmlOutRef} .= sprintf "%s
\nfound in spec: %s\n",
$eeMessageId, $idsFromHandoffFiles{$eeMessageId};
${$htmlOutRef} .= "\n";
my $engineeringEnglishFileBasename =
myBasename($engineeringEnglishFile);
if(defined $idsFromSpecUsage{$eeMessageId}
&& $idsFromSpecUsage{$eeMessageId} ne "") {
$idsFromSpecUsage{$eeMessageId} .=
", $engineeringEnglishFileBasename";
}
else {
$idsFromSpecUsage{$eeMessageId}
= $engineeringEnglishFileBasename;
}
}
else {
$eeMessageIdIsInSpec = 0;
if ($OPT_VERBOSITY >= 2) {
printf STDOUT "***ERROR: id “%s” not found in spec\n", $eeMessageId;
}
${$htmlOutRef} .= "";
${$htmlOutRef} .= sprintf "%s", $eeMessageId;
${$htmlOutRef} .= "\n";
}
return $eeMessageIdIsInSpec;
}
sub compareIdsFromEngineeringEnglishPackagesWithSpec {
$htmlOutIdsFromEePackagesSummaryTable .= <<"EOF";
Overview of the number of IDs found in Engineering English packages
and whether they are found or not found in the specifications.
Click on the file name of the .qm file for details.
Debian package name
|
version
|
Engineering English .qm file
|
IDs in spec
|
Invalid IDs
|
Missing EE
|
EOF
for my $engineeringEnglishFile (findEngineeringEnglishFiles()) {
my $errorCount = 0;
my $okCount = 0;
my $missingEngineeringEnglishCount = 0;
my $debianPackage = qx(dpkg -S $engineeringEnglishFile);
$debianPackage =~ s/:.*$//;
chomp($debianPackage);
my $debianPackageMaintainerFull = "Unknown <unknown\@unknown.com%gt;";
my $debianPackageMaintainerMail = "unknown\@unknown.com";
my $debianPackageVersion = "";
my $debianPackageDescription = "";
open (STATUS, "dpkg -s $debianPackage |") || die "Can’t open dpkg -s $debianPackage | : $!";
binmode STATUS, ":utf8";
while () {
if ($ARG =~ /Maintainer:\s+(.+)$/) {
$debianPackageMaintainerFull = $1;
$debianPackageMaintainerFull =~ /<(.+)>/;
$debianPackageMaintainerMail = $1;
$debianPackageMaintainerFull =~ s/</;
$debianPackageMaintainerFull =~ s/>/>/;
}
if ($ARG =~ /Version:\s+(.+)$/) {
$debianPackageVersion = $1;
}
if ($ARG =~ /Description:\s+(.+)$/) {
$debianPackageDescription = $1;
}
}
my $dpkgStatusDetails = qx(dpkg -s $debianPackage);
if ($OPT_VERBOSITY >= 1) {
printf STDOUT "------------------------------------------------------------\n";
printf STDOUT "checking “%s” from package “%s”\n", $engineeringEnglishFile, $debianPackage;
}
my $htmlOutOkList = "";
my $htmlOutErrorList = "";
my $htmlOutMissingEeList = "";
my $xmlParser = new XML::Parser(Style => 'Tree');
open (EEFILE, "lconvert -o - -i $engineeringEnglishFile |") || die "Can’t open file lconvert $engineeringEnglishFile | : $!";
my $tree = $xmlParser->parse(*EEFILE, ProtocolEncoding => 'UTF-8');
close(EEFILE);
if (! $tree->[1][4]) {
if ($OPT_VERBOSITY >=1) {
printf STDOUT "%s has no context tree, probably empty, skipping ...\n",
$engineeringEnglishFile;
}
next;
}
my @contextTree = @{$tree->[1][4]};
# print Dumper(@contextTree);
for (my $i = 0; $i < $#contextTree; ++$i) {
if ($contextTree[$i] eq "message") {
my $source = $contextTree[$i+1][4][2];
$idsFoundInEePackages{$source} = "";
my $translation = $contextTree[$i+1][8][2];
if (!$translation || $translation eq "!! " || $translation eq "") {
++$missingEngineeringEnglishCount;
++$totalNumberOfIdsFoundInEePackagesLackingEngineeringEnglish;
my $htmlOutMissingEeMessage = "";
$htmlOutMissingEeMessage .= "";
$htmlOutMissingEeMessage .= sprintf "%s", $source;
$htmlOutMissingEeMessage .= "\n";
$htmlOutMissingEeList .= $htmlOutMissingEeMessage;
}
my $htmlOutMessage = "";
my $eeMessageIdIsInSpec =
checkMessageIdFromEngineeringEnglishAgainstHandoff($engineeringEnglishFile, $source, \$htmlOutMessage);
if ($eeMessageIdIsInSpec == 1) {
++$okCount;
$htmlOutOkList .= $htmlOutMessage;
}
else {
++$errorCount;
++$totalNumberOfIdsFoundInEePackagesButNotInSpec;
$htmlOutErrorList .= $htmlOutMessage;
$csvOut .= "$source,$engineeringEnglishFile,$debianPackage,$debianPackageVersion,$debianPackageMaintainerMail\n";
}
}
}
$htmlOutIdsFromEePackagesDetail .= <<"EOF";
$engineeringEnglishFile
IDs in spec:
$okCount
EOF
$class = $errorCount? "errorcolor" : "okcolor";
$htmlOutIdsFromEePackagesDetail .= <<"EOF";
Invalid IDs:
$errorCount
EOF
$class = $missingEngineeringEnglishCount? "errorcolor" : "okcolor";
$htmlOutIdsFromEePackagesDetail .= <<"EOF";
IDs lacking EE:
$missingEngineeringEnglishCount
EOF
$htmlOutIdsFromEePackagesDetail .= <<"EOF";
$debianPackage $debianPackageVersion
EOF
if ($errorCount > 0) {
$htmlOutIdsFromEePackagesDetail .= <<"EOF";
List of invalid IDs not found in the UI specs:
EOF
}
if ($missingEngineeringEnglishCount > 0) {
$htmlOutIdsFromEePackagesDetail .= <<"EOF";
List of IDs where the Engineering English is missing or empty:
EOF
}
if ($okCount > 0) {
$htmlOutIdsFromEePackagesDetail .= <<"EOF";
List of IDs found in the UI specs:
EOF
}
# Table of Contents:
$class = ($errorCount == 0 && $missingEngineeringEnglishCount == 0) ? "okbgcolor" : "errorbgcolor";
my $engineeringEnglishFileBasename = myBasename($engineeringEnglishFile);
$htmlOutIdsFromEePackagesSummaryTable .= <<"EOF";
$debianPackage
|
$debianPackageVersion
|
$engineeringEnglishFileBasename
:
|
EOF
$htmlOutIdsFromEePackagesSummaryTable .= <<"EOF";
$okCount
|
EOF
$class = $errorCount? "errorbgcolor" : "okbgcolor";
$htmlOutIdsFromEePackagesSummaryTable .= <<"EOF";
$errorCount
|
EOF
$class = $missingEngineeringEnglishCount? "errorbgcolor" : "okbgcolor";
$htmlOutIdsFromEePackagesSummaryTable .= <<"EOF";
$missingEngineeringEnglishCount
|
EOF
}
$htmlOutIdsFromEePackagesSummaryTable .= <<"EOF";
EOF
}
sub checkMessageIdFromSourcePackagesAgainstHandoff {
my ($sourcePackagesMessageId, $htmlOutRef) = @_;
my $sourcePackagesMessageIdIsInSpec = 0;
if (defined $idsFromHandoffFiles{$sourcePackagesMessageId}) {
$sourcePackagesMessageIdIsInSpec = 1;
if ($OPT_VERBOSITY >= 1) {
printf STDOUT "++++++OK: id “%s” spec: %s\n",
$sourcePackagesMessageId, $idsFromHandoffFiles{$sourcePackagesMessageId};
}
${$htmlOutRef} .= "";
${$htmlOutRef} .= sprintf "%s
\nfound in source: %s
\nfound in spec: %s\n",
$sourcePackagesMessageId,
$idsFromSourcePackages{$sourcePackagesMessageId},
$idsFromHandoffFiles{$sourcePackagesMessageId};
${$htmlOutRef} .= "\n";
}
else {
$sourcePackagesMessageIdIsInSpec = 0;
if ($OPT_VERBOSITY >= 1) {
printf STDOUT "***ERROR: id “%s” not found in spec\n", $sourcePackagesMessageId;
}
${$htmlOutRef} .= "";
${$htmlOutRef} .= sprintf "%s
\nfound in source: %s\n",
$sourcePackagesMessageId,
$idsFromSourcePackages{$sourcePackagesMessageId};
${$htmlOutRef} .= "\n";
}
return $sourcePackagesMessageIdIsInSpec;
}
sub compareIdsFromSourcePackagesWithSpec {
my $errorCount = 0;
my $okCount = 0;
my $htmlOutOkList = "";
my $htmlOutErrorList = "";
for my $sourcePackagesMessageId (sort keys %idsFromSourcePackages) {
if ($OPT_VERBOSITY >= 1) {
printf STDOUT "checking: “%s” from source “%s”\n",
$sourcePackagesMessageId,
$idsFromSourcePackages{$sourcePackagesMessageId};
}
my $htmlOutMessage = "";
my $sourcePackagesMessageIdIsInSpec =
checkMessageIdFromSourcePackagesAgainstHandoff($sourcePackagesMessageId, \$htmlOutMessage);
if ($sourcePackagesMessageIdIsInSpec == 1) {
++$okCount;
$htmlOutOkList .= $htmlOutMessage;
}
else {
++$errorCount;
++$totalNumberOfIdsFoundInSourcePackagesButNotInSpec;
$htmlOutErrorList .= $htmlOutMessage;
}
}
$htmlOutIdsFromSourcePackagesDetail .= <<"EOF";
Total number of IDs found in source packages:
${totalNumberOfIdsFromSourcePackages}.
IDs in spec:
$okCount
Invalid IDs:
$errorCount
Back to Summary
EOF
my $sourcePackagesScannedList = "";
for my $package (@sourcePackagesScanned) {
$package =~ s/$OPT_SOURCEPACKAGES_DIR\///g;
$package =~ s/\.tar\.gz//g;
$sourcePackagesScannedList .= "$package\n";
}
my $numberOfSourcePackagesScanned = $#sourcePackagesScanned + 1;
$htmlOutIdsFromSourcePackagesDetail .= <<"EOF";
List of source packages scanned (number of packages scanned: $numberOfSourcePackagesScanned):
$sourcePackagesScannedList
EOF
if ($errorCount > 0) {
$htmlOutIdsFromSourcePackagesDetail .= <<"EOF";
List of invalid IDs found in the source packages but
not in the UI specs:
EOF
}
if ($okCount > 0) {
$htmlOutIdsFromSourcePackagesDetail .= <<"EOF";
List of IDs found in the source packages which
are in the UI specs:
EOF
}
}
#----------------------------------------------------------------------
# "main":
# Process command line options
my %opt;
unless (GetOptions(\%opt,
'verbosity|v=i', \$OPT_VERBOSITY,
'version', \$OPT_VERSION,
'help|h', \$OPT_HELP,
'eedir=s', \$OPT_EEDIR,
'handoffurl=s', \$OPT_HANDOFF_URL,
'handoffdir=s', \$OPT_HANDOFF_DIR,
'sourcepackagesdir=s',\$OPT_SOURCEPACKAGES_DIR,
'http-user=s', \$OPT_HTTP_USER,
'http-passwd=s', \$OPT_HTTP_PASSWD,
'skip-download', \$OPT_SKIP_DOWNLOAD,
'output-dir=s', \$OPT_OUTPUTDIR,
)) {
&usage ();
exit 1;
}
if (!defined $OPT_VERBOSITY) {
$OPT_VERBOSITY = 1;
}
if (!defined $OPT_VERSION) {
$OPT_VERSION = 0;
}
if (!defined $OPT_HELP) {
$OPT_HELP = 0;
}
if (!defined $OPT_EEDIR) {
$OPT_EEDIR="/usr/share/l10n/meegotouch";
}
if (!defined $OPT_HANDOFF_URL) {
$OPT_HANDOFF_URL="https://projects.maemo.org/svn/l10n/projects/harmattan/vendor/handoff/";
}
if (!defined $OPT_HANDOFF_DIR) {
$OPT_HANDOFF_DIR="/tmp/messageid-check/handoff-${run_date}";
}
if (!defined $OPT_SOURCEPACKAGES_DIR) {
$OPT_SOURCEPACKAGES_DIR="/tmp/messageid-check/sourcepackages-${run_date}";
}
if (!defined $OPT_HTTP_USER) {
$OPT_HTTP_USER="";
}
if (!defined $OPT_HTTP_PASSWD) {
$OPT_HTTP_PASSWD="";
}
if (!defined $OPT_SKIP_DOWNLOAD) {
$OPT_SKIP_DOWNLOAD = 0;
}
if (!defined $OPT_OUTPUTDIR) {
$OPT_OUTPUTDIR = "$original_wd/messageid-check-results/";
}
if ($OPT_VERSION) {
print "messageid-check $version\n";
exit 0;
}
if ($OPT_HELP) {
&usage ();
exit 0;
}
if ($OPT_VERBOSITY >=1) {
select (STDOUT);
$OUTPUT_AUTOFLUSH = 1;
select (STDERR);
$OUTPUT_AUTOFLUSH = 1;
}
if (! -d $OPT_OUTPUTDIR) {
mySystem("mkdir -p $OPT_OUTPUTDIR");
if (! -d $OPT_OUTPUTDIR) {
printf STDERR "Cannot create output directory %s\n", $OPT_OUTPUTDIR;
myExit(1);
}
}
getEngineeringEnglishPackageList();
if (!$OPT_SKIP_DOWNLOAD) {
checkListOfSourcePackagesDependingOnLibmeegotouch();
download();
}
else {
@handoffFiles = glob ("$OPT_HANDOFF_DIR/*.ts");
}
checkListOfSourcePackagesDependingOnLibmeegotouch();
readHandoffXmlTrees();
getIdsFromHandoffFiles();
getIdsFromSourcePackages();
compareIdsFromEngineeringEnglishPackagesWithSpec();
compareIdsFromSourcePackagesWithSpec();
######################################################################
# generate output to show which ids from specs are used and which are not
# mark some exceptions for IDs where neither Engineering English
# nor sources are expected to exist and which are known to be used anyway:
for my $idFromSpec (sort (keys %idsFromSpecUsage)) {
if($idsFromSpecUsage{$idFromSpec} eq "") {
if ($idFromSpec =~ /qtn_clk_city/
|| $idFromSpec =~ /qtn_clk_country/
|| $idFromSpec =~ /qtn_clk_region/) {
$idsFromSpecUsage{$idFromSpec} = "meegotouch-cities-template";
}
}
}
# mark the ids found by scanning the source debian packages
# with lupdate as used:
for my $idFromSpec (sort (keys %idsFromSpecUsage)) {
if(defined $idsFromSourcePackages{$idFromSpec}
&& $idsFromSourcePackages{$idFromSpec} ne "") {
if ($idsFromSpecUsage{$idFromSpec} ne "") {
$idsFromSpecUsage{$idFromSpec} .=
", $idsFromSourcePackages{$idFromSpec}";
}
else {
$idsFromSpecUsage{$idFromSpec} =
$idsFromSourcePackages{$idFromSpec};
}
}
}
my $htmlOutIdsFromSpecUsed = "";
my $htmlOutIdsFromSpecNeverUsed = "";
for my $idFromSpec (sort (keys %idsFromSpecUsage)) {
if ($idsFromSpecUsage{$idFromSpec} eq "") {
++$totalNumberOfIdsFoundInSpecButNeverUsed;
$htmlOutIdsFromSpecNeverUsed .= <<"EOF"
$idFromSpec
EOF
}
else {
++$totalNumberOfIdsFoundInSpecUsed;
$htmlOutIdsFromSpecUsed .= <<"EOF"
$idFromSpec (used in $idsFromSpecUsage{$idFromSpec})
EOF
}
}
######################################################################
$totalNumberOfIdsFoundInSpec =
$totalNumberOfIdsFoundInSpecUsed
+ $totalNumberOfIdsFoundInSpecButNeverUsed;
if (scalar(keys %idsFromSpecUsage) != $totalNumberOfIdsFoundInSpec) {
printf STDERR "There is something wrong with calculating the number of ids in the specs. Exit.\n";
myExit(1);
}
if (scalar(keys %idsFromHandoffFiles) != $totalNumberOfIdsFoundInSpec) {
printf STDERR "There is something wrong with calculating the number of ids in the specs. Exit.\n";
myExit(1);
}
my $htmlOutIdsFromSpecUsedDetail = "";
$htmlOutIdsFromSpecUsedDetail .= <<"EOF";
Total number of IDs in specs:
$totalNumberOfIdsFoundInSpec
IDs used:
$totalNumberOfIdsFoundInSpecUsed
IDs never used:
$totalNumberOfIdsFoundInSpecButNeverUsed
Back to Summary
EOF
if ($totalNumberOfIdsFoundInSpecButNeverUsed > 0) {
$htmlOutIdsFromSpecUsedDetail .= <<"EOF";
List of IDs from the specifications which are never used
in the code, they can be found neither in the Engineering English
packages scanned nor in the source packages scanned:
$htmlOutIdsFromSpecNeverUsed
EOF
}
if ($totalNumberOfIdsFoundInSpecUsed > 0) {
$htmlOutIdsFromSpecUsedDetail .= <<"EOF";
List of IDs from the specifications which are used somewhere in the code,
i.e. they were found in an Engineering English package scanned or in a
source package scanned or they are known to be used and handled as exceptions:
EOF
}
######################################################################
my $htmlOutTocHeader = "";
$htmlOutTocHeader .= <<"EOF";
Summary of results:
EOF
my @idsFoundInEePackagesArray = (keys %idsFoundInEePackages);
$totalNumberOfIdsFoundInEePackages = $#idsFoundInEePackagesArray;
$htmlOutTocHeader .= <<"EOF";
Ids found in Engineering English packages:
Total number of Ids found in the Engineering English packages:
$totalNumberOfIdsFoundInEePackages
(may contain duplicates)
EOF
$class = $totalNumberOfIdsFoundInEePackagesButNotInSpec? "errorcolor" : "okcolor";
$htmlOutTocHeader .= <<"EOF";
Total number of Ids found in the Engineering English packages but not in the specifications:
$totalNumberOfIdsFoundInEePackagesButNotInSpec
(may contain duplicates)
EOF
$class = $totalNumberOfIdsFoundInEePackagesLackingEngineeringEnglish? "errorcolor" : "okcolor";
$htmlOutTocHeader .= <<"EOF";
Total number of Ids found in the Engineering English packages where the Engineering English is missing or empty:
$totalNumberOfIdsFoundInEePackagesLackingEngineeringEnglish
(may contain duplicates)
EOF
$htmlOutTocHeader .= <<"EOF";
Note that the numbers of Ids listed above as
“found in the Engineering English packages” may
count identical ids several times. If the same id
appears in different Engineering English files it is
counted once for each Engineering English file it appears in.
EOF
$htmlOutTocHeader .= <<"EOF";
Total number of Ids found by scanning source packages with lupdate:
$totalNumberOfIdsFromSourcePackages
(unique)
EOF
$class = $totalNumberOfIdsFoundInSourcePackagesButNotInSpec? "errorcolor" : "okcolor";
$htmlOutTocHeader .= <<"EOF";
Total number of Ids found by scanning the source packages which are not in the specifications:
$totalNumberOfIdsFoundInSourcePackagesButNotInSpec
(unique)
EOF
$htmlOutTocHeader .= <<"EOF";
Ids found by scanning handoff files (i.e. the specifications):
View handoff files scan details
Total number of Ids found in the specifications:
$totalNumberOfIdsFoundInSpec
(unique)
EOF
$class = $totalNumberOfIdsFoundInSpecButNeverUsed? "errorcolor" : "okcolor";
$htmlOutTocHeader .= <<"EOF";
Total number of Ids found in the specifications which are never used in the code:
$totalNumberOfIdsFoundInSpecButNeverUsed
(unique)
EOF
$class = $totalNumberOfIdsFoundInSpecUsed? "okcolor" : "errorcolor";
$htmlOutTocHeader .= <<"EOF";
Total number of unique Ids found in the specifications which are used somewhere in the code:
$totalNumberOfIdsFoundInSpecUsed
(unique)
EOF
$htmlOutTocHeader .= <<"EOF";
CSV file with a list of invalid message IDs from Engineering English Packages.
(does not include the invalid message IDs found from scanning the sources directly).
EOF
my $htmlOutResultsDetailHeader = "";
$htmlOutResultsDetailHeader .= <<"EOF";
Results in detail:
EOF
my $htmlOutIntroduction ="";
$htmlOutIntroduction .= <<"EOF";
Introduction
This page lists IDs which are used in
the code but which are missing in the specifications. For all IDs used
in the code, but not defined in the UI specifications, please do the
following:
- Check your code if those IDs are really in use
- Check if there is a typo in the ID
If there is no typo and the ID is
really used, open a bug against the relevant UI Spec
requesting a new ID:
The message ids which are in the specifications were collected
from the “handoff” .ts files which were downloaded here:
$OPT_HANDOFF_URL.
EOF
my $etc_apt_sources_list_contents = "";
open (SOURCES_LIST, "<:encoding(UTF-8)", "/etc/apt/sources.list") || die "Can’t open file /etc/apt/sources.list: $!";
while () {
next if /^\s*#/; # skip comments
if ($ARG =~ /[^[:space:]]+/) {
$etc_apt_sources_list_contents .= "$ARG
";
}
}
close (SOURCES_LIST);
$htmlOutIntroduction .= <<"EOF";
While this script was run, /etc/apt/sources.list contained:
$etc_apt_sources_list_contents
i.e. the Engineering English packages and source packages
listed below were downloaded from these repositories.
EOF
my $htmlOutBody =
$htmlOutIntroduction
. $htmlOutTocHeader
. $htmlOutIdsFromEePackagesSummaryTable
. $htmlOutIdsFromSourcePackagesSummaryTable
. $htmlOutResultsDetailHeader
. $htmlOutIdsFromEePackagesDetail
. $htmlOutIdsFromSourcePackagesDetail
. $htmlOutIdsFromSpecUsedDetail;
writeHtml($htmlOutBody);
open (CSV, ">$OPT_OUTPUTDIR/messageid-check-result.csv") || die "can't open file $OPT_OUTPUTDIR/messageid-check-result.csv: $!";
binmode CSV, ":utf8";
printf CSV "%s", $csvOut;
close (CSV);
myExit (0);