-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtask-runner.sh
More file actions
223 lines (187 loc) · 6.17 KB
/
task-runner.sh
File metadata and controls
223 lines (187 loc) · 6.17 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
218
219
220
221
222
223
#!/bin/bash
task(){
# ALL OF THE FOLLOWING VARIABLES ARE AVAILABLE TO TASK SUBSHELLS
local RUNNING_DIR
local GLOBAL_TASK_FILE
local TASK_DIR
local TASK_FILE
local DRIVER_DIR
local TASK_FILE_DRIVER
local TASK_DRIVER
local LOCATION_FILE
local TASK_FILE_NAME
local TASK_FILE_FOUND
local TASK_COMMAND
local TASK_SUBCOMMAND
local STATE_FILE
local MODULE_STATE_FILE
local GLOBAL_VERBOSE
local GLOBAL_SILENT
local GLOBAL_TASKS_REG
local LOCAL_TASKS_REG
local TASK_DRIVER_DICT
local TASK_FILE_NAME_DICT
local DEFAULT_EDITOR
local DEFAULT_TASK_DRIVER
local TASK_REPOS
local BTM_VERSION
local BTM_ASSET_URL
# Check for special global arguments (+v verbose, +s silent)
unset GLOBAL_VERBOSE
unset GLOBAL_SILENT
while [[ "$1" == "+v" || "$1" == "+verbose" || "$1" == "+s" || "$1" == "+silent" ]]
do
if [[ "$1" == "+v" || "$1" == "+verbose" ]]; then GLOBAL_VERBOSE=1; unset GLOBAL_SILENT; fi
if [[ "$1" == "+s" || "$1" == "+silent" ]]; then GLOBAL_SILENT=1; unset GLOBAL_VERBOSE; fi
shift
done
if [[ -n "$GLOBAL_VERBOSE" ]]; then echo "GLOBAL VERBOSE SET"; fi
# Only load config, version and task drivers in the first run
if [[ -z "$RUN_NUMBER" ]]
then
# Load config
source "$TASK_MASTER_HOME/config.env"
# Load version
source "$TASK_MASTER_HOME/version.env"
# Load task drivers
source "$TASK_MASTER_HOME/lib/drivers/driver_defs.sh"
fi
# Save directory that you are running it from
RUNNING_DIR=$(pwd)
LOCATION_FILE=$TASK_MASTER_HOME/state/locations.vars
GLOBAL_TASK_FILE=$TASK_MASTER_HOME/lib/global-tasks.sh
TASK_DIR=$RUNNING_DIR
TASK_FILE=""
DRIVER_DIR=$TASK_MASTER_HOME/lib/drivers
TASK_DRIVER=bash
TASK_FILE_DRIVER=$DEFAULT_TASK_DRIVER
TASK_FILE_NAME=""
TASK_FILE_FOUND=""
# Find tasks file
while [[ ! "$TASK_DIR" -ef "$HOME" ]] && [[ -z "$TASK_FILE_FOUND" ]] && [[ ! "$TASK_DIR" -ef "/" ]]
do
TASK_DIR=$(pwd)
cd ..
_tmverbose_echo "Searching $TASK_DIR..."
# shellcheck disable=SC2153
for TASK_FILE_NAME in "${!TASK_FILE_NAME_DICT[@]}"
do
if [[ -f "$TASK_DIR/$TASK_FILE_NAME" ]]
then
TASK_FILE=$TASK_DIR/$TASK_FILE_NAME
TASK_FILE_DRIVER=${TASK_FILE_NAME_DICT[$TASK_FILE_NAME]}
TASK_FILE_FOUND="T"
break
fi
done
done
_tmverbose_echo "Tasks file: $TASK_FILE in $TASK_DIR"
cd "$RUNNING_DIR" || return 1
TASK_COMMAND=${1//-/_}
TASK_SUBCOMMAND=""
# Infer task UUID
if [[ -n "$TASK_FILE_FOUND" ]]
then
STATE_FILE=$( grep "$TASK_DIR" "$LOCATION_FILE" | head -n 1 | sed "s/^UUID_\($TASK_DIR\)=.*$/\\1/" 2&> /dev/null )
if [[ -z "$STATE_FILE" ]]
then
STATE_FILE=$(basename "$(readlink -f "$TASK_DIR")")
_tmverbose_echo "Warning: $TASK_DIR is not bookmarked. Saving State in $STATE_FILE"
fi
else
STATE_FILE=global
fi
STATE_FILE="$TASK_MASTER_HOME/state/$STATE_FILE.vars"
MODULE_STATE_FILE="$TASK_MASTER_HOME/state/$TASK_COMMAND.vars"
_tmverbose_echo "State file: $STATE_FILE"
#Run requested task in subshell
(
[[ -n "$GLOBAL_SILENT" ]] && exec 2>/dev/null
_tmverbose_echo "Task master has called itself ${RUN_NUMBER:-0} times"
if [[ -z "$RUN_NUMBER" ]]
then
RUN_NUMBER=1
else
RUN_NUMBER=2
fi
# load global tasks file only in originating shell
if [[ "$RUN_NUMBER" == "1" ]]
then
_tmverbose_echo "Loading internal functions"
source "$TASK_MASTER_HOME"/lib/state-functions.sh
source "$GLOBAL_TASK_FILE"
GLOBAL_TASKS_REG=$(declare -F | grep -e 'declare -fr task_' | sed 's/declare -fr task_//' | tr '\n' '|')
GLOBAL_TASKS_REG=${GLOBAL_TASKS_REG%?}
fi
load_state
task_in() {
[[ -n "$1" ]] && [[ "$TASK_COMMAND" =~ $1 ]]
}
# Check if task is already loaded
if task_in "$GLOBAL_TASKS_REG"
then
TASK_DRIVER=bash
else
TASK_DRIVER=$TASK_FILE_DRIVER
fi
_tmverbose_echo "Loading $TASK_DRIVER as task driver"
# This should set commands for DRIVER_EXECUTE_TASK DRIVER_HELP_TASK and DRIVER_LIST_TASK
source "$DRIVER_DIR/${TASK_DRIVER_DICT[$TASK_DRIVER]}"
if [[ -z "$DRIVER_EXECUTE_TASK" ]] || [[ -z "$DRIVER_LIST_TASKS" ]] || [[ -z "$DRIVER_HELP_TASK" ]] || [[ -z "$DRIVER_VALIDATE_TASK_FILE" ]]
then
echo Driver implementation error. >&2
echo "$TASK_DRIVER is missing required definitions" >&2
return 1
fi
LOCAL_TASKS_REG=$( $DRIVER_LIST_TASKS "$TASK_FILE" | tr ' \n' '|' )
LOCAL_TASKS_REG=${LOCAL_TASKS_REG%?}
if task_in "$GLOBAL_TASKS_REG" || task_in "$LOCAL_TASKS_REG"
then
$DRIVER_EXECUTE_TASK "$@"
else
echo "Invalid task: $TASK_COMMAND" >&2
task_list >&2
return 1
fi
)
local subshell_ret=$?
#This needs to be here because it interacts with the outside
if [[ -f "$STATE_FILE" ]] && grep -q -e TASK_RETURN_DIR -e TASK_TERM_TRAP -e DESTROY_STATE_FILE "$STATE_FILE"
then
awk -F = -f "$TASK_MASTER_HOME"/awk/special_state_vars.awk "$STATE_FILE" >> "$STATE_FILE.export"
awk '/^TASK_RETURN_DIR|^TASK_TERM_TRAP|^DESTROY_STATE_FILE/ { next } { print }' "$STATE_FILE" > "$STATE_FILE.tmp"
mv "$STATE_FILE"{.tmp,}
_tmverbose_echo "Added export commands for TASK_RETURN_DIR, TASK_TERM_TRAP or DESTROY_STAE_FILE"
fi
if [[ -f $STATE_FILE.export ]]
then
source "$STATE_FILE.export"
rm "$STATE_FILE.export"
_tmverbose_echo "Found $STATE_FILE.export as a state file export, loaded and removed it"
fi
return $subshell_ret
}
_tmverbose_echo(){
if [[ -n "$GLOBAL_VERBOSE" ]]
then
echo -e "$1" >&2
fi
}
_TaskTabCompletion(){
local tasks cur word aliases
tasks=$(task +s list -a | grep -v Available)
cur=${COMP_WORDS[COMP_CWORD]}
word=${COMP_WORDS[$COMP_CWORD-1]}
aliases="$(alias | grep task | sed "s/alias \(.*\)='task'/\1/")"
if [[ "$word" == "task" ]] || [[ "$word" == "help" ]] || [[ "$aliases" == *"$word"* ]]
then
COMPREPLY=("$( compgen -W "$tasks" -- "$cur" )")
fi
}
# Setup tab completion for task
complete -F _TaskTabCompletion -o bashdefault -o default task
# Setup tab completion for any aliases for task
for a in $(alias | grep task | sed "s/alias \(.*\)='task'/\1/")
do
complete -F _TaskTabCompletion -o bashdefault -o default "$a"
done