1
1
#! /usr/bin/env bash
2
2
# This script support Bash: 4.0+
3
3
4
- set -o errexit
5
- set -o nounset
6
- set -o pipefail
7
- set -o errtrace
4
+ set -o errexit -o nounset -o pipefail -o errtrace
8
5
(shopt -p inherit_errexit & > /dev/null) && shopt -s inherit_errexit
9
6
10
- readlinkf () { # Modified from https://github.com/ko1nksm/readlinkf
11
- [ " ${1:- } " ] || return 1
12
-
13
- CDPATH=' ' # to avoid changing to an unexpected directory
14
- local max_symlinks=40
15
- local link
16
- local target=$1
17
-
18
- [ -e " ${target%/ } " ] || target=${1% " ${1##* [!/]} " } # trim trailing slashes
19
- [ -d " ${target:-/ } " ] && target=" $target /"
20
-
21
- cd -P . 2> /dev/null || return 1
22
- while [ " $max_symlinks " -ge 0 ] && max_symlinks=$(( max_symlinks - 1 )) ; do
23
- if [ ! " $target " = " ${target%/* } " ]; then
24
- case $target in
25
- /* ) cd -P " ${target%/* } /" 2> /dev/null || break ;;
26
- * ) cd -P " ./${target%/* } " 2> /dev/null || break ;;
27
- esac
28
- target=${target##*/ }
29
- fi
30
-
31
- if [ ! -L " $target " ]; then
32
- target=" ${PWD%/ }${target: +/ }${target} "
33
- printf ' %s\n' " ${target:-/ } "
34
- return 0
35
- fi
36
-
37
- link=$( ls -dl -- " $target " 2> /dev/null) || break
38
- target=${link#* " $target -> " }
39
- done
40
- return 1
41
- }
42
-
43
- SCRIPT_PATH=" $( readlinkf " $0 " ) "
7
+ SCRIPT_PATH=" $( realpath " $0 " ) "
44
8
SCRIPT_DIR=$( dirname " $SCRIPT_PATH " )
45
9
readonly SCRIPT_PATH SCRIPT_DIR
46
10
@@ -49,9 +13,9 @@ source "$SCRIPT_DIR/tools/colors.bash"
49
13
# shellcheck source=./src/load_internals.bash
50
14
source " $SCRIPT_DIR /src/load_internals.bash"
51
15
_lobash.import_internals basic_meta_types module_meta rm erase_line
52
- _lobash.imports ask choose parse_params array_include union_array is_tty_available is_gnu_sed relative
16
+ _lobash.imports ask choose parse_args array_include union_array is_tty_available is_gnu_sed relative
53
17
54
- SUPPORTED_BASH_VERISONS=( 4.0 4.1 4.2 4.3 4.4 )
18
+ SUPPORTED_BASH_VERISONS=(4.0 4.1 4.2 4.3 4.4)
55
19
56
20
if l.is_gnu_sed; then
57
21
sedi () { sed -i " $@ " ; }
@@ -125,7 +89,7 @@ init_module() {
125
89
deps=$( _lobash.get_module_metadata " $module_name " " Dependent" )
126
90
if [[ -n " $deps " ]]; then
127
91
# shellcheck disable=2206
128
- deps=( ${deps// ,/ } )
92
+ deps=(${deps// ,/ } )
129
93
for dep in " ${deps[@]} " ; do
130
94
init_module " $dep "
131
95
done
@@ -148,15 +112,15 @@ init_with_config_file() {
148
112
echo -e " ${GREY} To import category ${category_name}${RESET_ALL} "
149
113
while read -r module_name; do
150
114
init_module " $module_name "
151
- done < " $SCRIPT_DIR /src/internals/categories/${category_name,,} "
115
+ done < " $SCRIPT_DIR /src/internals/categories/${category_name,,} "
152
116
done
153
117
154
118
while read -r module_name; do
155
119
init_module " $module_name "
156
120
done < <( grep -E ' ^ - \[x\]' " $CONFIG_PATH " | sed -E ' s/^ - \[x\] +(.+)/\1/' )
157
121
158
122
# shellcheck disable=2207
159
- module_names=( $( l.union_array module_names) )
123
+ module_names=($( l.union_array module_names) )
160
124
}
161
125
162
126
# Supported functions: VERBOSE_1, VERBOSE_2, VERBOSE_3, VERBOSE_4
@@ -175,13 +139,13 @@ init_verbose() {
175
139
fi
176
140
177
141
local i=1
178
- while (( i <= 4 )) ; do
179
- if (( i <= VERBOSE )) ; then
142
+ while (( i <= 4 )) ; do
143
+ if (( i <= VERBOSE)) ; then
180
144
eval " VERBOSE_$i () { printf '%b[v=$i ][%s:%s] %s%b\n' \"\$ GREY\" \"\$ {BASH_LINENO}\" \"\$ {FUNCNAME[1]}\" \"\$ 1\" \"\$ RESET_ALL\" ; }"
181
145
else
182
146
eval " VERBOSE_$i () { true; }"
183
147
fi
184
- i=$(( i + 1 ))
148
+ i=$(( i + 1 ))
185
149
done
186
150
}
187
151
@@ -191,7 +155,7 @@ Usage: $0 [OPTIONS] [<output>]
191
155
192
156
Options:
193
157
-h, --help Show usage.
194
- -c, --config Config file for building. If set, option "-p" will not work.
158
+ -c, --config <filepath> Config file for building. If set, option "-p" will not work.
195
159
-p <prefix> Prefix of variable names. [Default: l.]
196
160
-y, --yes Overwrite output.
197
161
-v <level> Show verbose. 0 means off. [Value: 0~4] [Default: 0]
@@ -204,17 +168,17 @@ EOF
204
168
205
169
# Reuse the last UNIQ_KEY if found
206
170
set_uniq_key () {
207
- UNIQ_KEY=$( grep -E ' ^# UNIQ_KEY: ' " $TARGET " 2> /dev/null | sed -E ' s/^# UNIQ_KEY: (.+)/\1/' || true)
171
+ UNIQ_KEY=$( grep -E ' ^# UNIQ_KEY: ' " $TARGET " 2> /dev/null | sed -E ' s/^# UNIQ_KEY: (.+)/\1/' || true)
208
172
209
173
if [[ -n $UNIQ_KEY ]]; then return 0; fi
210
174
211
175
# Lobash built by Lobash 0.4 has not "# UNIQ_KEY" label. So try to get it from "readonly _LOBASH_[_0-9]+_PREFIX="
212
- UNIQ_KEY=$( grep -E ' ^readonly _LOBASH_[_0-9]+_PREFIX=' " $TARGET " 2> /dev/null | sed -E ' s/^readonly _LOBASH_([-_0-9]+)_PREFIX=.+/\1/' || true )
176
+ UNIQ_KEY=$( grep -E ' ^readonly _LOBASH_[_0-9]+_PREFIX=' " $TARGET " 2> /dev/null | sed -E ' s/^readonly _LOBASH_([-_0-9]+)_PREFIX=.+/\1/' || true)
213
177
214
178
if [[ -n $UNIQ_KEY ]]; then return 0; fi
215
179
216
180
# If not found UNIQ_KEY, generate one based on current lobash version and time.
217
- UNIQ_KEY=${VERSION// [^[:alnum:]]/ _} _$(( $(date '+% s') - LOBASH_POUCH_TIME )) _$RANDOM
181
+ UNIQ_KEY=${VERSION// [^[:alnum:]]/ _} _$(( $(date '+% s') - LOBASH_POUCH_TIME)) _$RANDOM
218
182
}
219
183
220
184
init () {
@@ -225,7 +189,7 @@ init() {
225
189
226
190
init_verbose
227
191
228
- if (( ${# args[@]} == 0 )) ; then
192
+ if (( ${# args[@]} == 0 )) ; then
229
193
TARGET=$PWD /lobash.bash
230
194
else
231
195
if [[ -d ${args[0]} ]]; then
@@ -300,12 +264,11 @@ clean() {
300
264
answer=$( l.ask " Existed file: ${TARGET} . Overwrite it?" N)
301
265
echo -e " ${GREY} $answer ${RESET_ALL} "
302
266
case $answer in
303
- YES )
304
- ;;
305
- * )
306
- echo " Not overwrite it. No new Lobash file generated."
307
- exit 0
308
- ;;
267
+ YES) ;;
268
+ * )
269
+ echo " Not overwrite it. No new Lobash file generated."
270
+ exit 0
271
+ ;;
309
272
esac
310
273
fi
311
274
@@ -316,7 +279,7 @@ clean() {
316
279
}
317
280
318
281
write () {
319
- printf -- ' %s\n' " $* " >> " $TARGET "
282
+ printf -- ' %s\n' " $* " >> " $TARGET "
320
283
}
321
284
322
285
fwrite () {
@@ -328,18 +291,16 @@ fwrite() {
328
291
VERBOSE_3 " sed -E \" s/${WORD_BOUNDARY}${_LOBASH_PUBLIC_CONST_PREFIX} ([_a-zA-Z0-9]+)/${PUBLIC_CONST_PREFIX} \\ 1/g\" "
329
292
330
293
if [[ $PREFIX == ' l.' ]]; then
331
- < " $1 " \
332
- sed -E " /^# /d;s/${WORD_BOUNDARY} ($prefixes )([_a-zA-Z0-9]+)/\\ 1${UNIQ_KEY} _\\ 2/g" \
333
- | sed -E " s/${WORD_BOUNDARY}${_LOBASH_PUBLIC_CONST_PREFIX} ([_a-zA-Z0-9]+)/${PUBLIC_CONST_PREFIX} \\ 1/g" \
334
- >> " $TARGET "
294
+ < " $1 " sed -E " /^# /d;s/${WORD_BOUNDARY} ($prefixes )([_a-zA-Z0-9]+)/\\ 1${UNIQ_KEY} _\\ 2/g" |
295
+ sed -E " s/${WORD_BOUNDARY}${_LOBASH_PUBLIC_CONST_PREFIX} ([_a-zA-Z0-9]+)/${PUBLIC_CONST_PREFIX} \\ 1/g" \
296
+ >> " $TARGET "
335
297
else
336
298
VERBOSE_3 " sed -E \" s/${WORD_BOUNDARY}${_LOBASH_PUBLIC_FUNC_PREFIX// \. / \\ .} ([_a-zA-Z0-9]+)/${PREFIX} \\ 1/g\" "
337
299
338
- < " $1 " \
339
- sed -E " /^# /d;s/${WORD_BOUNDARY} ($prefixes )([_a-zA-Z0-9]+)/\\ 1${UNIQ_KEY} _\\ 2/g" \
340
- | sed -E " s/${WORD_BOUNDARY}${_LOBASH_PUBLIC_CONST_PREFIX} ([_a-zA-Z0-9]+)/${PUBLIC_CONST_PREFIX} \\ 1/g" \
341
- | sed -E " s/${WORD_BOUNDARY}${_LOBASH_PUBLIC_FUNC_PREFIX// \. / \\ .} ([_a-zA-Z0-9]+)/${PREFIX} \\ 1/g" \
342
- >> " $TARGET "
300
+ < " $1 " sed -E " /^# /d;s/${WORD_BOUNDARY} ($prefixes )([_a-zA-Z0-9]+)/\\ 1${UNIQ_KEY} _\\ 2/g" |
301
+ sed -E " s/${WORD_BOUNDARY}${_LOBASH_PUBLIC_CONST_PREFIX} ([_a-zA-Z0-9]+)/${PUBLIC_CONST_PREFIX} \\ 1/g" |
302
+ sed -E " s/${WORD_BOUNDARY}${_LOBASH_PUBLIC_FUNC_PREFIX// \. / \\ .} ([_a-zA-Z0-9]+)/${PREFIX} \\ 1/g" \
303
+ >> " $TARGET "
343
304
fi
344
305
}
345
306
@@ -415,7 +376,7 @@ generate() {
415
376
_lobash.scan_module_metadata " $module_name "
416
377
bashver=$( _lobash.get_module_metadata " $module_name " " Bash" )
417
378
compare=$( _lobash.semver_compare " $BASH_MIN_VERSION " " $bashver " )
418
- if (( compare < 0 )) ; then
379
+ if (( compare < 0 )) ; then
419
380
skips[$module_name ]=true
420
381
fi
421
382
done
@@ -442,16 +403,22 @@ generate() {
442
403
443
404
set +u
444
405
local skip_count=${# skips[@]}
445
- echo " Imported $(( ${# module_names[@]} - skip_count )) modules. Skipped ${skip_count} modules."
406
+ echo " Imported $(( ${# module_names[@]} - skip_count)) modules. Skipped ${skip_count} modules."
446
407
set -u
447
408
echo -e " Generated Lobash file: ${GREEN} $TARGET ${RESET_ALL} "
448
409
}
449
410
450
411
declare -A opts=()
451
412
declare -a args=()
413
+ declare -A opts_def=(
414
+ [opts]=opts
415
+ [args]=args
416
+ [-y --yes]=' boolean'
417
+ [-h --help]=' boolean'
418
+ )
452
419
453
420
main () {
454
- l.parse_params opts args " $@ "
421
+ l.parse_args opts_def " $@ "
455
422
init
456
423
clean
457
424
generate " $@ "
0 commit comments