create_diskimage 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. autoload -Uz log_debug log_error log_info log_status log_group log_output log_warning
  2. local -r _usage="Usage: %B${0}%b <source> <volume name> <output_name>
  3. Create macOS disk image <volume name> <output_name> with contents of <source>"
  4. if (( ! # )) {
  5. log_error 'Called without arguments.'
  6. log_output ${_usage}
  7. return 2
  8. }
  9. local source=${1}
  10. local volume_name=${2}
  11. local output_name=${3}
  12. log_group "Create macOS disk image"
  13. trap "safe_hdiutil detach /Volumes/${output_name}; rm temp.dmg; log_group; return 2" ERR
  14. safe_hdiutil() {
  15. local _status=0
  16. local -r -a _backoff=(2 5 10 15 30)
  17. for i ({1..5}) {
  18. hdiutil ${@} && _status=0 || _status=1
  19. if (( _status )) {
  20. log_warning "Unable to run 'hdiutil ${@}' (attempt #${i}). Retrying."
  21. if (( ${+CI} )) sudo pkill -9 XProtect >/dev/null || true
  22. sleep ${_backoff[${i}]}
  23. } else {
  24. break
  25. }
  26. }
  27. if (( _status )) {
  28. log_error "Unable to run 'hdiutil ${@}'. Aborting"
  29. log_group
  30. return 2
  31. }
  32. }
  33. safe_hdiutil create \
  34. -volname "${volume_name}" \
  35. -srcfolder ${source} \
  36. -ov \
  37. -fs HFS+ \
  38. -format UDRW \
  39. temp.dmg
  40. safe_hdiutil attach \
  41. -noverify \
  42. -readwrite \
  43. -mountpoint /Volumes/${output_name} \
  44. temp.dmg
  45. log_info "Waiting 2 seconds to ensure mounted volume is available..."
  46. sleep 2
  47. log_status "Done"
  48. log_info "Setting up disk volume..."
  49. log_status "Volume icon"
  50. SetFile -c icnC /Volumes/${output_name}/.VolumeIcon.icns
  51. log_status "Icon positions"
  52. osascript package.applescript ${output_name}
  53. log_status "File permissions"
  54. chmod -Rf go-w /Volumes/${output_name}
  55. SetFile -a C /Volumes/${output_name}
  56. rm -rf -- /Volumes/${output_name}/.fseventsd(N)
  57. log_info "Converting disk image..."
  58. safe_hdiutil detach /Volumes/${output_name}
  59. safe_hdiutil convert \
  60. -format ULFO \
  61. -ov \
  62. -o ${output_name}.dmg temp.dmg
  63. rm temp.dmg
  64. trap '' ERR
  65. log_group
  66. return 0