X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=OSX%2Fupdate-info-plist.pl;h=ec8981a1ac759d3b578f044a6d6e579d3b7e53ae;hb=4ade52359b6eba3621566dac79793a33aa4c915f;hp=069d0c3b6ea47f5c246a43f0503362f7fab51e0b;hpb=7b34ef992563d7bcbb64cc5597dc45fa24470b05;p=xscreensaver diff --git a/OSX/update-info-plist.pl b/OSX/update-info-plist.pl index 069d0c3b..ec8981a1 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-2013 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 @@ -22,20 +22,42 @@ require 5; #use diagnostics; # Fails on some MacOS 10.5 systems use strict; -my $progname = $0; $progname =~ s@.*/@@g; -my $version = q{ $Revision: 1.10 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; +my ($exec_dir, $progname) = ($0 =~ m@^(.*?)/([^/]+)$@); + +my $version = q{ $Revision: 1.24 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; + +$ENV{PATH} = "/usr/local/bin:$ENV{PATH}"; # for seticon + +my $thumbdir = $ENV{HOME} . '/www/xscreensaver/screenshots/'; + + 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: $!"); + } + print STDERR "$progname: read $file\n" if ($verbose > 2); + 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 +66,27 @@ 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: $!"); + } + print STDERR "$progname: read $file\n" if ($verbose > 2); + local $/ = undef; # read entire file + my $body = <$in>; + close $in; return ($file, $body); } @@ -61,6 +96,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,6 +109,7 @@ 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; @@ -108,7 +146,7 @@ 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"; @@ -143,9 +181,9 @@ sub update_saver_xml($$) { print STDERR "$progname: $filename: unchanged\n" if ($verbose > 1); } else { my $file_tmp = "$filename.tmp"; - open(OUT, ">$file_tmp") || error ("$file_tmp: $!"); - print OUT $body || error ("$file_tmp: $!"); - close OUT || error ("$file_tmp: $!"); + open (my $out, '>', $file_tmp) || error ("$file_tmp: $!"); + print $out $body || error ("$file_tmp: $!"); + close $out || error ("$file_tmp: $!"); if (!rename ("$file_tmp", "$filename")) { unlink "$file_tmp"; @@ -187,7 +225,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); @@ -195,6 +234,21 @@ sub set_icon($) { } +sub set_thumb($) { + my ($app_dir) = @_; + + return unless ($app_dir =~ m@\.saver/?$@s); + + my @cmd = ("$exec_dir/update-thumbnail.pl", $thumbdir, $app_dir); + push @cmd, "-" . ("v" x $verbose) if ($verbose); + print STDERR "$progname: exec: " . join(' ', @cmd) . "\n" + if ($verbose > 1); + system (@cmd); + my $exit = $? >> 8; + exit ($exit) if $exit; +} + + sub update($) { my ($app_dir) = @_; @@ -211,39 +265,45 @@ 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/; - - # Lose the Wikipedia URLs. - $info_str =~ s@http:.*\bwikipedia\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); + 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 (my $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); + set_thumb ($app_dir); } @@ -259,13 +319,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) {