-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrack
executable file
·63 lines (60 loc) · 1.58 KB
/
track
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
#!/usr/bin/env bash
shopt -s globstar
function help() {
printf "Usage: %s [args] [path]...\n" "$(basename "$0")"
printf "Hardlink dotfiles to repository\n"
printf "It is meant to be run from the repository root directory\n"
printf "\n"
printf " -t target_dir Target directory\n"
printf " -f Add --force flag when creating hardlink\n"
printf "\n"
printf "If -t flag is not passed, the target path structure is dotfiles_dir/source_path.trim_prefix(home_dir)"
printf "\n"
printf "Example: %s /home/<user>/.config/nvim\n" "$(basename "$0")"
exit 0
}
function run() {
dotfiles_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
[[ $# -ge 1 ]] || {
help
exit 1
}
sources=()
while [[ "$1" != "" ]]; do
local arg="$1"
if [[ "$arg" == "-h" ]]; then
help
elif [[ "$arg" == "-t" ]]; then
[[ -z "${all_target_dir+x}" ]] || {
printf "ERROR: target directory already set\n"
exit 1
}
all_target_dir="$2"
shift 2
elif [[ "$arg" == "-f" ]]; then
lnargs=("$arg")
shift
elif [[ -d "$arg" ]]; then
sources+=("$arg"/**/*)
shift
else
[[ -e "$arg" ]] || {
printf "ERROR: path '%s' does not exist\n" "$arg"
exit 1
}
sources+=("$arg")
shift
fi
done
for source in "${sources[@]}"; do
source=$(readlink -f "${source}")
if [[ -n "${all_target_dir+x}" ]]; then
target_dir="${all_target_dir}"
else
target_dir="${dotfiles_dir}/$(dirname "${source#$HOME/}")"
fi
printf "\033[0;32m%s <- %s\033[0m\n" "${source}" "${target_dir}"
mkdir -p "${target_dir}" && ln "${lnargs[@]}" "${source}" "${target_dir}"
done
}
run "$@"