From b7e9b356d8e43430f20e04b4b6a02ea90efc38f2 Mon Sep 17 00:00:00 2001 From: Lukas Wurzinger Date: Sun, 5 Jan 2025 15:22:27 +0100 Subject: [PATCH] clean dead links --- .gitignore | 2 ++ flake.nix | 1 + plow/plow.bash | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 55281ec..106935f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ .devenv/ .pre-commit-config.yaml + +.plowcache diff --git a/flake.nix b/flake.nix index ac67885..222e809 100644 --- a/flake.nix +++ b/flake.nix @@ -39,6 +39,7 @@ pkgs.lib.mkIf (devenvRootFileContent != "") devenvRootFileContent; env.PLOW_FROM = "./home"; + env.PLOW_CACHE = "./.plowcache"; imports = [ ./devenv.nix diff --git a/plow/plow.bash b/plow/plow.bash index 5ad0e12..37d3210 100755 --- a/plow/plow.bash +++ b/plow/plow.bash @@ -4,9 +4,30 @@ set -o errexit set -o nounset set -o pipefail +progname="$0" + +error() { + local line + for line in "$@"; do + echo "$progname: $line" 1>&2 + done + + exit 1 +} + shopt -s nullglob globstar -opts=$(getopt --options f:t:Fivm: --longoptions=from:,to:,force,interactive,verbose,directory-mode: --name "$0" -- "$@") +if [[ ! -v PLOW_CACHE ]]; then + PLOW_CACHE=.plowcache +fi + +opts=$( + getopt \ + --options f:t:Fivm: \ + --longoptions from:,to:,force,interactive,verbose,directory-mode: \ + --name "$0" \ + -- "$@" +) eval set -- "$opts" @@ -14,6 +35,7 @@ from=${PLOW_FROM:-$PWD} to=${PLOW_TO:-$HOME} lnflags=() mkdirflags=() +rmflags=() while true; do case "$1" in -f | --from) @@ -26,15 +48,18 @@ while true; do ;; -F | --force) lnflags+=(--force) + rmflags+=(--force) shift ;; -i | --interactive) lnflags+=(--interactive) + rmflags+=(--interactive) shift ;; -v | --verbose) lnflags+=(--verbose) mkdirflags+=(--verbose) + rmflags+=(--verbose) shift ;; -m | --directory-mode) @@ -62,13 +87,34 @@ fi shopt -s dotglob +cache=() +if [[ -n "$PLOW_CACHE" ]]; then + if [[ -e "$PLOW_CACHE" ]]; then + while IFS= read -r link; do + cache+=("$link") + done < "$PLOW_CACHE" + fi + + : > "$PLOW_CACHE" +fi + for choice in "${choices[@]}"; do prefix=$from/$choice for target in "$prefix"/**/*; do if [[ -f "$target" ]]; then link=$to${target#"$prefix"} - mkdir --parents "${mkdirflags[@]}" -- "$(dirname -- "$link")" + parent=$(dirname -- "$link") + mkdir --parents "${mkdirflags[@]}" -- "$parent" ln --symbolic "${lnflags[@]}" -- "$target" "$link" + if [[ -n "$PLOW_CACHE" ]]; then + echo "$link" >> "$PLOW_CACHE" + fi fi done done + +for link in "${cache[@]}"; do + if [[ -L "$link" && ! -f "$link" ]]; then + rm "${rmflags[@]}" -- "$link" + fi +done