blob: 96a3d463b2669594e30655f653fff3f82e78d661 [file] [log] [blame]
#!/bin/bash -eu
# Copyright 2016 The Tulsi Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Build script to generate a dmg image for Tulsi.
if [[ $# < 1 ]]; then
echo "Usage: $0 <source_bundle> [options]"
echo "Options:"
echo " -o <output_file>: Full path to the target .dmg file. Defaults to"
echo " source_bundle with .app replaced by .dmg."
echo " --volume <name>: Name for the dmg volume. Defaults to source_bundle"
echo " with no path or file extension."
echo " -f <absolute_file_path>: An additional file to be added to the dmg."
echo " May be used multiple times."
exit 1
fi
readonly src_bundle_path="$1"
readonly src_bundle_file=$(basename "${src_bundle_path}")
readonly app_name="${src_bundle_file%.*}"
if [[ "${app_name}" == "" ]]; then
echo "Invalid source bundle ${src_bundle_file} (must end with .app)."
exit 1
fi
shift
additional_files=()
while [[ $# > 0 ]]; do
case "$1" in
-f)
shift
if [[ ! "$1" = /* ]]; then
echo "Error: -f files must be absolute paths, \"$1\" is invalid."
exit 1
fi
additional_files+=("$1")
;;
-o)
shift
output_file="$1"
;;
--volume)
volname="$1"
;;
*)
echo "WARNING: Unknown option '$1'"
;;
esac
shift
done
if [[ "${output_file:-}" == "" ]]; then
output_file="${app_name}.dmg"
fi
readonly tmp_file="${output_file}.tmp.dmg"
if [[ "${volname:-}" == "" ]]; then
volname="${app_name}"
fi
if [[ -e "${output_file}" ]]; then
rm "${output_file}"
fi
# Grab the absolute path to the temp file for cleanup in case an error occurs
# while in a subdirectory.
readonly tmp_file_dirname=$(dirname "${tmp_file}")
readonly tmp_file_basename=$(basename "${tmp_file}")
if [[ ! -d "${tmp_file_dirname}" ]]; then
mkdir -p "${tmp_file_dirname}"
fi
pushd "${tmp_file_dirname}" > /dev/null
readonly tmp_file_abs_path="$(pwd)/${tmp_file_basename}"
popd > /dev/null
function cleanup {
rm -f "${tmp_file_abs_path}"
}
trap cleanup exit
# Echo commands for the log.
set -x
# Create a dmg from the source bundle.
hdiutil create -ov \
-srcfolder "${src_bundle_path}" \
-volname "${volname}" \
-fs HFS+ \
-format UDRW "${tmp_file}"
# Open the dmg and add a link to /Applications and any additional files.
readonly devs=$(hdiutil attach "${tmp_file}" | cut -f 1)
readonly dev=$(echo ${devs} | cut -f 1 -d ' ')
# The following actions are performed in a subshell to ensure that the mounted
# image is detached in the case of an error (via a separate exit trap).
(
function close_dmg {
hdiutil detach $dev
}
trap close_dmg exit
pushd "/Volumes/${volname}" > /dev/null
ln -s /Applications .
if [[ ${#additional_files[@]} > 0 ]]; then
readonly files_dir="Tulsi Additional Files"
mkdir "${files_dir}"
pushd "${files_dir}" > /dev/null
for f in "${additional_files[@]}"; do
cp "${f}" .
done
popd > /dev/null
additional_files_command="set position of item \"${files_dir}\" of container window to {80, 230}"
window_bottom=470
else
additional_files_command=""
window_bottom=340
fi
popd > /dev/null
# Set up the sizes and positions of the contents.
echo '
tell application "Finder"
tell disk "'${volname}'"
open
set current view of container window to icon view
set toolbar visible of container window to false
set statusbar visible of container window to false
set the bounds of container window to {400, 100, 800, '${window_bottom}'}
set viewOptions to the icon view options of container window
set arrangement of viewOptions to not arranged
set icon size of viewOptions to 128
set position of item "'${src_bundle_file}'" of container window to {10, 10}
set position of item "Applications" of container window to {200, 10}
'"${additional_files_command}"'
close
open
update without registering applications
delay 4
end tell
end tell
' | osascript
)
# Convert the dmg to a compressed read-only one.
hdiutil convert "${tmp_file}" \
-format UDZO \
-imagekey zlib-level=9 \
-o "${output_file}"