refactor: ssr-*.cfg files are user-owned after creation

ssr mackup scan now only suggests NEW files — it never overwrites an
existing ssr-*.cfg. Once created, the file belongs to the user who
edits it directly in ~/.mackup/ to customise which paths are backed up.

- _ssr_mackup_write_cfg: returns early if file already exists
- scan: drops UPD logic; only shows NEW suggestions
- _ssr_mackup_resolve_paths: removed SSR_MACKUP_SELECTIVE_PATHS support
  (ssr.conf config variable removed — edit the cfg files instead)
- Scan output: hints to edit files directly after creation

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-12 15:06:43 +02:00
parent be9b37010e
commit 61091aa6bf
3 changed files with 25 additions and 57 deletions
+12 -23
View File
@@ -85,26 +85,16 @@ cmd_scan() {
_is_declared "$stale_path" && to_remove+=("$stale_cfg")
done
# Classify each candidate: NEW or UPD (content differs from existing).
# Only suggest items that have NO cfg file yet.
# Existing files are user-owned — edit them directly in ~/.mackup/.
local -a to_write=()
local -a labels=()
local -a cfg_paths=()
local it app_name desired existing cfg_file paths_block
local it app_name cfg_file
for it in "${items[@]:-}"; do
app_name="$(_ssr_mackup_cfg_name "$it")"
cfg_file="$cfg_dir/${app_name}.cfg"
paths_block="$(_ssr_mackup_resolve_paths "$it")"
desired="$(printf '[application]\nname = %s\n\n[configuration_files]\n%s\n' "$app_name" "$paths_block")"
if [[ -f "$cfg_file" ]]; then
existing="$(cat "$cfg_file")"
if [[ "$existing" == "$desired" ]]; then
continue # already up-to-date, skip
fi
labels+=("UPD")
else
labels+=("NEW")
fi
[[ -f "$cfg_file" ]] && continue # user owns it — skip
to_write+=("$it")
cfg_paths+=("$cfg_file")
done
@@ -120,22 +110,20 @@ cmd_scan() {
printf '\nSuggested Mackup app definitions:\n'
local i
for i in "${!to_write[@]}"; do
local label="${labels[$i]}"
local path="${cfg_paths[$i]##*/}"
local colour
[[ "$label" == "NEW" ]] && colour="\033[32m" || colour="\033[33m"
# Show resolved paths (selective or whole dir).
# Show resolved paths (selective default or whole dir).
local resolved; resolved="$(_ssr_mackup_resolve_paths "${to_write[$i]}")"
local line_count; line_count="$(printf '%s\n' "$resolved" | wc -l | tr -d ' ')"
local paths_hint
if [[ "$line_count" -eq 1 && "$resolved" == "${to_write[$i]}" ]]; then
paths_hint="${to_write[$i]}/" # whole directory
paths_hint="${to_write[$i]}/"
else
paths_hint="$line_count sub-path(s) of ${to_write[$i]}/"
fi
printf " ${colour}%s\033[0m %-38s %s\n" \
"$label" "~/.mackup/$path" "$paths_hint"
printf " \033[32mNEW\033[0m %-38s %s\n" \
"~/.mackup/$path" "$paths_hint"
done
printf '\n\033[2mEdit the generated files directly in ~/.mackup/ to customise paths.\033[0m\n'
fi
if [[ ${#to_remove[@]} -gt 0 ]]; then
@@ -151,7 +139,7 @@ cmd_scan() {
local total=$(( ${#to_write[@]} + ${#to_remove[@]} ))
ssr::confirm "Apply $total change(s)?" 60 || { printf 'Aborted.\n'; return 0; }
# Write new/updated files.
# Write new files (never overwrites existing ones).
for it in "${to_write[@]:-}"; do
_ssr_mackup_write_cfg "$cfg_dir" "$it"
done
@@ -163,7 +151,8 @@ cmd_scan() {
done
ssr::ok "Done — ${#to_write[@]} written, ${#to_remove[@]} removed."
printf '\nRun \033[1mssr sync\033[0m to back up with the new definitions.\n\n'
printf '\nEdit ~/.mackup/ssr-*.cfg directly to customise paths.\n'
printf 'Run \033[1mssr sync\033[0m to back up with the new definitions.\n\n'
}
# ---------------------------------------------------------------------------