Files
dotfiles/dot_local/bin/executable_projects-sync
T

37 lines
1.1 KiB
Bash
Executable File

#!/bin/bash
# Mirror every repo under the ghq root (~/Code/<host>/<owner>/<repo>) as a
# symlink ~/Projects/<repo>. Repos sharing a name across owners get
# <owner>-<repo>. Links into ~/Code whose repo is gone are removed; anything
# in ~/Projects that is not such a link is never touched. Run by
# projects-sync.timer (systemd user).
set -euo pipefail
code=${GHQ_ROOT:-$HOME/Code}
projects=$HOME/Projects
mkdir -p "$projects"
mapfile -t repos < <(find "$code" -mindepth 4 -maxdepth 4 -name .git -printf '%h\n' 2>/dev/null | sort)
declare -A count keep
for repo in "${repos[@]}"; do
name=${repo##*/}
count[$name]=$((${count[$name]:-0} + 1))
done
for repo in "${repos[@]}"; do
name=${repo##*/}
if ((count[$name] > 1)); then
owner=${repo%/*}
name=${owner##*/}-$name
fi
link=$projects/$name
keep[$name]=1
[[ -e $link && ! -L $link ]] && continue
[[ $(readlink "$link") == "$repo" ]] || ln -sfn "$repo" "$link"
done
for link in "$projects"/*; do
[[ -L $link && $(readlink "$link") == "$code"/* && -z ${keep[${link##*/}]:-} ]] && rm "$link"
done
exit 0