]> glassweightruler.freedombox.rocks Git - xdg-ninja.git/blob - xdg-ninja.sh
Change [[ and ]] to [ and ]
[xdg-ninja.git] / xdg-ninja.sh
1 #!/usr/bin/env bash
2
3 USE_GLOW=true
4 if ! command -v glow &>/dev/null; then
5 echo "Glow not found, markdown rendering not available."
6 echo "Output will be raw markdown and might look weird."
7 echo "Install glow for easier reading & copy-paste."
8 USE_GLOW=false
9 fi
10
11 unalias -a
12
13 HELPSTRING="""\
14
15
16 \e[37;45;1mxdg-ninja\e[0m
17
18 \e[1;3mCheck your \$HOME for unwanted files.\e[1;0m
19
20 ────────────────────────────────────
21
22 \e[3m--help\e[0m \e[1mThis help menu\e[0m
23 \e[3m-h\e[0m
24
25 \e[3m--no-skip-ok\e[0m \e[1mDisplay messages for all files checked (verbose)\e[0m
26 \e[3m-v\e[0m
27
28 \e[3m--skip-ok\e[0m \e[1mDon't display anything for files that do not exist (default)\e[0m
29
30 """
31
32 SKIP_OK=true
33 for i in "$@"; do
34 if [ $i == "--help" ] || [ $i == "-h" ]; then
35 echo -e "$HELPSTRING"
36 exit
37 elif [ $i == "--skip-ok" ]; then
38 SKIP_OK=true
39 elif [ $i == "--no-skip-ok" ]; then
40 SKIP_OK=false
41 elif [ $i == "-v" ]; then
42 SKIP_OK=false
43 fi
44 done
45
46 if [ -z "${XDG_DATA_HOME}" ]; then
47 printf '\e[1;36m%s\e[1;0m\n' "The \$XDG_DATA_HOME environment variable is not set, make sure to add it to your shell's configuration before setting any of the other environment variables!"
48 printf '\e[1;36m ⤷ \e[1mThe recommended value is: \e[1;3m$HOME/.local/share\e[1;0m\n'
49 fi
50 if [ -z "${XDG_CONFIG_HOME}" ]; then
51 printf '\e[1;36m%s\e[1;0m\n' "The \$XDG_CONFIG_HOME environment variable is not set, make sure to add it to your shell's configuration before setting any of the other environment variables!"
52 printf '\e[1;36m ⤷ \e[1mThe recommended value is: \e[1;3m$HOME/.config\e[1;0m\n'
53 fi
54 if [ -z "${XDG_STATE_HOME}" ]; then
55 printf '\e[1;36m%s\e[1;0m\n' "The \$XDG_STATE_HOME environment variable is not set, make sure to add it to your shell's configuration before setting any of the other environment variables!"
56 printf '\e[1;36m ⤷ \e[1mThe recommended value is: \e[1;3m$HOME/.local/state\e[1;0m\n'
57 fi
58 if [ -z "${XDG_CACHE_HOME}" ]; then
59 printf '\e[1;36m%s\e[1;0m\n' "The \$XDG_CACHE_HOME environment variable is not set, make sure to add it to your shell's configuration before setting any of the other environment variables!"
60 printf '\e[1;36m ⤷ \e[1mThe recommended value is: \e[1;3m$HOME/.cache\e[1;0m\n'
61 fi
62 if [ -z "${XDG_RUNTIME_DIR}" ]; then
63 printf '\e[1;36m%s\e[1;0m\n' "The \$XDG_RUNTIME_DIR environment variable is not set, make sure to add it to your shell's configuration before setting any of the other environment variables!"
64 printf '\e[1;36m ⤷ \e[1mThe recommended value is: \e[1;3m/run/user/$UID\e[1;0m\n'
65 fi
66
67 if ! command -v jq &>/dev/null; then
68 echo "jq is needed to run this script, but it wasn't found. Please install it to be able to use this script."
69 exit
70 fi
71
72 # Function to expand environment variables in string
73 # https://stackoverflow.com/a/20316582/11110290
74 apply_shell_expansion() {
75 declare data="$1"
76 declare delimiter="__apply_shell_expansion_delimiter__"
77 declare command="cat <<$delimiter"$'\n'"$data"$'\n'"$delimiter"
78 eval "$command"
79 }
80
81 # Returns 0 if the path doesn't lead anywhere
82 # Return 1 if the path points to a file, 2 if it points to a directory
83 check_not_exists_file() {
84 FILE_PATH=$(apply_shell_expansion "$1")
85 if [ -f "$FILE_PATH" ]; then
86 return 1
87 elif [ -d "$FILE_PATH" ]; then
88 return 2
89 else
90 return 0
91 fi
92 }
93
94 # Function to handle the formatting of output
95 log() {
96 MODE="$1"
97 NAME="$2"
98 FILENAME="$3"
99 HELP="$4"
100
101 case "$MODE" in
102
103 ERR)
104 printf '[\e[1;31m%s\e[1;0m]: \e[1;3m%s\e[1;0m\n' "$NAME" "$FILENAME"
105 ;;
106
107 WARN)
108 printf '[\e[1;33m%s\e[1;0m]: \e[1;3m%s\e[1;0m\n' "$NAME" "$FILENAME"
109 ;;
110
111 INFO)
112 printf '[\e[1;36m%s\e[1;0m]: \e[1;3m%s\e[1;0m\n' "$NAME" "$FILENAME"
113 ;;
114
115 SUCS)
116 [ "$SKIP_OK" = false ] &&
117 printf '[\e[1;32m%s\e[1;0m]: \e[1;3m%s\e[1;0m\n' "$NAME" "$FILENAME"
118 ;;
119
120 HELP)
121 if $USE_GLOW; then
122 echo "$HELP" | glow -
123 else
124 echo "$HELP"
125 fi
126 ;;
127
128 esac
129 }
130
131 # Checks that the given file does not exist, otherwise outputs help
132 check_file() {
133 INPUT="$1"
134 NAME="$2"
135
136 FILENAME=$(echo -E "$INPUT" | jq -r .path)
137 MOVABLE=$(echo -E "$INPUT" | jq -r .movable)
138 HELP=$(echo -E "$INPUT" | jq -r .help)
139
140 check_not_exists_file "$FILENAME"
141
142 case $? in
143
144 0)
145 log SUCS "$NAME" "$FILENAME" "$HELP"
146 ;;
147
148 1 | 2)
149 if "$MOVABLE"; then
150 log ERR "$NAME" "$FILENAME" "$HELP"
151 else
152 log WARN "$NAME" "$FILENAME" "$HELP"
153 fi
154 if [ "$HELP" ]; then
155 log HELP "$NAME" "$FILENAME" "$HELP"
156 else
157 log HELP "$NAME" "$FILENAME" "_No help available._"
158 fi
159 ;;
160
161 esac
162 }
163
164 # Reads a file from programs/, calls check_file on each file specified for the program
165 check_program() {
166 INPUT=$1
167
168 NAME=$(echo "$INPUT" | jq -r .name)
169
170 while IFS= read -r file; do
171 check_file "$file" "$NAME"
172 done <<<"$(echo "$INPUT" | jq -rc '.files[]')"
173 }
174
175 # Loops over all files in the programs/ directory and calls check_program
176 enumerate_programs() {
177 echo -e "\e[1;3mStarting to check your \e[1;36m\$HOME.\e[1;0m"
178 echo -e ""
179 for prog_filename in "$(dirname "${BASH_SOURCE[0]}")"/programs/*; do
180 check_program "$(cat "$prog_filename")"
181 done
182 echo -e "\e[1;3mDone checking your \e[1;36m\$HOME.\e[1;0m"
183 echo -e ""
184 echo -e "\e[3mIf you have files in your \e[1;36m\$HOME\e[1;0m that shouldn't be there, but weren't recognised by xdg-ninja, please consider creating a configuration file for it and opening a pull request on github.\e[1;0m"
185 echo -e ""
186 }
187
188 enumerate_programs