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

Joel Grunbaum
2023-12-28 bdc57299b1eb177c8f06c40f52b5c78a9ca99e07
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/bin/sh
 
install_conflict() {
    file="$1";
    loc="$2";
    if [ -n "$3" ]; then
        SUPERUSER="sudo"
    else
        SUPERUSER="";
    fi
    while true; do
        CHOICE="overwrite"
        if [ -e "$loc" ] && [ "$FORCE" = "0" ] && [ $(diff "$loc" "$file") ]; then
            echo "WARNING: \"$loc\" exists, (overwrite, change, nothing): "
            read CHOICE
        fi
        case "$CHOICE" in
            o|overwrite)
                dir=$(dirname "$loc")
                $SUPERUSER mkdir -p "$dir"
                $SUPERUSER ln -sf "$(pwd)/$file" "$loc"; break;;
            c|change)
                tmpfile=$(mktemp)
                echo "$loc" >> "$tmpfile"
                $EDITOR "$tmpfile"
                loc=$(cat "$tmpfile")
                rm "$tmpfile"
                unset tmpfile;;
            n|nothing)
                break;;
            *)
                echo "INVALID CHOICE \"$CHOICE\", (overwrite, change, nothing)"
                read CHOICE
        esac
    done
 
}
 
install_links() {
    . ./DICT
    if [ -n "$FILES" ]; then
    for i in $(seq 1 "$(echo "$FILES" | wc -w)"); do
        file=$(echo "$FILES" | cut -d' ' -f "$i")
        loc=$(echo "$LOCATIONS" | cut -d' ' -f "$i")
        install_conflict "$file" "$loc"
    done
    fi
    if [ -n "$SUDO_FILES" ]; then
        for i in $(seq 1 "$(echo "$SUDO_FILES" | wc -w)"); do
            file=$(echo "$SUDO_FILES" | cut -d' ' -f "$i")
            loc=$(echo "$SUDO_LOCATIONS" | cut -d' ' -f "$i")
            install_conflict "$file" "$loc" 1
        done
    fi
    if type custom 2>/dev/null | grep -q "function" ; then
        custom install
    fi
}
 
remove_links() {
    . ./DICT
    if [ -n "$FILES" ]; then
    for i in $(seq 1 "$(echo "$FILES" | wc -w)"); do
        loc=$(echo "$LOCATIONS" | cut -d' ' -f "$i")
        rm "$loc" 2>/dev/null
        loc=$(dirname "$loc")
        while [ -z "$(ls -A "$loc")" ]; do
        rm -r "$loc"
        loc=$(dirname "$loc")
        done 2>/dev/null
    done
    fi
    if [ -n "$SUDO_FILES" ]; then
    for i in $(seq 1 "$(echo "$SUDO_FILES" | wc -w)"); do
        loc=$(echo "$SUDO_LOCATIONS" | cut -d' ' -f "$i")
        sudo rm "$loc" 2>/dev/null
        loc=$(echo "$loc" | rev | cut -d'/' -f2- | rev)
        while [ -z "$(ls -A "$loc")" ]; do
        sudo rm -r "$loc"
        loc=$(echo "$loc" | rev | cut -d'/' -f2- | rev)
        done 2>/dev/null
    done
    fi
    if type custom | grep -q "function"; then
        custom remove
    fi
}
 
handle_package() {
    if [ -d "$1" ]; then
    unset DEPS
    eval "$(grep "DEPS=" "$1/DICT")"
    if ! [ "$INSTALL" = "0" ] && [ "$REMOVE_DEPS" = "0" ]; then
        for i in $DEPS; do
            if ! grep -q "$i" "$PACKAGE_CACHE"; then
                (handle_package "$i")
            fi
        done
    fi
    echo "$1"
    echo "$1" >> "$PACKAGE_CACHE"
    (cd "$1" || exit; "$([ "$INSTALL" = "1" ] && echo install || echo remove)_links")
    else
    echo "No configuration found for $i"
    fi
}
 
usage() {
    cat << EOF
USAGE
    $(basename "$0") [options] configs... ([option] [configs])...
 
OPTIONS
    -h, --help          Display this help message
    -i, --install       Install packages following this flag (default)
    -r, --remove        Remove packages following this flag
    -f, --force         Force install all packages following this flag
EOF
}
 
INSTALL=1
FORCE=0
REMOVE_DEPS=0
PACKAGE_CACHE="$(mktemp)"
DOTFILES_PATH="$(dirname "$0")"
 
cd "$DOTFILES_PATH" || exit
 
if [ -z "$1" ]; then
    usage
    exit
fi
 
while [ -n "$1" ]; do
      case "$1" in
      -h|--help|"") usage; exit;;
      -i|--install) INSTALL=1; FORCE=0;;
      -f|--force) FORCE=1;;
      -if|-fi) INSTALL=1; FORCE=1;;
      -r|--remove) INSTALL=0; REMOVE_DEPS=0;;
      -d|--deps) REMOVE_DEPS=1;;
      -rd|-dr) INSTALL=0; REMOVE_DEPS=1;;
      --) shift; break;;
      -*) echo "Invalid argument"; usage; exit;;
      *) handle_package "$1";; # "$([ \"$INSTALL\" = \"1\" ] && echo install || echo remove)_links";;
      esac
      shift
done
 
while [ -n "$1" ]; do
    handle_package "$1"
done
 
rm "$PACKAGE_CACHE"