Home page > OS X Portable Applications > Portable Camino source code
Source code index | Portable Camino script code:
Shell Script (Release 3.0)
*PortableCaminoScript_r3.0.txt.zip
Portable Camino.app is packaged using the Platypus script wrapper from http://sveinbjorn.sytes.net/platypus
#!/bin/sh -x
##########################################################################
#
# Portable Camino
# $Revision: 3.0
#
# The Contents of this file are made available subject to the terms
# of the following license
#
# - GNU General Public License Version 2.1
#
# Carlo Gandolfi, Paolo Portaluri June 2007
#
# GNU General Public License Version 2.1
# =============================================
# Copyright 2006, 2007 by:
# Carlo Gandolfi - http://www.freesmug.org
# Paolo Portaluri - http://plus2.it/~paolo/
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public
# License version 2.1, as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA 02111-1307 USA
#
##########################################################################
# Reset PATH
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
appurl=org.mozilla.camino.plist
appid=Camino
userplistbase="Library/Preferences"
userplist="$HOME/$userplistbase/$appurl"
userprefbase="Library/Application Support"
userpref="$HOME/$userprefbase/$appid"
usercachebase="$HOME/Library/Caches"
usercache="$usercachebase/$appid"
p_userbase="$1/Contents/Resources/app"
p_userplist="$p_userbase/$userplistbase/$appurl"
p_userpref="$p_userbase/$userprefbase/$appid"
copy_pref="$p_userbase/../CopyPref_Done"
CD="$p_userbase/../CocoaDialog.app/Contents/MacOS/CocoaDialog"
appicon="$p_userbase/../appIcon.icns"
cautionicon="$p_userbase/../P_${appid}_Caution.icns"
# ========================================================
# CDokmessage
# CocoaDialog Ok/Cancel message box
# $1 "text"
# $2 "informative text"
# $3 "--no-cancel" = don't show a cancel button
# ========================================================
function CDokmessage {
beep
"$CD" ok-msgbox --icon-file "$appicon" \
--text "$1" --informative-text "$2" "$3"
}
function CDokmessagec {
beep
"$CD" ok-msgbox --icon-file "$cautionicon" \
--text "$1" --informative-text "$2" "$3"
}
function beep {
/usr/bin/osascript << EOT
tell application "Finder"
beep
end tell
EOT
}
# ========================================================
# bsd_command_check
# Check that the required BSD command are installed
# ========================================================
function command_check_msg {
message1="One or more *BSD commands* to run Portable $appid were not found on \
this machine. You must install the BSD Subsystem package that is in the \
following folder on disk 1 of your Mac OS X installation DVD:\n/Welcome to Mac \
OS X/Optional Installs.\n\nNow quit."
button=`/usr/bin/osascript << EOT
tell application "Finder"
beep
display dialog "$message1" buttons {"Quit"} \
with icon caution default button "Quit"
set result to button returned of result
end tell
EOT`
if test "$button" == "Quit"; then # Quit application
exit 112
fi
}
function bsd_command_check { # written by Patrick Luby
commands="awk cp diskutil echo grep mkfifo mkdir mv ps rm touch"
for i in $commands ; do
if [ ! -x "/usr/bin/$i" -a ! -x "/bin/$i" -a ! -x "/usr/sbin/$i" -a ! -x "/sbin/$i" ] ; then
# Return 96 + 16 if a command is not found
command_check_msg;
exit 112;
fi
done
}
# ========================================================
# osx_version_check
# Check that the user is running Mac OS X 10.4 or higher
# ========================================================
function version_check_msg {
message1="You are running OS X version $version.\n\
Portable $appid can only be opened on Mac OS X 10.4 or higher."
button=`/usr/bin/osascript << EOT
tell application "Finder"
beep
display dialog "$message1" buttons {"Quit"} \
with icon caution default button "Quit"
set result to button returned of result
end tell
EOT`
if test "$button" == "Quit"; then # Quit application
exit 113
fi
}
function osx_version_check { # written by Patrick Luby
if [ -x "/usr/bin/sw_vers" ] ; then
# Return 96 + 17 if it is a bad version
version=`/usr/bin/sw_vers | grep '^ProductVersion:' | awk '{ print $2 }'`
case "$version" in
10.[0123]) version_check_msg ; exit 113;;
10.[0123].*) version_check_msg ; exit 113;;
esac
fi
}
# ========================================================
# quitapp
# Check if local app is open and quit
# ========================================================
function quitapp {
if ps cx | grep '[0-9] '"$appid"'$' > /dev/null; then
rv=` CDokmessage "$appid is already running on this system" \
"Only one copy can be run at a time. \
Quit runnig $appid and reopen Portable $appid." "--no-cancel" `
if [ "$rv" == "1" ] ; then # Quit application
exit 0
fi
fi
}
# ========================================================
# repair
# Repair preferences if Portable Application crashed
# ========================================================
function restore {
if [ -f "$userplist.pabu" ] ; then
recover_plist
fi
if [ -d "$userpref.pabu" ] ; then
rm -rf "$userpref"
recover_asf
fi
}
function restorepabu {
if [ -f "$userplist" ] || [ -d "$userpref" ] ; then
removemsg="Portable $appid has not restored local preferences back-up. \
Newer preferences already exists. You are now restoring preferences back-up \
overwriting/deleting existing one."
else
removemsg="Portable $appid has not restored local preference back-up. \
You are now restoring them."
fi
rv=` CDokmessagec "Restore local preferences back-up" "$removemsg" `
if [ "$rv" == "1" ] ; then
if restore ; then
CDokmessage "$appid Preferences back-up Restore done" \
"Local $appid preferences back-up restored with success." "--no-cancel" > /dev/null
else
CDokmessagec "$appid Preferences back-up Restore error" \
"Local $appid preferences back-up can't be restored. Now quit." "--no-cancel" \
> /dev/null
exit 0
fi
elif [ "$rv" == "2" ] ; then
repair
fi
}
function copy {
rm -rf "$HOME/$appid Pref BackUp/"
if [ -f "$userplist.pabu" ] ; then
mkdir -p "$HOME/$appid Pref BackUp/$userplistbase"
mv "$userplist.pabu" \
"$HOME/$appid Pref BackUp/$userplistbase/$appurl"
fi
if [ -d "$userpref.pabu" ] ; then
mkdir -p "$HOME/$appid Pref BackUp/$userprefbase"
mv "$userpref.pabu" \
"$HOME/$appid Pref BackUp/$userprefbase/$appid"
fi
}
function copypabu {
rv=` CDokmessagec "Copy local preferences back-up" \
"Portable $appid has not restored local preference back-up. \
You are now copying them to \"$HOME/$appid Pref BackUp/\" folder." `
if [ "$rv" == "1" ] ; then
if copy ; then
CDokmessage "$appid Preferences back-up Copy done" "Preferences \
back-up copied to \"$HOME/$appid Pref BackUp/\" folder with success." \
"--no-cancel" > /dev/null
else
CDokmessagec "$appid Preferences back-up Copy error" "Preferences \
back-up can't be copied to \"$HOME/$appid Pref BackUp/\" folder. Now quit." \
"--no-cancel" > /dev/null
exit 0
fi
elif [ "$rv" == "2" ] ; then
repair
fi
}
function repair {
if [ -d "$usercache.pabu" ] ; then
rm -rf "$usercache.pabu" # Delete backup cache
fi
if [ -h "$userpref" ] ; then
rm -f "$userpref" # Delete symlink
fi
if [ -f "$userplist.pabu" ] || [ -d "$userpref.pabu" ] ; then
beep
text2="Local $appid pref back-up not restored"
informativetext2="A temporary back-up of local $appid preferences \
still exist, Portable $appid crashed without restoring this back-up. You can \
Restore local preferences back-up now or Copy to \""$HOME/$appid" BackUp\" \
folder to manually restore later."
rv=`"$CD" msgbox --icon-file "$cautionicon" \
--text "$text2" --informative-text "$informativetext2" \
--button1 "Restore" --button2 "Copy"`
if [ "$rv" == "1" ] ; then
restorepabu
elif [ "$rv" == "2" ] ; then
copypabu
fi
fi
}
# ========================================================
# check_p_asf
# Check and create Portable Application Support folders
# ========================================================
function check_p_asf {
readonly=`diskutil info "$p_userbase" | grep "Read Only" | awk '{ print $3 }'`
if [ "$readonly" = Yes ]; then
CDokmessagec "Portable $appid is on a locked volume" "Portable $appid can't \
be opened on a locked volume. Now quit." "--no-cancel" > /dev/null
exit 0
else
if [ ! -d "$p_userpref" ] ; then
mkdir -p "$p_userpref"
fi
if [ ! -d "$p_userbase/$userplistbase" ] ; then
mkdir -p "$p_userbase/$userplistbase"
fi
fi
}
# ========================================================
# bu/recover preference
# BackUp existing preference and restore portable ones
# ========================================================
function bu_plist {
mv "$userplist" "$userplist.pabu"
}
function recover_plist {
mv "$userplist.pabu" "$userplist"
}
function recover_p_plist {
if [ -f "$p_userplist" ] ; then
cp "$p_userplist" "$userplist"
fi
}
function bu_p_plist {
cp "$userplist" "$p_userplist"
}
# ========================================================
# copy_local_pref
# Copy local preferences to Portable Application
# ========================================================
function runcopypref { # written by Kevin Hendricks
rm -f /tmp/hpipe
mkfifo /tmp/hpipe
"$CD" progressbar --indeterminate --title "Copying $appid Preferences" \
--text "Copying \"$userpref\". Please wait..." < /tmp/hpipe &
exec 3<> /tmp/hpipe
echo -n . >&3
# do all of your work here
cp -R "$userpref" "$p_userpref"
exec 3>&-
wait
rm -f /tmp/hpipe
}
function check_asf {
if [ -d "$p_userpref" ] ; then
# delete p_userpref if it still exist
rm -Rf "$p_userpref"
else
mkdir -p "$p_userpref"
fi
}
# copy Preferences Folder
function copy_pf {
userprefsize=`du -hc "$userpref" | cut -f1 | tail -1`
freesize=`df -h "$p_userbase" | tail -1 | awk '{print $4}'`
buserprefsize=`du -c "$userpref" | cut -f1 | tail -1`
bfreesize=`df "$p_userbase" | tail -1 | awk '{print $4}'`
if [ $buserprefsize -lt $bfreesize ] ; then
rv=` CDokmessage "Copy $appid Preferences" \
"Your $appid Preferences are $userprefsize. \
You have $freesize available. Copy to Portable $appid?" `
if [ "$rv" == "1" ] ; then
if check_asf ; bu_p_plist ; runcopypref ; then
touch -f "$copy_pref"
"$CD" bubble --title "$appid Preferences copied" --text "Local \
$appid Preferences copied to Portable $appid with success." \
--icon-file "$appicon"
else
"$CD" bubble --title "$appid Preferences copy error" \
--text "An error occurred copying $appid Preferences to Portable $appid." \
--icon-file "$cautionicon" --no-timeout
fi
fi
else
CDokmessagec "No space to copy $appid Preferences" \
"Your $appid Preferences are $userprefsize. \
You have $freesize available. There is no enough space. Portable $appid will \
open without copy existing $appid Preferences." "--no-cancel" > /dev/null
fi
}
function copy_local_pref {
if [ ! -f "$copy_pref" ] && [ -d "$userpref" ] ; then
beep
text="Copy Preferences"
informativetext="Copy the existing $appid Preferences \
on this system to Portable $appid?"
rv=`"$CD" msgbox --no-newline --icon-file "$appicon" \
--text "$text" --informative-text "$informativetext" \
--button1 "Copy" --button2 "Don't Copy" --button3 "Never"`
if [ "$rv" == "1" ] ; then
copy_pf
elif [ "$rv" == "3" ] ; then
touch -f "$copy_pref"
fi
fi
}
# ========================================================
# bu/recover cache
# BackUp existing cache
# ========================================================
function bu_cache {
if [ -d "$usercache" ] ; then
mv "$usercache" "$usercache.pabu"
fi
}
function recover_cache {
if [ -d "$usercache.pabu" ] ; then
mv "$usercache.pabu" "$usercache"
fi
}
function remove_p_cache {
if [ -d "$usercache" ] ; then
rm -rf "$usercache"
fi
}
# ========================================================
# run
# Open Portable Application
# ========================================================
function run_app {
export CAMINO_PROFILE_DIR=$p_userpref
"$p_userbase/$appid.app/Contents/MacOS/$appid"
}
# ========================================================
# open_p_app
# Run Portable Application script
# ========================================================
function set_p_app {
if [ -f "$userplist" ] ; then
bu_plist # Backup of existing preference
fi
if [ -d "$usercache" ] ; then
bu_cache # Backup exixting Cache folder
fi
recover_p_plist # Recover portable preference
}
function close_p_app {
bu_p_plist # Backup portable preference
remove_p_cache # Remove portable cache
if [ -f "$userplist.pabu" ] ; then
recover_plist # Restore existing preference
else # Remove portable preference
rm -f "$userplist"
fi
if [ -d "$usercache.pabu" ] ; then
recover_cache # Restore existing cache
fi
}
function open_p_app {
if set_p_app ; then
"$CD" bubble --title "Portable $appid setup ok" --text "Portable \
$appid open with success." --icon-file "$appicon" &
else
CDokmessagec "Portable $appid setup error" \
"An error occour while opening portable preferences. Now quit." "--no-cancel" > /dev/null
close_p_app
exit 0
fi
run_app # Run application from external drive
if close_p_app ; then
"$CD" bubble --title "Portable $appid quit" --text "Portable \
$appid quit with success." --icon-file "$appicon" &
else
CDokmessagec "Portable $appid quit error" \
"An error occur while restoring local preferences or chache. \
Try to reopen Portable $appid to fix the problem." "--no-cancel" > /dev/null
fi
}
bsd_command_check
osx_version_check
quitapp
repair
check_p_asf
copy_local_pref
open_p_app
exit 0
Shell Script (Release 2.0)
Portable Camino.app is packaged using the Platypus script wrapper from http://sveinbjorn.sytes.net/platypus
#!/bin/sh -x
##########################################################################
#
# Portable Camino
# $Revision: 2.0
#
# The Contents of this file are made available subject to the terms
# of the following license
#
# - GNU General Public License Version 2.1
#
# Carlo Gandolfi, Paolo Portabluri, October 2006
#
# GNU General Public License Version 2.1
# =============================================
# Copyright 2006 by:
# Carlo Gandolfi - http://www.freesmug.org
# Paolo Portaluri - http://plus2.it/~paolo/
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public
# License version 2.1, as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA 02111-1307 USA
#
##########################################################################
# Reset PATH
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
appurl=org.mozilla.camino.plist
appid=Camino
userplistbase="Library/Preferences"
userplist="$HOME/$userplistbase/$appurl"
userprefbase="Library/Application Support"
userpref="$HOME/$userprefbase/$appid"
usercachebase="$HOME/Library/Caches"
usercache="$usercachebase/$appid"
loginplist="$HOME/Library/Preferences/loginwindow.plist"
p_userbase="$1/Contents/Resources/app"
p_userplist="$p_userbase/$userplistbase/$appurl"
p_userpref="$p_userbase/$userprefbase/$appid"
copy_pref="$p_userbase/CopyPref_Done"
CD="$p_userbase/../CocoaDialog.app/Contents/MacOS/CocoaDialog"
appicon="$p_userbase/../appIcon.icns"
cautionicon="$p_userbase/../P_${appid}_Caution.icns"
scrapp='Portable_'$appid'_scr.app'
scrapppath="$p_userbase/../$scrapp"
# ========================================================
# CDokmessage
# CocoaDialog Ok/Cancel message box
# $1 "text"
# $2 "informative text"
# $3 "--no-cancel" = don't show a cancel button
# ========================================================
function CDokmessage {
beep
"$CD" ok-msgbox --icon-file "$appicon" \
--text "$1" --informative-text "$2" "$3"
}
function CDokmessagec {
beep
"$CD" ok-msgbox --icon-file "$cautionicon" \
--text "$1" --informative-text "$2" "$3"
}
function beep {
/usr/bin/osascript << EOT
tell application "Finder"
beep
end tell
EOT
}
# ========================================================
# osx_version_check
# Check that the user is running Mac OS X 10.4 or higher
# ========================================================
function version_check_msg {
message1="You are running OS X version $version.\n\
Portable $appid can only be opened on Mac OS X 10.4 or higher."
button=`/usr/bin/osascript << EOT
tell application "Finder"
beep
display dialog "$message1" buttons {"Quit"} \
with icon caution default button "Quit"
set result to button returned of result
end tell
EOT`
if test "$button" == "Quit"; then # Quit application
exit 113
fi
}
function osx_version_check {
if [ -x "/usr/bin/sw_vers" ] ; then
# Return 96 + 17 if it is a bad version
version=`/usr/bin/sw_vers | grep '^ProductVersion:' | awk '{ print $2 }'`
case "$version" in
10.[0123]) version_check_msg ; exit 113;;
10.[0123].*) version_check_msg ; exit 113;;
esac
fi
}
# ========================================================
# quitapp
# Check if local app is open and quit
# ========================================================
function quitapp {
if ps cx | grep '[0-9] '"$appid"'$' > /dev/null; then
rv=` CDokmessage "$appid is already running on this system" \
"Only one copy can be run at a time. \
Quit runnig $appid and reopen Portable $appid." "--no-cancel" `
if [ "$rv" == "1" ] ; then # Quit application
exit 0
fi
fi
}
# ========================================================
# repair
# Repair preferences if Portable Application crashed
# ========================================================
function restore {
if [ -f "$userplist.pabu" ] ; then
recover_plist
fi
if [ -d "$userpref.pabu" ] ; then
rm -rf "$userpref"
recover_asf
fi
}
function restorepabu {
if [ -f "$userplist" ] || [ -d "$userpref" ] ; then
removemsg="Portable $appid has not restored local preferences back-up. \
Newer preferences already exists. You are now restoring preferences back-up \
overwriting/deleting existing one."
else
removemsg="Portable $appid has not restored local preference back-up. \
You are now restoring them."
fi
rv=` CDokmessagec "Restore local preferences back-up" "$removemsg" `
if [ "$rv" == "1" ] ; then
if restore ; then
CDokmessage "$appid Preferences back-up Restore done" \
"Local $appid preferences back-up restored with success." "--no-cancel" > /dev/null
else
CDokmessagec "$appid Preferences back-up Restore error" \
"Local $appid preferences back-up can't be restored. Now quit." "--no-cancel" \
> /dev/null
exit 0
fi
elif [ "$rv" == "2" ] ; then
repair
fi
}
function copy {
rm -rf "$HOME/$appid Pref BackUp/"
if [ -f "$userplist.pabu" ] ; then
mkdir -p "$HOME/$appid Pref BackUp/$userplistbase"
mv "$userplist.pabu" \
"$HOME/$appid Pref BackUp/$userplistbase/$appurl"
fi
if [ -d "$userpref.pabu" ] ; then
mkdir -p "$HOME/$appid Pref BackUp/$userprefbase"
mv "$userpref.pabu" \
"$HOME/$appid Pref BackUp/$userprefbase/$appid"
fi
}
function copypabu {
rv=` CDokmessagec "Copy local preferences back-up" \
"Portable $appid has not restored local preference back-up. \
You are now copying them to \"$HOME/$appid Pref BackUp/\" folder." `
if [ "$rv" == "1" ] ; then
if copy ; then
CDokmessage "$appid Preferences back-up Copy done" "Preferences \
back-up copied to \"$HOME/$appid Pref BackUp/\" folder with success." \
"--no-cancel" > /dev/null
else
CDokmessagec "$appid Preferences back-up Copy error" "Preferences \
back-up can't be copied to \"$HOME/$appid Pref BackUp/\" folder. Now quit." \
"--no-cancel" > /dev/null
exit 0
fi
elif [ "$rv" == "2" ] ; then
repair
fi
}
function repair {
if [ -d "$usercache.pabu" ] ; then
rm -rf "$usercache.pabu" # Delete backup cache
fi
if [ -h "$userpref" ] ; then
rm -f "$userpref" # Delete symlink
fi
if [ -f "$userplist.pabu" ] || [ -d "$userpref.pabu" ] ; then
beep
text2="Local $appid preferences back-up not restored"
informativetext2="A temporary back-up of local $appid preferences \
still exist, Portable $appid crashed without restoring this back-up. You can \
Restore local preferences back-up now or Copy to \""$HOME/$appid" BackUp\" \
folder to manually restore later."
rv=`"$CD" msgbox --icon-file "$cautionicon" \
--text "$text2" --informative-text "$informativetext2" \
--button1 "Restore" --button2 "Copy"`
if [ "$rv" == "1" ] ; then
restorepabu
elif [ "$rv" == "2" ] ; then
copypabu
fi
fi
}
# ========================================================
# system_crash_repair
# Repair pabu preferences after system crash
# ========================================================
function add_login_item {
if [ ! -f "$loginplist" ] || defaults read loginwindow \
AutoLaunchedApplicationDictionary | grep '()' > /dev/null ; then
defaults write loginwindow AutoLaunchedApplicationDictionary -array-add \
'{"Hide" = "true"; "Path" = "~/.'$scrapp'";}'
else
plutil -convert xml1 "$loginplist"
sed '/<array>/a\
<dict><key>Hide<\/key><true\/><key>Path<\/key><string>~\/.'$scrapp'<\/string><\/dict>' \
"$loginplist" > "$loginplist"_tmp
mv -f "$loginplist"_tmp "$loginplist"
plutil -convert binary1 "$loginplist"
fi
}
function del_login_item {
plutil -convert xml1 "$loginplist"
# get /PATTERN/ line number
line=`sed -n "/$scrapp/=" "$loginplist"`
if [ $line ] ; then
# delete starting from 4 lines before to 1 after
sed "$(($line-4)),$(($line+1)) d" "$loginplist" > "$loginplist"_tmp
mv -f "$loginplist"_tmp "$loginplist"
fi
plutil -convert binary1 "$loginplist"
}
# copy system crash repair from portable $appid to $HOME
function copy_scr {
cp -R "$scrapppath" "$HOME/.$scrapp"
}
# delete system crash repair from $HOME
function del_scr {
rm -rf "$HOME/.$scrapp"
}
# ========================================================
# check_p_asf
# Check and create Portable Application Support folders
# ========================================================
function check_p_asf {
if [ ! -d "$p_userpref" ] ; then
mkdir -p "$p_userpref"
fi
if [ ! -d "$p_userbase/$userplistbase" ] ; then
mkdir -p "$p_userbase/$userplistbase"
fi
}
# ========================================================
# bu/recover preference
# BackUp existing preference and restore portable ones
# ========================================================
function bu_plist {
mv "$userplist" "$userplist.pabu"
}
function recover_plist {
mv "$userplist.pabu" "$userplist"
}
function recover_p_plist {
if [ -f "$p_userplist" ] ; then
cp "$p_userplist" "$userplist"
fi
}
function bu_p_plist {
cp "$userplist" "$p_userplist"
}
# ========================================================
# copy_local_pref
# Copy local preferences to Portable Application
# ========================================================
function runcopypref { # written by Kevin Hendricks
rm -f /tmp/hpipe
mkfifo /tmp/hpipe
"$CD" progressbar --indeterminate --title "Copying $appid Preferences" \
--text "Copying \"$userpref\". Please wait..." < /tmp/hpipe &
exec 3<> /tmp/hpipe
echo -n . >&3
# do all of your work here
cp -R "$userpref" "$p_userpref"
exec 3>&-
wait
rm -f /tmp/hpipe
}
function check_asf {
if [ -d "$p_userpref" ] ; then
# delete p_userpref if it still exist
rm -Rf "$p_userpref"
else
mkdir -p "$p_userpref"
fi
}
# copy Preferences Folder
function copy_pf {
userprefsize=`du -hc "$userpref" | cut -f1 | tail -1`
freesize=`df -h "$p_userbase" | tail -1 | awk '{print $4}'`
buserprefsize=`du -c "$userpref" | cut -f1 | tail -1`
bfreesize=`df "$p_userbase" | tail -1 | awk '{print $4}'`
if [ $buserprefsize -lt $bfreesize ] ; then
rv=` CDokmessage "Copy $appid Preferences" \
"Your $appid Preferences are $userprefsize. \
You have $freesize available. Copy to Portable $appid?" `
if [ "$rv" == "1" ] ; then
if check_asf ; bu_p_plist ; runcopypref ; then
touch -f "$copy_pref"
"$CD" bubble --title "$appid Preferences copied" --text "Local \
$appid Preferences copied to Portable $appid with success." \
--icon-file "$appicon"
else
"$CD" bubble --title "$appid Preferences copy error" \
--text "An error occurred copying $appid Preferences to Portable $appid." \
--icon-file "$cautionicon" --no-timeout
fi
fi
else
CDokmessagec "No space to copy $appid Preferences" \
"Your $appid Preferences are $userprefsize. \
You have $freesize available. There is no enough space. Portable $appid will \
open without copy existing $appid Preferences." "--no-cancel" > /dev/null
fi
}
function copy_local_pref {
if [ ! -f "$copy_pref" ] && [ -d "$userpref" ] ; then
beep
text="Copy Preferences"
informativetext="Copy the existing $appid Preferences \
on this system to Portable $appid?"
rv=`"$CD" msgbox --no-newline --icon-file "$appicon" \
--text "$text" --informative-text "$informativetext" \
--button1 "Copy" --button2 "Don't Copy" --button3 "Never"`
if [ "$rv" == "1" ] ; then
copy_pf
elif [ "$rv" == "3" ] ; then
touch -f "$copy_pref"
fi
fi
}
# ========================================================
# bu/recover asf
# BackUp existing Application Support Folder and restore portable ones
# ========================================================
function bu_asf {
mv "$userpref" "$userpref.pabu"
}
function recover_asf {
mv "$userpref.pabu" "$userpref"
}
function recover_p_asf {
ln -s "$p_userpref" "$userpref"
}
function bu_p_asf {
rm -rf "$userpref"
}
# ========================================================
# bu/recover cache
# BackUp existing cache
# ========================================================
function bu_cache {
mv "$usercache" "$usercache.pabu"
}
function recover_cache {
mv "$usercache.pabu" "$usercache"
}
function remove_p_cache {
rm -rf "$usercache"
}
# ========================================================
# run
# Open Portable Application
# ========================================================
function run_app {
"$p_userbase/$appid.app/Contents/MacOS/$appid"
# run app outside the bundle:
# "$p_userbase/../../../../$appid.app/Contents/MacOS/$appid"
}
# ========================================================
# open_p_app
# Run Portable Application script
# ========================================================
function set_p_app {
copy_scr # Copy System Crash Restore app
add_login_item # Add loginwindow.plist item
if [ -f "$userplist" ] ; then
bu_plist # Backup of existing preference
fi
if [ -d "$userpref" ] ; then
bu_asf # Backup existing Application Support folder
fi
if [ -d "$usercache" ] ; then
bu_cache # Backup exixting Cache folder
fi
recover_p_plist # Recover portable preference
recover_p_asf # Recover portable Application Support folder
}
function close_p_app {
bu_p_plist # Backup portable preference
if [ -h "$userpref" ] ; then
bu_p_asf # Backup portable Application Support folder
fi
remove_p_cache # Remove portable cache
if [ -f "$userplist.pabu" ] ; then
recover_plist # Restore existing preference
else # Remove portable preference
rm -f "$userplist"
fi
if [ -d "$userpref.pabu" ] ; then
recover_asf # Restore portable Application Support folder
fi
if [ -d "$usercache.pabu" ] ; then
recover_cache # Restore existing cache
fi
del_login_item # Delete loginwindow.plist item
del_scr # Delete System Crash Restore app
}
function open_p_app {
if set_p_app ; then
"$CD" bubble --title "Portable $appid setup ok" --text "Portable \
$appid open with success." --icon-file "$appicon" &
else
CDokmessagec "Portable $appid setup error" \
"An error occour while opening portable preferences. Now quit" "--no-cancel" > /dev/null
close_p_app
exit 0
fi
run_app # Run application from external drive
if close_p_app ; then
"$CD" bubble --title "Portable $appid quit" --text "Portable \
$appid quit with success." --icon-file "$appicon" &
else
CDokmessagec "Portable $appid quit error" \
"An error occur while restoring local preferences. \
Try to reopen Portable $appid to fix the problem." "--no-cancel" > /dev/null
fi
}
osx_version_check
quitapp
repair
check_p_asf
copy_local_pref
open_p_app
exit 0
Portable_Camino_scr Script (Release 1.0)
Starting from r2.0 Portable Camino include Portable_Camino_scr.app (System Crash Restore),
an application copied temporary in $HOME that restore .pabu at user login after a system crash.
#!/bin/sh -x
##########################################################################
#
# Portable Camino scr
# $Revision: 1.0
#
# The Contents of this file are made available subject to the terms
# of the following license
#
# - GNU General Public License Version 2.1
#
# Carlo Gandolfi, Paolo Portabluri, October 2006
#
# GNU General Public License Version 2.1
# =============================================
# Copyright 2006 by:
# Carlo Gandolfi - http://www.freesmug.org
# Paolo Portaluri - http://plus2.it/~paolo/
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public
# License version 2.1, as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA 02111-1307 USA
#
##########################################################################
# Reset PATH
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
appurl=org.mozilla.camino.plist
appid=Camino
userplistbase="Library/Preferences"
userplist="$HOME/$userplistbase/$appurl"
userprefbase="Library/Application Support"
userpref="$HOME/$userprefbase/$appid"
usercachebase="$HOME/Library/Caches"
usercache="$usercachebase/$appid"
loginplist="$HOME/Library/Preferences/loginwindow.plist"
scrapp='Portable_'$appid'_scr.app'
function bu_p_asf {
rm -rf "$userpref"
}
function remove_p_cache {
rm -rf "$usercache"
}
function recover_plist {
mv "$userplist.pabu" "$userplist"
}
function recover_asf {
mv "$userpref.pabu" "$userpref"
}
function recover_cache {
mv "$usercache.pabu" "$usercache"
}
function del_login_item {
plutil -convert xml1 "$loginplist"
# get /PATTERN/ line number
line=`sed -n "/$scrapp/=" "$loginplist"`
if [ $line ] ; then
# delete starting from 4 lines before to 1 after
sed "$(($line-4)),$(($line+1)) d" "$loginplist" > "$loginplist"_tmp
mv -f "$loginplist"_tmp "$loginplist"
fi
plutil -convert binary1 "$loginplist"
}
# delete system crash repair from $HOME
function del_scr {
sleep 1; rm -rf "$HOME/.$scrapp"
}
function close_p_app {
# bu_p_plist # Backup portable preference
if [ -h "$userpref" ] ; then
bu_p_asf # Backup portable Application Support folder
fi
remove_p_cache # Remove portable cache
if [ -f "$userplist.pabu" ] ; then
recover_plist # Restore existing preference
else # Remove portable preference
rm -f "$userplist"
fi
if [ -d "$userpref.pabu" ] ; then
recover_asf # Restore portable Application Support folder
fi
if [ -d "$usercache.pabu" ] ; then
recover_cache # Restore existing cache
fi
del_login_item # Delete loginwindow.plist item
del_scr # Delete System Crash Restore app
}
close_p_app
exit 0
Shell Script (Release 1.0)
Portable Camino.app is packaged using the Platypus script wrapper from http://sveinbjorn.sytes.net/platypus
#!/bin/sh
##########################################################################
#
# Portable Camino
# $Revision: 1.0
#
# The Contents of this file are made available subject to the terms of
# either of the following licenses
#
# - GNU General Public License Version 2.1
#
# Carlo Gandolfi, Paolo Portabluri, June 2006
#
# GNU General Public License Version 2.1
# =============================================
# Copyright 2006 by:
# Carlo Gandolfi - http://www.freesmug.org
# Paolo Portaluri - http://plus2.it/~paolo/
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public
# License version 2.1, as published by the Free Software Foundation.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA 02111-1307 USA
#
##########################################################################
# Reset PATH
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
appurl=org.mozilla.camino.plist
appid=Camino
userplistbase="Library/Preferences"
userplist="$HOME/$userplistbase/$appurl"
userprefbase="Library/Application Support"
userpref="$HOME/$userprefbase/$appid"
usercachebase="$HOME/Library/Caches"
usercache="$usercachebase/$appid"
p_userbase="$1/Contents/Resources/app"
p_userplist="$p_userbase/$userplistbase/$appurl"
p_userpref="$p_userbase/$userprefbase/$appid"
copy_pref="$p_userbase/CopyPref_Done"
# ========================================================
# quitapp
# Check if local app is open and quit
# ========================================================
function quitapp {
if ps cx | grep '[0-9] '"$appid"'$' > /dev/null; then
message1="$appid is already running on this system. Only one copy can be run at a time"
button=`/usr/bin/osascript << EOT
tell application "Finder"
beep
display dialog "$message1" buttons {"Quit"} \
with title "Quit Running $appid" with icon caution default button "Quit"
set result to button returned of result
end tell
EOT`
if test "$button" == "Quit"; then # Quit application
exit 0
fi
fi
}
# ========================================================
# repair
# Repair preferences if Portable Application crashed
# ========================================================
function repair {
if [ -d "$usercache.pabu" ] ; then
rm -rf "$usercache.pabu" # Delete backup cache
fi
if [ -f "$userplist.pabu" ] || [ -d "$userpref.pabu" ] ; then
message2="Portable $appid has crashed without restoring existing preferences. \
Do you want to restore the original preferences now \
or copy to BackUp folder to manually restore later?"
button=`/usr/bin/osascript << EOT
tell application "Finder"
beep
display dialog "$message2" buttons {"Continue", "Restore", "Copy"} \
with title "Restoring Existing Preferences" \
with icon stop default button "Copy"
set result to button returned of result
end tell
EOT`
if test "$button" == "Copy"; then # Save old preferences in BackUp folder
rm -rf "$HOME/$appid Pref BackUp/"
mkdir -p "$HOME/$appid Pref BackUp/$userplistbase"
mkdir -p "$HOME/$appid Pref BackUp/$userprefbase"
mv "$userplist.pabu" "$HOME/$appid Pref BackUp/$userplistbase/$appurl"
mv "$userpref.pabu" "$HOME/$appid Pref BackUp/$userprefbase/$appid"
elif test "$button" == "Restore"; then # Restore existing preference
recover_plist
rm -rf "$userpref"
recover_asf
else
rm -rf "$userpref.pabu"
rm -f "$userplist.pabu"
fi
fi
}
# ========================================================
# check_p_asf
# Check and create Portable Application Support folders
# ========================================================
function check_p_asf {
if [ ! -d "$p_userpref" ]; then
mkdir -p "$p_userpref"
fi
if [ ! -d "$p_userbase/$userplistbase" ]; then
mkdir -p "$p_userbase/$userplistbase"
fi
}
# ========================================================
# copy_local_pref
# Copy local preferences to Portable Application
# ========================================================
function check_asf {
if [ -d "$p_userpref" ]; then
# delete p_userpref if it still exist
rm -Rf "$p_userpref"
else
mkdir -p "$p_userpref"
fi
}
# copy Preferences Folder
function copy_pf {
userprefsize=`du -hc "$userpref" | cut -f1 | tail -1`
message4="Your $appid Preferences folder is $userprefsize. Copy it to Portable $appid?"
button=`/usr/bin/osascript << EOT
tell application "Finder"
beep
display dialog "$message4" buttons {"Copy", "Cancel"} \
with title "Copy $appid Preferences Folder" \
with icon note default button "Cancel"
set result to button returned of result
end tell
EOT`
if test "$button" == "Copy"; then
check_asf
bu_p_plist
cp -R "$userpref" "$p_userpref"
touch -f "$copy_pref";
fi
}
function copy_local_pref {
if [ ! -f "$copy_pref" ] && [ -d "$userpref" ] ; then
message="Copy the existing $appid preferences on this system to Portable $appid?"
button=`/usr/bin/osascript << EOT
tell application "Finder"
beep
display dialog "$message" buttons {"Never", "Copy", "Don't Copy"} \
with title "Copy Preferences" \
with icon note default button "Don't Copy"
set result to button returned of result
end tell
EOT`
if test "$button" == "Copy"; then
copy_pf
elif test "$button" == "Never"; then
touch -f "$copy_pref";
fi
fi
}
# ========================================================
# bu/recover preference
# BackUp existing preference and restore portable ones
# ========================================================
function bu_plist {
mv "$userplist" "$userplist.pabu"
}
function recover_plist {
mv "$userplist.pabu" "$userplist"
}
function recover_p_plist {
cp "$p_userplist" "$userplist"
}
function bu_p_plist {
cp "$userplist" "$p_userplist"
}
# ========================================================
# bu/recover asf
# BackUp existing Application Support Folder and restore portable ones
# ========================================================
function bu_asf {
mv "$userpref" "$userpref.pabu"
}
function recover_asf {
mv "$userpref.pabu" "$userpref"
}
function recover_p_asf {
ln -s "$p_userpref" "$userpref"
}
function bu_p_asf {
rm -rf "$userpref"
}
# ========================================================
# bu/recover cache
# BackUp existing cache
# ========================================================
function bu_cache {
mv "$usercache" "$usercache.pabu"
}
function recover_cache {
mv "$usercache.pabu" "$usercache"
}
function remove_p_cache {
rm -rf "$usercache"
}
# ========================================================
# run
# Open Portable Application
# ========================================================
function run_app {
"$p_userbase/$appid.app/Contents/MacOS/$appid"
}
# ========================================================
# open_p_app
# Run Portable Application script
# ========================================================
function open_p_app {
if [ -f "$userplist" ] ; then
bu_plist # Backup of existing preference
fi
if [ -d "$userpref" ] ; then
bu_asf # Backup existing Application Support folder
fi
if [ -d "$usercache" ] ; then
bu_cache # Backup exixting Cache folder
fi
recover_p_plist # Recover portable preference
recover_p_asf # Recover portable Applicatin Support folder
run_app # Run application from external drive
bu_p_plist # Backup portable preference
bu_p_asf # Backup portable Applicatin Support folder
remove_p_cache # Remove portable cache
if [ -f "$userplist.pabu" ] ; then
recover_plist # Restore existing preference
else # Remove portable preference
rm -f "$userplist"
fi
if [ -d "$userpref.pabu" ] ; then
recover_asf # Restore portable Application Support folder
fi
if [ -d "$usercache.pabu" ] ; then
recover_cache # Restore existing cache
fi
}
quitapp
repair
check_p_asf
copy_local_pref
open_p_app
Added to: Camino.app/Contents/MacOS/defaults/pref/all-camino.js
// Portable Camino cache and history disabled
pref("browser.cache.disk.capacity", 0);
pref("browser.history_expire_days", 0);