Create a gist now

Instantly share code, notes, and snippets.

@scottsb /casesafe.sh forked from Hais/workspace.sh
Last active May 19, 2018

What would you like to do?
Create and manage a case-sensitive disk-image on macOS (OS X).
#!/bin/bash
# ---------------------------------------------------------
# Customizable Settings
# ---------------------------------------------------------
MOUNT_POINT="${CASE_SAFE_MOUNT_POINT:-${HOME}/casesafe}"
VOLUME_PATH="${CASE_SAFE_VOLUME_PATH:-${HOME}/.casesafe.dmg.sparseimage}"
VOLUME_NAME="${CASE_SAFE_VOLUME_NAME:-casesafe}"
VOLUME_SIZE="${CASE_SAFE_VOLUME_SIZE:-60g}"
# ---------------------------------------------------------
# Functionality
# ---------------------------------------------------------
create() {
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size ${VOLUME_SIZE} -volname ${VOLUME_NAME} ${VOLUME_PATH}
}
automount() {
attach
cat << EOF > "/tmp/com.${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>com.${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/com.${VOLUME_NAME}.plist" "/Library/LaunchDaemons/com.${VOLUME_NAME}.plist"
rm "/tmp/com.${VOLUME_NAME}.plist"
}
noautomount() {
detach
sudo rm -f "/Library/LaunchDaemons/com.${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 -notremovable -nobrowse -mountpoint ${MOUNT_POINT} ${VOLUME_PATH}
}
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
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 seting 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 "casesafe: '$1' is not a valid command.\n\n";
help
}
case "$1" in
create) create;;
automount) automount;;
noautomount) noautomount;;
mount) attach;;
unmount) detach;;
compact) compact;;
config) config;;
help) help;;
'') help;;
*) invalid $1;;
esac
@swinton

This comment has been minimized.

Show comment Hide comment
@swinton

swinton Sep 17, 2016

This is great, thank you for providing it ๐Ÿ™‡

swinton commented Sep 17, 2016

This is great, thank you for providing it ๐Ÿ™‡

@jeiros

This comment has been minimized.

Show comment Hide comment
@jeiros

jeiros Oct 18, 2016

This saved my butt today!
๐Ÿ™ God bless ๐Ÿ™

jeiros commented Oct 18, 2016

This saved my butt today!
๐Ÿ™ God bless ๐Ÿ™

@hoppinjohnz

This comment has been minimized.

Show comment Hide comment
@hoppinjohnz

hoppinjohnz Jan 11, 2017

Thanks for sharing this improved disk image script. It solved my problem of developing applications in Java with Mac OS X. Well done.

Thanks for sharing this improved disk image script. It solved my problem of developing applications in Java with Mac OS X. Well done.

@joshka

This comment has been minimized.

Show comment Hide comment
@joshka

joshka Apr 28, 2017

Thanks for sharing this. For multiple mounts, it seems that you would need to update:
https://gist.github.com/scottsb/479bebe8b4b86bf17e2d#file-workspace-sh-L44 to include ${VOLUME_NAME}

joshka commented Apr 28, 2017

Thanks for sharing this. For multiple mounts, it seems that you would need to update:
https://gist.github.com/scottsb/479bebe8b4b86bf17e2d#file-workspace-sh-L44 to include ${VOLUME_NAME}

@crdesai

This comment has been minimized.

Show comment Hide comment
@crdesai

crdesai Nov 15, 2017

Thanks for the script. It helped me resolve an issue I was facing with my package. I enabled automount while creating the volume at this time. However, I do not need the volume anymore. How can I make sure OS does not automount it when i restart my machine?

crdesai commented Nov 15, 2017

Thanks for the script. It helped me resolve an issue I was facing with my package. I enabled automount while creating the volume at this time. However, I do not need the volume anymore. How can I make sure OS does not automount it when i restart my machine?

@scottsb

This comment has been minimized.

Show comment Hide comment
@scottsb

scottsb Nov 16, 2017

@joshka, this wasn't really intended to support multiple mounts, but I don't see any harm in that suggestion, so I'll update it.

@crdesai, I just updated this to include a "noautomount" subcommand as well.

Owner

scottsb commented Nov 16, 2017

@joshka, this wasn't really intended to support multiple mounts, but I don't see any harm in that suggestion, so I'll update it.

@crdesai, I just updated this to include a "noautomount" subcommand as well.

@strogonoff

This comment has been minimized.

Show comment Hide comment
@strogonoff

strogonoff May 19, 2018

SPARSEBUNDLE might be a better choice than SPARSE. The bundle appears to split the image into chunks, and therefore works better with backup software which only needs to update the changed chunks after the first copy.

See also: https://discussions.apple.com/thread/2001162

SPARSEBUNDLE might be a better choice than SPARSE. The bundle appears to split the image into chunks, and therefore works better with backup software which only needs to update the changed chunks after the first copy.

See also: https://discussions.apple.com/thread/2001162

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment