Repository navigation
Expand file tree
/
Copy pathmks.sh
More file actions
217 lines (196 loc) · 5.51 KB
/
Copy pathmks.sh
File metadata and controls
217 lines (196 loc) · 5.51 KB
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
#!/usr/bin/env bash
set -euo pipefail
#---Colors--------------
#-Reset
NC="\033[0m"
#-Basics
BLACK="\033[0;30m"
RED="\033[0;31m"
GREEN="\033[0;32m"
YELLOW="\033[0;33m"
BLUE="\033[0;34m"
MAGENTA="\033[0;35m"
CYAN="\033[0;36m"
WHITE="\033[0;37m"
#-----------------------
#---log commons--------
GOOD="${GREEN}[✓]${NC}"
WARNING="${YELLOW}[!]${NC}"
ERROR="${RED}[X]${NC}"
INFO="${BLUE}[*]${NC}"
#-----------------------
#---text decorations----
MARKER="◇"
MARKER2="○"
SUBTITLE="${YELLOW}${MARKER2}"
#-----------------------
#---system variables----
# working
NAME=""
ALT_PATH=""
OVERWRITE=false
TEMPLATE=""
TEMPLATE_FOUND=false
# static
STARTPATH="$(pwd)"
EDIT="${EDITOR:-nano}"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
#-----------------------
#---version------------
VERSION="1.0"
#----------------------
#---functions----------
show_help() {
printf "${YELLOW}███╗ ███╗██╗ ██╗███████╗ ██████╗██████╗ ██╗██████╗ ████████╗\n"
printf "${YELLOW}████╗ ████║██║ ██╔╝██╔════╝██╔════╝██╔══██╗██║██╔══██╗╚══██╔══╝\n"
printf "${YELLOW}██╔████╔██║█████╔╝ ███████╗██║ ██████╔╝██║██████╔╝ ██║\n"
printf "${YELLOW}██║╚██╔╝██║██╔═██╗ ╚════██║██║ ██╔══██╗██║██╔═══╝ ██║\n"
printf "${YELLOW}██║ ╚═╝ ██║██║ ██╗███████║╚██████╗██║ ██║██║██║ ██║\n"
printf "${YELLOW}╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝╚═╝ ╚═╝${NC}\n"
printf "${MARKER} mkscript v${VERSION}\n"
printf "\n${SUBTITLE} Features:${NC}\n"
printf "${MARKER} Auto-detects file extension\n"
printf "${MARKER} Grants execution permissions\n"
printf "${MARKER} Prevents overwriting existing files\n"
printf "${MARKER} Custom output paths\n"
printf "${MARKER} Custom template support\n"
printf "${MARKER} 2 pretyped templates: minimal, tool\n"
printf "${MARKER} Opens script in default editor\n"
printf "\n${SUBTITLE} Options:${NC}\n"
printf " -o, --overwrite Force overwrite of existing files\n"
printf " -t, --template <name> Select template: empty, minimal, or tool\n"
printf " -p, --path <dir> Set output directory\n"
printf "\n${SUBTITLE} Display options:${NC}\n"
printf " -l, --list Show templates\n"
printf " -h, --help Show this help page\n"
printf "\n${SUBTITLE} Usage:${NC}\n"
printf "bash mks.sh <name> <options>\n"
printf "bash mks.sh <display option>\n"
printf "\n${SUBTITLE} Log examples:${NC}\n"
printf "${GOOD} good\n"
printf "${WARNING} warning\n"
printf "${ERROR} error\n"
printf "${INFO} information\n"
echo ""
}
generate() {
if [[ -z "$TEMPLATE" ]]; then
echo '#!/usr/bin/env bash
set -euo pipefail' > "$NAME"
else
cp "$SCRIPT_DIR/templates/$TEMPLATE" "$PWD/$NAME"
fi
chmod +x "$NAME"
printf "${GOOD} $NAME generated as $TEMPLATE\n"
"$EDIT" "$NAME"
exit 0
}
setup() {
#check path
if [[ -z "$ALT_PATH" ]]; then
printf "${INFO} Using current directory\n"
else
cd "$ALT_PATH"
printf "${INFO} Target directory: '$ALT_PATH'\n"
fi
#check file existence
if [[ -e "$NAME" ]]; then
printf "${WARNING} Script '$NAME' already exists\n"
if [[ "$OVERWRITE" == "true" ]]; then
printf "${WARNING} Overwriting existing script: '$NAME'\n"
generate
else
printf "${ERROR} Script exists and overwrite is disabled\n"
exit 1
fi
else
generate
fi
}
#---checking arguments--
if [[ -z "${1:-}" ]]; then
printf "${ERROR} Not script name provided\n"
exit 1
fi
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
printf "${GOOD} Displaying help page\n"
show_help
exit 0
fi
if [[ "$1" == "-l" || "$1" == "--list" ]]; then
printf "${GOOD} Displaying templates\n"
cd "$SCRIPT_DIR"/templates
ls
exit 0
fi
if [[ "$1" == -* ]]; then
printf "${ERROR} Invalid name: cannot start with '-'\n"
exit 1
fi
if [[ ! "$1" =~ ^[a-zA-Z0-9._-]+$ ]]; then
printf "${ERROR} Invalid name: use only letters, numbers, ., _ or -\n"
exit 1
fi
#---establishing name---
if [[ "$1" == *.sh ]]; then
NAME="${1}"
shift
printf "${INFO} Name: '$NAME'\n"
else
NAME="${1}.sh"
shift
printf "${WARNING} No extension detected\n"
printf "${INFO} Name: '$NAME'\n"
fi
#---workflow-----------
while [[ "$#" -gt 0 ]]; do
case "$1" in
"-o"|"--overwrite")
OVERWRITE=true
shift
printf "${INFO} Overwrite enabled\n"
;;
"-p"|"--path")
if [[ -z "${2:-}" ]]; then
printf "${ERROR} Path argument missing\n"
exit 1
elif [[ -d "$2" ]]; then
ALT_PATH="$2"
shift 2
printf "${INFO} Target directory: '$ALT_PATH'\n"
else
printf "${ERROR} Invalid path: '$2'\n"
exit 1
fi
;;
"-t"|"--template")
if [[ -z "$2" ]]; then
printf "${ERROR} Template name missing\n"
exit 1
else
for f in "$SCRIPT_DIR"/templates/*; do
if [[ -f "$f" ]]; then
TEMPLATE_NAME=$(basename "$f")
if [[ "$2" == "$TEMPLATE_NAME" ]]; then
TEMPLATE="$TEMPLATE_NAME"
printf "${INFO} Template selected: '$TEMPLATE'\n"
shift 2
TEMPLATE_FOUND=true
break
fi
fi
done
if ! $TEMPLATE_FOUND ; then
printf "${ERROR} Template not found: '$2'\n"
exit 1
fi
fi
;;
*)
printf "${ERROR} Invalid argument: '$1'\n"
exit 1
;;
esac
done
setup
exit 0