421b802467
- Corrected the backup path in the `_in_backup` function to reflect the new structure under `mackup/`. - Improved error handling in `ssr::mackup::configure` to skip restore if the configuration file is not updated, providing user feedback. - Updated `ssr::sync` to conditionally execute backup based on configuration validity, enhancing robustness. - Revised documentation in configuration examples to clarify the new Mackup directory structure and its implications for users.
100 lines
3.5 KiB
Bash
Executable File
100 lines
3.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# ssr-sync — back up Homebrew + Mackup state to the configured cloud dir (copy-based mackup backup).
|
|
|
|
set -euo pipefail
|
|
SSR_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
# shellcheck source=../lib/common.sh
|
|
source "$SSR_ROOT/lib/common.sh"
|
|
# shellcheck source=../lib/cloud.sh
|
|
source "$SSR_ROOT/lib/cloud.sh"
|
|
# shellcheck source=../lib/brew.sh
|
|
source "$SSR_ROOT/lib/brew.sh"
|
|
# shellcheck source=../lib/mackup.sh
|
|
source "$SSR_ROOT/lib/mackup.sh"
|
|
# shellcheck source=../lib/apps.sh
|
|
source "$SSR_ROOT/lib/apps.sh"
|
|
# shellcheck source=../lib/macos-prefs.sh
|
|
source "$SSR_ROOT/lib/macos-prefs.sh"
|
|
# shellcheck source=../lib/icloud.sh
|
|
source "$SSR_ROOT/lib/icloud.sh"
|
|
# shellcheck source=../lib/installers.sh
|
|
source "$SSR_ROOT/lib/installers.sh"
|
|
|
|
ssr::require_macos
|
|
ssr::load_config
|
|
|
|
ssr::log "ssr sync starting"
|
|
ssr::syslog "sync starting"
|
|
|
|
ssr::cloud::ensure_available
|
|
backup_dir="$(ssr::cloud::backup_dir)"
|
|
mackup_dir="$(ssr::cloud::mackup_dir)"
|
|
ssr::ensure_dir "$backup_dir"
|
|
ssr::ensure_dir "$mackup_dir"
|
|
|
|
# Kick off async iCloud download for the Mackup folder immediately so that
|
|
# files have maximum time to download while brew update/upgrade runs.
|
|
# ssr::icloud::wait is called just before mackup backup below.
|
|
ssr::icloud::prefetch "$mackup_dir"
|
|
|
|
ssr::brew::ensure_installed
|
|
ssr::mackup::ensure_installed
|
|
_mackup_cfg_ok=true
|
|
ssr::mackup::configure "$mackup_dir" || _mackup_cfg_ok=false
|
|
|
|
ssr::brew::update
|
|
ssr::brew::upgrade
|
|
|
|
# Wait for iCloud downloads triggered above before handing off to mackup.
|
|
# Timeout (seconds) is configurable; default 180s.
|
|
ssr::icloud::wait "$mackup_dir" "${SSR_ICLOUD_WAIT_TIMEOUT:-180}"
|
|
|
|
if [[ "$_mackup_cfg_ok" == true ]]; then
|
|
ssr::mackup::backup
|
|
else
|
|
ssr::warn "Skipping mackup backup — ~/.mackup.cfg was not updated (see messages above)."
|
|
fi
|
|
ssr::brew::dump "$backup_dir"
|
|
ssr::brew::cleanup
|
|
|
|
# Back up the extra-installers list alongside the Brewfile.
|
|
ssr::installers::sync_list "$backup_dir"
|
|
|
|
# Surface .app bundles that aren't covered by brew cask or the App Store —
|
|
# they would otherwise be missed on `ssr restore` and need manual reinstall.
|
|
if [[ "${SSR_SCAN_UNMANAGED_APPS:-true}" == "true" ]]; then
|
|
ssr::log "Scanning for unmanaged .app bundles"
|
|
report_path="$(ssr::apps::write_report "$backup_dir")"
|
|
# Each row in the Markdown table starts with `| [`; count those.
|
|
count="$(grep -cE '^\| \[' "$report_path" 2>/dev/null || echo 0)"
|
|
if [[ "$count" -gt 0 ]]; then
|
|
ssr::warn "Found $count unmanaged app(s) — manual reinstall on restore:"
|
|
# Extract the linked app name from each table row for a quick console summary.
|
|
grep -E '^\| \[' "$report_path" \
|
|
| sed -E 's/^\| \[([^]]+)\].*/ - \1/'
|
|
ssr::log "Full report: $report_path"
|
|
else
|
|
ssr::ok "No unmanaged apps detected."
|
|
fi
|
|
fi
|
|
|
|
# Snapshot macOS preference domains so they can be restored on a new machine.
|
|
if [[ "${SSR_SNAPSHOT_MACOS_PREFS:-true}" == "true" ]]; then
|
|
ssr::log "Snapshotting macOS preferences"
|
|
ssr::macos::prefs_export "$backup_dir"
|
|
fi
|
|
|
|
# Record sync time so `ssr status` can report freshness.
|
|
state_dir="${SSR_STATE_DIR:-$HOME/.local/state/ssr}"
|
|
ssr::ensure_dir "$state_dir"
|
|
date '+%Y-%m-%dT%H:%M:%S%z' > "$state_dir/last-sync"
|
|
|
|
# Mark Mackup folder files as keep-local so iCloud doesn't evict them
|
|
# before the next sync run, avoiding slow on-demand downloads next time.
|
|
if [[ "${SSR_ICLOUD_KEEP_LOCAL:-true}" == "true" ]]; then
|
|
ssr::icloud::keep_local "$mackup_dir"
|
|
fi
|
|
|
|
ssr::ok "ssr sync completed → $backup_dir"
|
|
ssr::syslog "sync completed"
|