main link.sh
Eric Bower  ·  2026-07-03
 1#!/usr/bin/env bash
 2
 3TRACKED_FILES=(
 4  bin/
 5  dot_pi/agent/extensions/
 6  dot_pi/agent/settings.json
 7  dot_config/
 8  dot/gitconfig
 9  dot/mbsyncrc
10  dot_gnupg/gpg-agent.conf
11  dot_ssh/config
12  dot/msmtprc
13  dot/npmrc
14  dot/editorconfig
15  dot_config/vim/vimrc
16)
17
18TRACKED_LOCATIONS=(
19  ~/.local/bin/
20  ~/.pi/agent/extensions/
21  ~/.pi/agent/settings.json
22  ~/.config/
23  ~/.gitconfig
24  ~/.mbsyncrc
25  ~/.gnupg/gpg-agent.conf
26  ~/.ssh/config
27  ~/.msmtprc
28  ~/.npmrc
29  ~/.editorconfig
30  ~/.vim/vimrc
31)
32
33find_files() {
34  local tfo="${TRACKED_FILES[$1]}"
35  if [[ ${tfo} == */ ]]; then
36    find "$PWD/${tfo}" -type d -exec find {} -maxdepth 1 -type f \; | sed "s|$PWD/${tfo}||" | sed "s|^/||"
37  fi
38}
39
40link_file() {
41  if [[ ! -L "$2" && ! -f "$2" && ! -d "$2" ]]; then
42    echo "Creating a link from $1 to $2"
43    mkdir -p "$(dirname "$2")"
44    ln -s "$1" "$2"
45  fi
46}
47
48unlink_file() {
49  if [[ -L "$1" ]]; then
50    echo "Unlinking $1"
51    unlink "$1"
52  fi
53}
54
55case "${1:-link}" in
56link)
57  for ((i = 0; i < ${#TRACKED_FILES[@]}; ++i)); do
58    tf="${TRACKED_FILES[$i]}"
59    tl="${TRACKED_LOCATIONS[$i]}"
60    link_file "$PWD/${tf}" "${tl}"
61    while IFS= read -r file; do
62      link_file "$PWD/${tf}${file}" "${tl}${file}"
63    done < <(find_files "$i")
64  done
65  ;;
66cleanup)
67  for ((i = 0; i < ${#TRACKED_FILES[@]}; ++i)); do
68    tl="${TRACKED_LOCATIONS[$i]}"
69    unlink_file "${tl}"
70    while IFS= read -r file; do
71      unlink_file "${tl}${file}"
72    done < <(find_files "$i")
73  done
74  ;;
75*)
76  echo "Usage: $0 [link|cleanup]" >&2
77  exit 1
78  ;;
79esac