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