The Wayback Machine - https://web.archive.org/web/20211224061047/https://github.com/exiftool/exiftool/blob/master/validate
Skip to content
Permalink
master
Switch branches/tags
Go to file
 
 
Cannot retrieve contributors at this time
executable file 145 lines (130 sloc) 4.15 KB
#!/usr/bin/perl -w
#
# File: scripts/validate
#
# Description: Run various code validation tests before exiftool release
#
# Created: 2010/01/23 - P. Harvey
#
use strict;
BEGIN { push @INC, 'lib' }
use Image::ExifTool;
use Image::ExifTool::Charset;
my $err = 0;
sub Warn(@)
{
warn @_;
$err = 1;
}
# check for test code
my $tmp = `grep -rw TEST lib exiftool windows_exiftool`;
if ($tmp) {
Warn("Test code found!:\n$tmp");
}
# check for other exiftool distributions in this directory
$tmp = `ls -d Image-ExifTool-?.?? 2> /dev/null`;
if ($tmp) {
Warn("Another exiftool release exists!:\n$tmp");
}
# check for "use x" in text comments (breaks perl2exe)
$tmp = `grep -rE '^[ ]+use ' exiftool lib | grep -v ';'`;
if ($tmp) {
Warn("Possible use of 'use' in comment (breaks perl2exe)!:\n$tmp");
}
# check for EncodeExifText used in PrintConvInv (must be RawConvInv)
$tmp = `grep -r EncodeExifText lib | grep -E '(PrintConvInv|ValueConvInv)'`;
if ($tmp) {
Warn("EncodeExifText should only be used in RawConvInv!:\n$tmp");
}
# check for use of \G without /g (problem with Perl 5.00505)
$tmp = `grep -r '\\\\G' exiftool lib | grep ~ | grep -vE '(/s?g|\\}s?g)'`;
if ($tmp) {
Warn("USING \\G WITHOUT /g IN REGULAR EXPRESSION!:\n$tmp");
}
# check for "defined HASH"
$tmp = `grep -r "defined %" lib exiftool windows_exiftool`;
if ($tmp) {
Warn("$tmp^^^ Defined HASH is deprecated in Perl 5.11! ^^^\n");
}
#
# validate character sets
#
my %test;
foreach (keys %Image::ExifTool::Charset::csType) {
my $csType = $Image::ExifTool::Charset::csType{$_};
# only type 0x100 and 0x101 should be made available for public consumption,
# other types are used only internally. (0x080 types are not made public
# because the conversion routines are usually not called unless the string
# contains a codepoint greater than 0x7f)
$test{$_} = 1 if $csType <= 0x101 and $_ ne 'ASCII';
my $module = "Image::ExifTool::Charset::$_";
unless (eval "require $module") {
$csType & 0x001 and Warn("Error loading Charset $_\n");
next;
}
no strict 'refs';
my $conv = \%$module;
use strict 'refs';
my $type = 0x001; # has a lookup table
my $char;
foreach $char (keys %$conv) {
$char < 0x80 and $type |= 0x080; # remaps chars < 0x80
$type |= ($char < 0x100 ? 0x100 : 0x200); # byte width
my $to = $$conv{$char};
ref $to and $type |= 0x800, next; # variable width or multi-char
}
# variable-width types are 0x800
if (($type & 0x300) == 0x300 or ($type & 0x300 and $type & 0x800)) {
$type &= ~0x300;
$type |= 0x800;
}
# known 2-byte fixed-width types which map chars < 0x100
if (/^(Symbol)$/) {
$type &= ~0xf00;
$type |= 0x200;
}
$type |= 0x002 if $_ eq 'MacArabic' or $type > 0x401; # inverse not supported
if ($type != $csType) {
my $str = sprintf("0x%.3x should be 0x%.3x", $csType , $type);
Warn("Incorrect csType for Charset $_ ($str)\n");
}
}
foreach (values %Image::ExifTool::charsetName) {
$test{$_} or Warn("Charset $_ is not defined in Charset.pm or not valid for API\n");
$test{$_} = 2;
}
foreach (keys %test) {
$test{$_} == 2 or Warn("Charset $_ not defined in %Image::ExifTool::charsetName\n");
}
#
# check to be sure Minolta.pm and Sony.pm lens lists are synchronized
#
my %lens;
foreach (split /\n/, `grep "'Sony E " lib/Image/ExifTool/Minolta.pm`) {
next if /^\s*#/;
next unless /'([^']+)',/;
if ($lens{$1}) {
Warn("Duplicate lens in Minolta.pm: $1\n");
} else {
$lens{$1} = 1;
}
}
foreach (split /\n/, `grep "'Sony E " lib/Image/ExifTool/Sony.pm`) {
# (commented out lenses in Sony.pm are OK)
# next if /^\s*#/;
next unless /'([^']+)',/;
my $lens = $1;
$lens =~ s/ or .*//;
if (not $lens{$lens}) {
Warn("Missing lens in Sony.pm: $lens\n");
} elsif ($lens{$lens} == 2) {
Warn("Duplicate lens in Sony.pm: $lens\n");
} else {
$lens{$lens} = 2;
}
}
foreach (sort keys %lens) {
$lens{$_} != 2 and Warn("Missing lens in Minolta.pm: $_\n");
}
exit $err;
# end