blob: af4aff3d6bc5eff69da446955b40ce7470453aa4 (
plain)
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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
|
:
# NAME:
# hooks.sh - provide hooks for customization
#
# SYNOPSIS:
# hooks_add_all HOOKS [--first] func [...]
# hooks_add_once HOOKS [--first] func [...]
# hooks_add_default_set {all,once}
# hooks_add HOOKS func [...]
# hooks_get [--lifo] HOOKS
# hooks_run [--lifo] HOOKS ["args"]
# hooks_run_all [--lifo] HOOKS ["args"]
# hooks_has HOOKS func
#
# add_hooks HOOKS [--first] func [...]
# run_hooks HOOKS [LIFO] ["args"]
# run_hooks_all HOOKS [LIFO] ["args"]
#
# DESCRIPTION:
# The functions add_hooks and run_hooks are retained for
# backwards compatibility. They are aliases for hooks_add and
# hooks_run.
#
# hooks_add_all simply adds the "func"s to the list "HOOKS".
#
# If the first arg is '--first' "func"s are added to the start
# of the list.
#
# hooks_add_once does the same but only if "func" is not in "HOOKS".
# hooks_add uses one of the above based on "option", '--all' (default)
# or '--once'.
#
# hooks_add_default_set sets the default behavior of hooks_add
#
# hooks_get simply returns the named list of functions.
#
# hooks_has indicates whether "func" in in "HOOKS".
#
# hooks_run runs each "func" in $HOOKS and stops if any of them
# return a bad status.
#
# hooks_run_all does the same but does not stop on error.
#
# If run_hooks or run_hooks_all is given a flag of '--lifo' or
# 2nd argument of LIFO the hooks are run in the reverse order of
# calls to hooks_add.
# Any "args" specified are passed to each hook function.
#
# RCSid:
# $Id: hooks.sh,v 1.26 2025/08/07 21:59:54 sjg Exp $
#
# @(#)Copyright (c) 2000-2024 Simon J. Gerraty
#
# SPDX-License-Identifier: BSD-2-Clause
#
# Please send copies of changes and bug-fixes to:
# sjg@crufty.net
#
# avoid multiple inclusion
_HOOKS_SH=:
# does local *actually* work?
local_works() {
local _fu
}
if local_works > /dev/null 2>&1; then
_local=local
else
_local=:
fi
# for backwards compatability
local=$_local
##
# hooks_add_all list func ...
#
# add "func"s to "list" regardless
#
hooks_add_all() {
eval $_local __h
__h=$1; shift
case "$1" in
--first)
shift
eval "$__h=\"$* \$$__h\""
;;
*) eval "$__h=\"\$$__h $*\"";;
esac
}
##
# hooks_add_once list func ...
#
# add "func"s to "list" if not already there
#
hooks_add_once() {
eval $_local __h __hh __first
__h=$1; shift
case "$1" in
--first) shift; __first=:;;
*) __first=;;
esac
eval "__hh=\$$__h"
while [ $# -gt 0 ]
do
: __hh="$__hh" 1="$1"
case "$__first $__hh " in
*" $1 "*) ;; # dupe
:*) __hh="$1 $__hh";;
*) __hh="$__hh $1";;
esac
shift
done
eval "$__h=\"$__hh\""
}
##
# hooks_add_default_set [--]{all,once}
#
# change the default method of hooks_add
#
hooks_add_default_set() {
case "$1" in
once|--once) HOOKS_ADD_DEFAULT=once;;
*) HOOKS_ADD_DEFAULT=all;;
esac
}
##
# hooks_add [--{all,once}] list func ...
#
# add "func"s to "list"
#
# If '--once' use hooks_add_once,
# default is hooks_add_all.
#
hooks_add() {
case "$1" in
--all) shift; hooks_add_all "$@";;
--once) shift; hooks_add_once "$@";;
*) hooks_add_${HOOKS_ADD_DEFAULT:-all} "$@";;
esac
}
##
# hooks_get [--lifo] list [LIFO]
#
# return $list
#
hooks_get() {
eval $_local __h __h2 e __l
case "$1" in
--lifo) __l=LIFO; shift;;
esac
eval "__h=\$$1"
case "$__l$2" in
LIFO*)
__h2="$__h"
__h=
for e in $__h2
do
__h="$e $__h"
done
;;
esac
echo "$__h"
}
##
# hooks_has list func
#
# is func in $list ?
#
hooks_has() {
eval $_local __h
eval "__h=\$$1"
case " $__h " in
*" $1 "*) return 0;;
esac
return 1
}
##
# hooks_run [--all] [--lifo] list [LIFO] [args]
#
# pass "args" to each function in "list"
# Without '--all'; if any return non-zero return that immediately
#
hooks_run() {
eval $_local __a e __h __hl __h2 __l
__a=return
__l=
while :
do
case "$1" in
--all) __a=:; shift;;
--lifo) __l=$1; shift;;
*) break;;
esac
done
__hl=$1; shift
case "$1" in
LIFO) __l=--lifo; shift;;
esac
__h=`hooks_get $__l $__hl`
for e in $__h
do
$e "$@" || $__a $?
done
}
##
# hooks_run_all [--lifo] list [LIFO] [args]
#
# pass "args" to each function in "list"
#
hooks_run_all() {
hooks_run --all "$@"
}
##
# add_hooks,run_hooks[_all] aliases
#
add_hooks() {
hooks_add "$@"
}
run_hooks() {
hooks_run "$@"
}
run_hooks_all() {
hooks_run --all "$@"
}
case /$0 in
*/hooks.sh)
# simple unit-test
list=HOOKS
flags=
while :
do
: 1=$1
case "$1" in
HOOKS|*hooks) list=$1; shift;;
--*) flags="$flags $1"; shift;;
*) break;;
esac
done
for f in "$@"
do
: f=$f
case "$f" in
LIFO) ;;
false|true) ;;
*) eval "$f() { echo This is $f; }";;
esac
done
echo hooks_add $flags $list "$@"
hooks_add $flags $list "$@"
echo hooks_run $list
hooks_run $list
echo hooks_run --all --lifo $list
hooks_run --all --lifo $list
echo hooks_run $list LIFO
hooks_run $list LIFO
;;
esac
|