X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=OSX%2Fupdate-info-plist.pl;h=998c452399efc9d5741a9159614967574bd5681e;hb=f8cf5ac7b2f53510f80a0eaf286a25298be17bfe;hp=16a2bed0a444e00433f1a40710c39fec64b4e1ee;hpb=6b1c86cf395f59389e4ece4ea8f4bea2c332745b;p=xscreensaver diff --git a/OSX/update-info-plist.pl b/OSX/update-info-plist.pl index 16a2bed0..998c4523 100755 --- a/OSX/update-info-plist.pl +++ b/OSX/update-info-plist.pl @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# Copyright © 2006-2008 Jamie Zawinski +# Copyright © 2006-2012 Jamie Zawinski # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that @@ -23,19 +23,36 @@ require 5; use strict; my $progname = $0; $progname =~ s@.*/@@g; -my $version = q{ $Revision: 1.7 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; +my $version = q{ $Revision: 1.21 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; + +$ENV{PATH} = "/usr/local/bin:$ENV{PATH}"; # for seticon + my $verbose = 1; +sub read_info_plist($); sub read_info_plist($) { my ($app_dir) = @_; - my $file = "$app_dir/Contents/Info.plist"; + my $file = "$app_dir/Contents/Info.plist"; + my $file2 = "$app_dir/Info.plist"; $file =~ s@/+@/@g; - local *IN; - my $body = ''; - error ("$file: $!") unless open (IN, "<$file"); - while () { $body .= $_; } - close IN; + my $in; + if (open ($in, '<', $file)) { + } elsif (open ($in, '<', $file2)) { + $file = $file2; + } else { + error ("$file: $!"); + } + local $/ = undef; # read entire file + my $body = <$in>; + close $in; + + if ($body =~ m/^bplist/s) { + print STDERR "$progname: converting binary plist file: $file\n"; + system ("plutil", "-convert", "xml1", $file); + return read_info_plist ($app_dir); + } + return ($file, $body); } @@ -44,14 +61,26 @@ sub read_saver_xml($) { my ($app_dir) = @_; error ("$app_dir: no name") unless ($app_dir =~ m@/([^/.]+).(app|saver)/?$@x); - my $name = lc($1); - my $file = "$app_dir/Contents/Resources/$name.xml"; + my $name = $1; + + return () if ($name eq 'XScreenSaver'); + return () if ($name eq 'SaverTester'); + + my $file = "$app_dir/Contents/Resources/" . lc($name) . ".xml"; + my $file2 = "$app_dir/" . lc($name) . ".xml"; + my $file3 = "$app_dir/Contents/PlugIns/$name.saver/Contents/Resources/" . + lc($name) . ".xml"; $file =~ s@/+@/@g; - local *IN; - my $body = ''; - error ("$file: $!") unless open (IN, "<$file"); - while () { $body .= $_; } - close IN; + my $in; + if (open ($in, '<', $file)) { + } elsif (open ($in, '<', $file2)) { $file = $file2; + } elsif (open ($in, '<', $file3)) { $file = $file3; + } else { + error ("$file: $!"); + } + local $/ = undef; # read entire file + my $body = <$in>; + close $in; return ($file, $body); } @@ -61,6 +90,8 @@ sub update_saver_xml($$) { my ($filename, $body) = read_saver_xml ($app_dir); my $obody = $body; + return () unless defined ($filename); + $body =~ m@]*?[ \t]_label=\"([^\"]+)\"@m || error ("$filename: no name label"); my $name = $1; @@ -72,17 +103,19 @@ sub update_saver_xml($$) { $desc =~ s/\s*$//s; # in case it's done already... + $desc =~ s@@@gs; $desc =~ s/^.* version \d[^\n]*\n//s; $desc =~ s/^From the XScreenSaver.*\n//m; $desc =~ s@^http://www\.jwz\.org/xscreensaver.*\n@@m; - $desc =~ s/^Copyright [^ \r\n\t]+ (\d{4})(-\d{4})? (.*)\.$/Written $3; $1./m; + $desc =~ + s/\nCopyright [^ \r\n\t]+ (\d{4})(-\d{4})? (.*)\.$/\nWritten $3; $1./s; $desc =~ s/^\n+//s; error ("$filename: description contains bad characters") if ($desc =~ m/([^\t\n -~]|[<>])/); error ("$filename: can't extract authors") - unless ($desc =~ m@^(.*)\nWritten by[ \t]+([^\n]+)$@s); + unless ($desc =~ m@^(.*)\nWritten by[ \t]+(.+)$@s); $desc = $1; my $authors = $2; $desc =~ s/\s*$//s; @@ -93,6 +126,7 @@ sub update_saver_xml($$) { $year = $2; } + error ("$filename: can't extract year") unless $year; my $cyear = 1900 + ((localtime())[5]); $year = "$cyear" unless $year; if ($year && ! ($year =~ m/$cyear/)) { @@ -106,24 +140,22 @@ sub update_saver_xml($$) { # my $curator = "Jamie Zawinski"; if (! ($authors =~ m/$curator/si)) { - if ($authors =~ m@^(.*),? and (.*)$@s) { + if ($authors =~ m@^(.*?),? and (.*)$@s) { $authors = "$1, $2, and $curator"; } else { $authors .= " and $curator"; } } - my $cc = "\302\251"; # unicode "©" - - my $desc1 = ("$name, version $vers.\n\n" . + my $desc1 = ("$name, version $vers.\n\n" . # savername.xml $desc . "\n" . "\n" . - "From the XScreenSaver collection:\n" . + "From the XScreenSaver collection: " . "http://www.jwz.org/xscreensaver/\n" . "Copyright \251 $year by $authors.\n"); - my $desc2 = ("$name $vers,\n" . - "$cc $year $authors.\n" . + my $desc2 = ("$name $vers,\n" . # Info.plist + "\302\251 $year $authors.\n" . "From the XScreenSaver collection:\n" . "http://www.jwz.org/xscreensaver/\n" . "\n" . @@ -187,7 +219,8 @@ sub set_icon($) { # "seticon" is from osxutils, http://osxutils.sourceforge.net/ - my $icon = "$app_dir/../../../XScreenSaver.icns"; + my $icon = ($app_dir =~ m/\.saver$/ ? 'XScreenSaver' : 'SaverRunner'); + $icon = "$app_dir/../../../$icon.icns"; my @cmd = ("seticon", "-d", $icon, $app_dir); print STDERR "$progname: exec: " . join(' ', @cmd) . "\n" if ($verbose > 1); @@ -211,31 +244,41 @@ sub update($) { my $vers = $1; my ($ignore, $info_str) = update_saver_xml ($app_dir, $vers); - $info_str =~ m@^([^\n]+)\n@s || - error ("$filename: unparsable copyright"); - my $copyright = "$1"; - $copyright =~ s/\b\d{4}-(\d{4})\b/$1/; - - $plist = set_plist_key ($filename, $plist, - "NSHumanReadableCopyright", $copyright); - $plist = set_plist_key ($filename, $plist, - "CFBundleLongVersionString",$copyright); - $plist = set_plist_key ($filename, $plist, - "CFBundleGetInfoString", $info_str); - - if ($oplist eq $plist) { - print STDERR "$progname: $filename: unchanged\n" if ($verbose > 1); + if (! defined($info_str)) { + print STDERR "$progname: $filename: no XML file\n" if ($verbose > 1); } else { - my $file_tmp = "$filename.tmp"; - open(OUT, ">$file_tmp") || error ("$file_tmp: $!"); - print OUT $plist || error ("$file_tmp: $!"); - close OUT || error ("$file_tmp: $!"); - if (!rename ("$file_tmp", "$filename")) { - unlink "$file_tmp"; - error ("mv \"$file_tmp\" \"$filename\": $!"); + $info_str =~ m@^([^\n]+)\n@s || + error ("$filename: unparsable copyright"); + my $copyright = "$1"; + $copyright =~ s/\b\d{4}-(\d{4})\b/$1/; + + # Lose the Wikipedia URLs. + $info_str =~ s@http:.*?\b(wikipedia|mathworld)\b[^\s]+[ \t]*\n?@@gm; + + $info_str =~ s/(\n\n)\n+/$1/gs; + $info_str =~ s/(^\s+|\s+$)//gs; + $plist = set_plist_key ($filename, $plist, + "NSHumanReadableCopyright", $copyright); + $plist = set_plist_key ($filename, $plist, + "CFBundleLongVersionString",$copyright); + $plist = set_plist_key ($filename, $plist, + "CFBundleGetInfoString", $info_str); + + if ($oplist eq $plist) { + print STDERR "$progname: $filename: unchanged\n" if ($verbose > 1); + } else { + my $file_tmp = "$filename.tmp"; + open(OUT, ">$file_tmp") || error ("$file_tmp: $!"); + print OUT $plist || error ("$file_tmp: $!"); + close OUT || error ("$file_tmp: $!"); + + if (!rename ("$file_tmp", "$filename")) { + unlink "$file_tmp"; + error ("mv \"$file_tmp\" \"$filename\": $!"); + } + print STDERR "$progname: wrote $filename\n" if ($verbose); } - print STDERR "$progname: wrote $filename\n" if ($verbose); } set_icon ($app_dir); @@ -254,13 +297,15 @@ sub usage() { } sub main() { + my @files = (); - while ($#ARGV >= 0) { - $_ = shift @ARGV; - if ($_ eq "--verbose") { $verbose++; } - elsif (m/^-v+$/) { $verbose += length($_)-1; } - elsif (m/^-./) { usage; } - else { push @files, $_; } + while ($_ = $ARGV[0]) { + shift @ARGV; + if (m/^--?verbose$/s) { $verbose++; } + elsif (m/^-v+$/) { $verbose += length($_)-1; } + elsif (m/^--?q(uiet)?$/s) { $verbose = 0; } + elsif (m/^-/s) { usage(); } + else { push @files, $_; } } usage() unless ($#files >= 0); foreach (@files) {