From 619e0f6c7079c0e09b53a7532f9abc210650d4a0 Mon Sep 17 00:00:00 2001 From: sommerfeld Date: Tue, 21 Apr 2026 01:23:49 +0100 Subject: feat(justfile): add etc-rm recipe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removes one or more files from the repo's etc/ tree and tidies any now-empty parent directories (bounded to inside etc/). Leaves the live /etc copy untouched. Composes with etc-reset to stop tracking a file cleanly: just etc-reset /etc/foo.conf # repo → pristine just apply # deploy pristine to /etc just etc-rm etc/foo.conf # stop tracking; /etc unchanged --- .github/copilot-instructions.md | 2 +- justfile | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 2d6c709..20573d0 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -21,7 +21,7 @@ The repo root is a chezmoi source directory. Files targeting `$HOME` use chezmoi - `bootstrap.sh` at the repo root is a POSIX shell script that takes a fresh minimal Arch install (only `base`) to a fully deployed state. It installs prerequisites, enables `%wheel` sudoers, bootstraps `paru-bin` from the AUR, clones the repo, runs `just init`, and optionally invokes `create-efi`. Designed to be curlable: `curl -fsSL .../bootstrap.sh | sh`. - `.chezmoiignore` excludes non-home files (`etc/`, `meta/`, `systemd-units/`, `firefox/`, docs) from deployment to `$HOME`. - `.githooks/` contains git hooks (notably `post-commit` which runs `chezmoi apply`). Activated by `just init`. -- `justfile` provides recipes: `init` (first-time setup), `sync` (apply + fix), `apply`, `fix`, `status`, `pkg-drift`, `dotfile-drift`, `undeclared`, `diff`, `merge`, `groups`, `install`, `install-all`, `add`, `remove`, `services`, `services-enable`, `services-drift`, `etc-drift`, `etc-diff`, `etc-upstream-diff`, `etc-add`, `etc-reset`. Run `just` or `just --list` to see them. +- `justfile` provides recipes: `init` (first-time setup), `sync` (apply + fix), `apply`, `fix`, `status`, `pkg-drift`, `dotfile-drift`, `undeclared`, `diff`, `merge`, `groups`, `install`, `install-all`, `add`, `remove`, `services`, `services-enable`, `services-drift`, `etc-drift`, `etc-diff`, `etc-upstream-diff`, `etc-add`, `etc-rm`, `etc-reset`. Run `just` or `just --list` to see them. ## Window manager diff --git a/justfile b/justfile index 212730a..0094a12 100644 --- a/justfile +++ b/justfile @@ -334,6 +334,29 @@ etc-add +paths: echo echo "Run 'chezmoi apply' to sync (no-op content-wise, refreshes deploy hash)." +# Remove one or more files from the repo's etc/ tree (leaves live /etc untouched) +etc-rm +paths: + #!/usr/bin/env bash + set -eo pipefail + for raw in {{ paths }}; do + case "$raw" in + *..*|*/./*|./*|../*) echo "error: unsafe path: $raw" >&2; exit 1 ;; + esac + p=${raw#/}; p=${p#etc/} + repo=etc/$p + [ -f "$repo" ] || { echo "error: $repo is not managed in the repo" >&2; exit 1; } + rm -- "$repo" + # Tidy empty parent dirs inside etc/ without walking out of it + parent=$(dirname "$repo") + while [ "$parent" != "etc" ] && [ "$parent" != "." ]; do + rmdir -- "$parent" 2>/dev/null || break + parent=$(dirname "$parent") + done + echo "removed: $repo (/etc/$p left untouched)" + done + echo + echo "Run 'just apply' to refresh the deploy-etc hash." + # Reset repo-managed etc/ to pristine pacman contents (run 'just apply' afterward) etc-reset +paths: #!/usr/bin/env bash -- cgit v1.2.3-70-g09d2