Repository navigation
Expand file tree
/
Copy pathinstall.sh
More file actions
executable file
·77 lines (65 loc) · 2.05 KB
/
Copy pathinstall.sh
File metadata and controls
executable file
·77 lines (65 loc) · 2.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/bin/bash
set -e
DOTFILES="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
link() {
local src="$DOTFILES/$1"
local dest="$2"
# Already the correct symlink — skip
if [ -L "$dest" ] && [ "$(readlink "$dest")" = "$src" ]; then
echo " ok $dest"
return
fi
# Back up any existing real directory or file
if [ -e "$dest" ] && [ ! -L "$dest" ]; then
local backup="${dest}.bak.$(date +%s)"
mv "$dest" "$backup"
echo " backup $dest → $backup"
fi
mkdir -p "$(dirname "$dest")"
ln -sf "$src" "$dest"
echo " linked $dest → $src"
}
# Link a file and all @referenced files from it to the same destination directory
link_with_refs() {
local src_rel="$1" # e.g. agent/AGENTS.md
local dest="$2" # e.g. $HOME/.pi/agent/AGENTS.md
link "$src_rel" "$dest"
local src_dir
src_dir="$(dirname "$DOTFILES/$src_rel")"
local dest_dir
dest_dir="$(dirname "$dest")"
# Find all @Filename references in the source file
local refs
refs="$(grep -oE '@[^[:space:]]+' "$DOTFILES/$src_rel" | sed 's/^@//')"
echo "$refs" | while read -r ref; do
[ -z "$ref" ] && continue
local ref_rel
ref_rel="$(dirname "$src_rel")/$ref"
if [ -e "$DOTFILES/$ref_rel" ]; then
link "$ref_rel" "$dest_dir/$ref"
else
echo " missing $DOTFILES/$ref_rel (referenced in $src_rel)"
fi
done
# Prune stale symlinks in dest_dir that point into src_dir but are no
# longer referenced (e.g. deleted files like RTK.md)
local f base main_base
main_base="$(basename "$dest")"
for f in "$dest_dir"/*; do
[ -L "$f" ] || continue
base="$(basename "$f")"
[ "$base" = "$main_base" ] && continue
case "$(readlink "$f")" in
"$src_dir"/*)
if ! echo "$refs" | grep -qx "$base"; then
rm -v "$f"
fi
;;
esac
done
}
link nvim "$HOME/.config/nvim"
link tmux "$HOME/.config/tmux"
link agent "$HOME/.config/agent"
link_with_refs agent/AGENTS.md "$HOME/.pi/agent/AGENTS.md"
link_with_refs agent/AGENTS.md "$HOME/.claude/CLAUDE.md"