mirror of https://github.com/Chizi123/Dotfiles.git

Joel Grunbaum
2023-12-28 bdc57299b1eb177c8f06c40f52b5c78a9ca99e07
commit | author | age
f86690 1 #!/bin/sh
JG 2
535d0d 3 install_conflict() {
JG 4     file="$1";
5     loc="$2";
6     if [ -n "$3" ]; then
7         SUPERUSER="sudo"
8     else
9         SUPERUSER="";
10     fi
11     while true; do
12         CHOICE="overwrite"
b114ad 13         if [ -e "$loc" ] && [ "$FORCE" = "0" ] && [ $(diff "$loc" "$file") ]; then
535d0d 14             echo "WARNING: \"$loc\" exists, (overwrite, change, nothing): "
JG 15             read CHOICE
16         fi
17         case "$CHOICE" in
18             o|overwrite)
19                 dir=$(dirname "$loc")
20                 $SUPERUSER mkdir -p "$dir"
21                 $SUPERUSER ln -sf "$(pwd)/$file" "$loc"; break;;
22             c|change)
23                 tmpfile=$(mktemp)
24                 echo "$loc" >> "$tmpfile"
25                 $EDITOR "$tmpfile"
26                 loc=$(cat "$tmpfile")
27                 rm "$tmpfile"
28                 unset tmpfile;;
29             n|nothing)
30                 break;;
31             *)
32                 echo "INVALID CHOICE \"$CHOICE\", (overwrite, change, nothing)"
33                 read CHOICE
34         esac
35     done
36
37 }
38
f86690 39 install_links() {
49cbc0 40     . ./DICT
f86690 41     if [ -n "$FILES" ]; then
d2c44c 42     for i in $(seq 1 "$(echo "$FILES" | wc -w)"); do
JG 43         file=$(echo "$FILES" | cut -d' ' -f "$i")
44         loc=$(echo "$LOCATIONS" | cut -d' ' -f "$i")
535d0d 45         install_conflict "$file" "$loc"
f86690 46     done
JG 47     fi
48     if [ -n "$SUDO_FILES" ]; then
535d0d 49         for i in $(seq 1 "$(echo "$SUDO_FILES" | wc -w)"); do
JG 50             file=$(echo "$SUDO_FILES" | cut -d' ' -f "$i")
51             loc=$(echo "$SUDO_LOCATIONS" | cut -d' ' -f "$i")
52             install_conflict "$file" "$loc" 1
53         done
f86690 54     fi
535d0d 55     if type custom 2>/dev/null | grep -q "function" ; then
d2c44c 56         custom install
f86690 57     fi
JG 58 }
59
60 remove_links() {
49cbc0 61     . ./DICT
f86690 62     if [ -n "$FILES" ]; then
d2c44c 63     for i in $(seq 1 "$(echo "$FILES" | wc -w)"); do
JG 64         loc=$(echo "$LOCATIONS" | cut -d' ' -f "$i")
f86690 65         rm "$loc" 2>/dev/null
d2c44c 66         loc=$(dirname "$loc")
JG 67         while [ -z "$(ls -A "$loc")" ]; do
f86690 68         rm -r "$loc"
d2c44c 69         loc=$(dirname "$loc")
f86690 70         done 2>/dev/null
JG 71     done
72     fi
73     if [ -n "$SUDO_FILES" ]; then
d2c44c 74     for i in $(seq 1 "$(echo "$SUDO_FILES" | wc -w)"); do
JG 75         loc=$(echo "$SUDO_LOCATIONS" | cut -d' ' -f "$i")
f86690 76         sudo rm "$loc" 2>/dev/null
JG 77         loc=$(echo "$loc" | rev | cut -d'/' -f2- | rev)
d2c44c 78         while [ -z "$(ls -A "$loc")" ]; do
f86690 79         sudo rm -r "$loc"
JG 80         loc=$(echo "$loc" | rev | cut -d'/' -f2- | rev)
81         done 2>/dev/null
82     done
83     fi
d2c44c 84     if type custom | grep -q "function"; then
JG 85         custom remove
f86690 86     fi
JG 87 }
88
89 handle_package() {
da991b 90     if [ -d "$1" ]; then
JG 91     unset DEPS
d2c44c 92     eval "$(grep "DEPS=" "$1/DICT")"
JG 93     if ! [ "$INSTALL" = "0" ] && [ "$REMOVE_DEPS" = "0" ]; then
6ad354 94         for i in $DEPS; do
JG 95             if ! grep -q "$i" "$PACKAGE_CACHE"; then
d2c44c 96                 (handle_package "$i")
6ad354 97             fi
JG 98         done
99     fi
535d0d 100     echo "$1"
49cbc0 101     echo "$1" >> "$PACKAGE_CACHE"
d2c44c 102     (cd "$1" || exit; "$([ "$INSTALL" = "1" ] && echo install || echo remove)_links")
f86690 103     else
JG 104     echo "No configuration found for $i"
105     fi
106 }
da991b 107
f86690 108 usage() {
c7a87b 109     cat << EOF
JG 110 USAGE
111     $(basename "$0") [options] configs... ([option] [configs])...
112
113 OPTIONS
114     -h, --help          Display this help message
115     -i, --install       Install packages following this flag (default)
116     -r, --remove        Remove packages following this flag
117     -f, --force         Force install all packages following this flag
118 EOF
f86690 119 }
JG 120
121 INSTALL=1
49cbc0 122 FORCE=0
6ad354 123 REMOVE_DEPS=0
d2c44c 124 PACKAGE_CACHE="$(mktemp)"
JG 125 DOTFILES_PATH="$(dirname "$0")"
49cbc0 126
d2c44c 127 cd "$DOTFILES_PATH" || exit
49cbc0 128
JG 129 if [ -z "$1" ]; then
130     usage
131     exit
132 fi
f86690 133
JG 134 while [ -n "$1" ]; do
135       case "$1" in
136       -h|--help|"") usage; exit;;
c7a87b 137       -i|--install) INSTALL=1; FORCE=0;;
49cbc0 138       -f|--force) FORCE=1;;
c7a87b 139       -if|-fi) INSTALL=1; FORCE=1;;
JG 140       -r|--remove) INSTALL=0; REMOVE_DEPS=0;;
141       -d|--deps) REMOVE_DEPS=1;;
142       -rd|-dr) INSTALL=0; REMOVE_DEPS=1;;
f86690 143       --) shift; break;;
JG 144       -*) echo "Invalid argument"; usage; exit;;
c7a87b 145       *) handle_package "$1";; # "$([ \"$INSTALL\" = \"1\" ] && echo install || echo remove)_links";;
f86690 146       esac
JG 147       shift
148 done
149
da991b 150 while [ -n "$1" ]; do
6ad354 151     handle_package "$1"
da991b 152 done
49cbc0 153
d2c44c 154 rm "$PACKAGE_CACHE"