Skip to content

Instantly share code, notes, and snippets.

@mpdude
Forked from scottsb/casesafe.sh
Last active May 12, 2020 13:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mpdude/f27d5d5bccf04e187a4f7c56413ae64e to your computer and use it in GitHub Desktop.
Save mpdude/f27d5d5bccf04e187a4f7c56413ae64e to your computer and use it in GitHub Desktop.
Create and manage a case-sensitive disk-image on macOS (OS X).
#!/bin/bash -e
# ---------------------------------------------------------
# Customizable Settings
# ---------------------------------------------------------
MOUNT_POINT="${CASE_SAFE_MOUNT_POINT:-${HOME}/Projekte}"
VOLUME_PATH="${CASE_SAFE_VOLUME_PATH:-${HOME}/.Projekte.sparsebundle}"
VOLUME_NAME="${CASE_SAFE_VOLUME_NAME:-Projekte}"
VOLUME_SIZE="${CASE_SAFE_VOLUME_SIZE:-200g}"
# ---------------------------------------------------------
# Functionality
# ---------------------------------------------------------
create() {
hdiutil create -fs 'Case-sensitive APFS' -size ${VOLUME_SIZE} -volname ${VOLUME_NAME} ${VOLUME_PATH}
}
automount() {
attach
cat << EOF > "/tmp/de.webfactory.mount-${VOLUME_NAME}.plist"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>RunAtLoad</key>
<true/>
<key>Label</key>
<string>de.webfactory.mount-${VOLUME_NAME}</string>
<key>ProgramArguments</key>
<array>
<string>hdiutil</string>
<string>attach</string>
<string>-notremovable</string>
<string>-nobrowse</string>
<string>-mountpoint</string>
<string>${MOUNT_POINT}</string>
<string>${VOLUME_PATH}</string>
</array>
</dict>
</plist>
EOF
sudo cp "/tmp/de.webfactory.mount-${VOLUME_NAME}.plist" "/Library/LaunchDaemons/de.webfactory.mount-${VOLUME_NAME}.plist"
rm "/tmp/de.webfactory.mount-${VOLUME_NAME}.plist"
}
noautomount() {
detach
sudo rm -f "/Library/LaunchDaemons/de.webfactory.mount-${VOLUME_NAME}.plist"
}
detach() {
m=$(hdiutil info | grep "${MOUNT_POINT}" | cut -f1)
if [ ! -z "$m" ]; then
sudo hdiutil detach $m
fi
}
attach() {
sudo hdiutil attach ${VOLUME_PATH} -notremovable -nobrowse -mountpoint ${MOUNT_POINT}
}
resize() {
compact
detach
hdiutil resize -size ${VOLUME_SIZE} ${VOLUME_PATH}
attach
}
compact() {
detach
hdiutil compact ${VOLUME_PATH} -batteryallowed
attach
}
help() {
cat <<EOF
usage: casesafe <command>
Possible commands:
create Initialize case-sensitive volume (only needed first time)
automount Configure macOS to mount the volume automatically on restart
noautomount Stop macOS from mounting the volume automatically on restart
mount Attach the case-sensitive volume
unmount Detach the case-sensitive volume
resize Resize the case-sensitive volume
compact Remove any uneeded reserved space in the volume
config Show current configuration and instructions on changing
help Display this message
EOF
}
config() {
cat <<EOF
The behavior of the script may be modified by setting the following environment variables.
If not set the script will use sane defaults.
CASE_SAFE_MOUNT_POINT
Location where case-sensitive volume will be mounted
Current effective value: ${MOUNT_POINT}
CASE_SAFE_VOLUME_PATH
Location where image file should be stored
Current effective value: ${VOLUME_PATH}
CASE_SAFE_VOLUME_NAME
Name of case-sensitive workspace as visible in macOS Finder app
Current effective value: ${VOLUME_NAME}
CASE_SAFE_VOLUME_SIZE
Maximum size of volume (will auto-grow up to this)
Current effective value: ${VOLUME_SIZE}
EOF
}
invalid() {
printf "'$1' is not a valid command.\n\n";
help
}
case "$1" in
create) create;;
automount) automount;;
noautomount) noautomount;;
attach) attach;;
detach) detach;;
resize) resize;;
compact) compact;;
config) config;;
help) help;;
'') help;;
*) invalid $1;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment