From http://www.jwz.org/xscreensaver/xscreensaver-5.30.tar.gz
[xscreensaver] / OSX / installer.sh
index e2a155dd3dcd8235f99976df343bdc8441c0e3da..329a7c18574ae7425563053a7038d005920761a9 100755 (executable)
@@ -1,5 +1,5 @@
 #!/bin/sh
-# XScreenSaver, Copyright © 2013 Jamie Zawinski <jwz@jwz.org>
+# XScreenSaver, Copyright © 2013-2014 Jamie Zawinski <jwz@jwz.org>
 #
 # Permission to use, copy, modify, distribute, and sell this software and its
 # documentation for any purpose is hereby granted without fee, provided that
 #exec >/tmp/xscreensaver.log 2>&1
 #set -x
 
-REQUIRED_SPACE=140     # MB. Highly approximate.
-
 DEBUG=0
+REQUIRED_SPACE=160     # MB. Highly approximate.
 
-if [ x"$USER" = xjwz ]; then
-  DEBUG=1
-fi
+export PATH="/bin:/sbin:/usr/bin:/usr/sbin:$PATH"
 
-echo "Destination: $DSTVOLUME" >&2
-
-if [ "$DEBUG" != 0 ]; then
-  DSTVOLUME=/tmp
-fi
+function error() {
+  echo "XScreenSaver Installer: Error: $@" >&2
 
-SRC=`dirname "$PACKAGE_PATH"`/"Screen Savers"
-DST1="$DSTVOLUME/Library/Screen Savers"
-DST2="$DSTVOLUME/Applications"
-PU="$DSTVOLUME/$HOME/Library/Screen Savers"
-UPDATER="XScreenSaverUpdater.app"
+  # Using "System Events" says "No user interaction allowed" on 10.9.
+  # But using "SystemUIServer" or "Automator Runner" still seems to work.
+  #
+  runner="System Events"
+  if [ -d "/System/Library/CoreServices/SystemUIServer.app" ]; then
+    runner="SystemUIServer"
+  elif [ -d "/System/Library/CoreServices/Automator Runner.app" ]; then
+    runner="Automator Runner"
+  fi
 
-function error() {
-  echo "Error: $@" >&2
   (
     osascript <<__EOF__
-      tell app "System Events" to display dialog "$@" buttons "Bummer" default button 1 with icon 0 with title "Installation Error"
+      tell app "$runner" to \
+        display dialog "$@" \
+        buttons "Bummer" \
+        default button 1 \
+        with icon 0 \
+        with title "Installation Error"
 __EOF__
   ) </dev/null >/dev/null 2>&1 &
   exit 1
 }
 
+
+#if[ x"$DSTVOLUME"    = x ]; then error "DSTVOLUME unset";    fi
+if [ x"$PACKAGE_PATH" = x ]; then error "PACKAGE_PATH unset"; fi
+if [ x"$HOME"         = x ]; then error "HOME unset";         fi
+
+
+echo "Destination: $DSTVOLUME" >&2
+
+if [ x"$USER" = xjwz ]; then DEBUG=1; fi
+
+if [ "$DEBUG" != 0 ]; then DSTVOLUME=/tmp; fi
+
+SRC=`dirname "$PACKAGE_PATH"`/"Screen Savers"
+DST1="$DSTVOLUME/Library/Screen Savers"
+DST2="$DSTVOLUME/Applications"
+PU="$DSTVOLUME/$HOME/Library/Screen Savers"
+
+# Because of Sparkle.framework weirdness, ".XScreenSaverUpdater.app"
+# is in the DMG, and we remove the leading dot when installing it.
+# Without this, auto-updates won't work right.
+#
+UPDATER=".XScreenSaverUpdater.app"
+
+
 cd "$SRC" || error "The 'Screen Savers' folder does not exist.
 
 You can't copy the installer out of the Disk Image!"
@@ -66,17 +91,33 @@ fi
 mkdir -p "$DST1" || error "Unable to create directory $DST1/"
 mkdir -p "$DST2" || error "Unable to create directory $DST2/"
 
-# Install the savers in /System/Library/Screen Savers/
-# Plus the updater.
+# Install the savers and the updater in /System/Library/Screen Savers/
+# Install the other apps in /Applications/
 #
-for f in *.saver "$UPDATER" ; do
-  DD="$DST1/$f"
+for f in *.{saver,app} "$UPDATER" ; do
+  EXT=`echo "$f" | sed 's/^.*\.//'`
+  if [ "$EXT" = "app" -a "$f" != "$UPDATER" ]; then
+    DST="$DST2"
+  else
+    DST="$DST1"
+  fi
+
+  f2=`echo "$f" | sed 's/^\.//'`   # install ".foo" as "foo"
+  DD="$DST/$f2"
+
   echo "Installing $DD" >&2
   rm -rf "$DD" || error "Unable to delete $DD"
-  cp -pR "$f" "$DST1/" || error "Unable to install $f in $DST1/"
+  cp -pR "$f" "$DD/" || error "Unable to install $f in $DST/"
+
+  # Eliminate the "this was downloaded from the interweb" warning.
   xattr -r -d com.apple.quarantine "$DD"
 
-  # If this saver is also installed in the per-user directory,
+  if [ "$EXT" = "app" ]; then
+    # Eliminate the "this is from an unknown developer" warning.
+    spctl --add "$DD"
+  fi
+
+  # If this saver or app is also installed in the per-user directory,
   # delete that copy so that we don't have conflicts.
   #
   if [ "$DEBUG" = 0 ]; then
@@ -84,20 +125,6 @@ for f in *.saver "$UPDATER" ; do
   fi
 done
 
-
-# Install the apps in /Applications/
-# But not the updater.
-#
-for f in *.app ; do
-  if [ "$f" != "$UPDATER" ]; then
-    DD="$DST2/$f"
-    echo "Installing $DD" >&2
-    rm -rf "$DD" || error "Unable to delete $DD"
-    cp -pR "$f" "$DST2/" || error "Unable to install $f in $DST2/"
-    xattr -r -d com.apple.quarantine "$DD"
-  fi
-done
-
 # Launch System Preferences with the Screen Saver pane selected.
 #
 open /System/Library/PreferencePanes/DesktopScreenEffectsPref.prefPane &