@@ -71,20 +71,41 @@ function provision() {
71
71
by_action=$( $jq --slurp ' .[] | group_by(.action) | map({key: .[0].action, value: .}) | from_entries' <<< " ${EVAL}" )
72
72
73
73
for action in $( $jq --raw-output ' .|keys[]' <<< " $by_action" ) ; do
74
- actions=$( $jq " .${action} " <<< " ${by_action}" )
75
- proviso=$( $jq --raw-output " .${action} [0].proviso|strings" <<< " ${by_action}" )
76
- if [[ -n $proviso ]]; then
77
- echo " ::debug::Running ${proviso##*/ } "
78
- # this trick doesn't require proviso to be executable, as created by builtins.toFile
79
- function _proviso() { . " $proviso " ; }
80
- provisioned=" $( _proviso " $actions " ) "
81
- unset -f _proviso
82
- echo " ::debug::Provisioned after proviso check: $provisioned "
83
- else
84
- echo " ::debug::No proviso on action, passing all actions through."
85
- provisioned=" $actions "
74
+ readarray -t actions < <( $jq --raw-output " .${action} [] | @base64" <<< " ${by_action}" )
75
+ echo " Check proviso for all ${# actions[@]} '$action ' action(s) ..."
76
+ # this trick doesn't require proviso to be executable, as created by builtins.toFile
77
+ function _proviso() {
78
+ _jq () { echo " ${2} " | command base64 --decode | command jq --compact-output --raw-output " ${1} " ; }
79
+ local action=" $1 "
80
+ >&2 echo -n " ... checking $( _jq ' "//\(.cell)/\(.block)/\(.name):\(.action)"' $action ) "
81
+ local proviso=$( _jq ' .proviso|strings' $action )
82
+ if [[ -n $proviso ]]; then
83
+ cmd=(bash -o errexit -o nounset -o pipefail " $proviso " " $( _jq ' .' $action ) " )
84
+ if ${cmd[@]} ; then
85
+ >&2 echo " - take it."
86
+ echo " $action "
87
+ else
88
+ >&2 echo " - drop it."
89
+ fi
90
+ else
91
+ >&2 echo " - take it (no proviso)."
92
+ echo " $action "
93
+ fi
94
+ }
95
+ export -f _proviso
96
+ readarray -t args < <(
97
+ parallel -j0 _proviso ::: " ${actions[@]} "
98
+ # for a in ${actions[@]}; do _proviso "$a"; done
99
+ )
100
+ echo " Continue with ${# args[@]} '$action ' action(s)."
101
+ if [[ ${# args[@]} -ne 0 ]]; then
102
+ PROVISIONED=" $(
103
+ $jq ' . + ($ARGS.positional | map(@base64d|fromjson))' \
104
+ --args " ${args[@]} " \
105
+ <<< " $PROVISIONED"
106
+ ) "
86
107
fi
87
- PROVISIONED= " $( $jq ' . + $new ' --argjson new " $provisioned " <<< " $PROVISIONED " ) "
108
+ unset -f _proviso
88
109
done
89
110
}
90
111
@@ -112,6 +133,10 @@ function output() {
112
133
| from_entries' <<< " $PROVISIONED"
113
134
) "
114
135
136
+ base64 <<< " $json" | tr -d ' \n'
137
+ echo
138
+ echo " (base64)"
139
+
115
140
delim=$RANDOM
116
141
117
142
printf " %s\n" \
@@ -122,22 +147,23 @@ function output() {
122
147
>> " $GITHUB_OUTPUT "
123
148
}
124
149
125
- echo " ::group::🔎 Start Discovery ..."
150
+ echo " ::group::📓 Evaluate ..."
126
151
eval_fn
127
- provision
128
152
echo " ::endgroup::"
129
153
130
154
echo " ::group::✨ Find potential targets ..."
131
155
echo " ${EVAL} " | jq -r ' .[] | "//\(.cell)/\(.block)/\(.name):\(.action)"'
132
156
echo " ::endgroup::"
133
157
134
- echo " ::group::🌲️ Recycle previous work ..."
135
- echo " ... and only procede with these:"
158
+ echo " ::group::🔎 Check for proviso ..."
159
+ provision
160
+ echo " ::endgroup::"
161
+
162
+ echo " ::group::🌲️ Save work and only proceed with ..."
136
163
echo " ${PROVISIONED} " | jq -r ' .[] | "//\(.cell)/\(.block)/\(.name):\(.action)"'
137
164
echo " ::endgroup::"
138
165
139
166
echo " ::group::📞️ Inform the build matrix ..."
140
- echo " ... to tap the wire, enable debug logs :-)"
141
167
output
142
168
echo " ::endgroup::"
143
169
0 commit comments