Add & implement askNecessaryQuestions
This commit is contained in:
128
install.sh
128
install.sh
@@ -19,7 +19,7 @@ function getFilteredModules() {
|
||||
if [ "${#module}" -eq 0 ]; then
|
||||
echo "${allModules[@]}"
|
||||
else
|
||||
local modulesToKeep=()
|
||||
local mod modulesToKeep=()
|
||||
for mod in "${allModules[@]}"; do
|
||||
local foundAtIndex="${module[(Ie)${mod}]}"
|
||||
if [ "${inverse}" != 'true' -a "${foundAtIndex}" -gt 0 ]; then
|
||||
@@ -32,6 +32,130 @@ function getFilteredModules() {
|
||||
fi
|
||||
}
|
||||
|
||||
function runModule() {
|
||||
local mod="$1"
|
||||
shift
|
||||
${_DIR:-.}/${mod} "$@"
|
||||
}
|
||||
|
||||
function parseQuestionLine() {
|
||||
local questionType parameterName question value arguments args
|
||||
local -A typeMap=([i]=info [p]=password [c]=confirm [s]=select)
|
||||
[ -z "${line}" ] && return
|
||||
[ "${line[2]}" != ':' ] && return 10
|
||||
|
||||
questionType="${typeMap[${line[1]}]}"
|
||||
[ -z "${questionType}" ] && return 11
|
||||
|
||||
# remove question type
|
||||
[ "${line[3]}" = ' ' ] && line="${line:3}" || line="${line:2}"
|
||||
|
||||
line=("${(s.=.)line[@]}")
|
||||
parameterName="${line[1]}"
|
||||
[ -z "${parameterName}" ] && return 12
|
||||
[ "${parameterName[1]}" = '-' ] && return 13
|
||||
|
||||
# remove parameter name
|
||||
line="${(j.=.)${(@)line:1}}"
|
||||
|
||||
line=("${(s. #.)line}")
|
||||
question="${line[1]}"
|
||||
[ -z "${question}" ] && return 14
|
||||
|
||||
# remove question part
|
||||
line="${(j. #.)${(@)line:1}}"
|
||||
|
||||
if [ -n "${line}" ]; then
|
||||
arguments=("${(s.;.)line}")
|
||||
for arg in "${arguments[@]}"; do
|
||||
arg=("${(s.:.)arg}")
|
||||
[ -z "${arg[1]}" ] && return 15
|
||||
arg[1]="`trim "${arg[1]}"`"
|
||||
arg[2]="`trim "${arg[2]}"`"
|
||||
questionType+=";${(j.:.)arg}"
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
printf -v value '%s\n%s' "${question}" "${questionType}"
|
||||
questions+=("${parameterName}" "${value}")
|
||||
}
|
||||
|
||||
function populateQuestionsWithModuleRequiredInformation() {
|
||||
for line in "${(f)$(runModule "${mod}" --show-required-information)}"; do
|
||||
parseQuestionLine
|
||||
done
|
||||
}
|
||||
|
||||
function convertQuestionArgsToAskUserArgs() {
|
||||
local arg argName argValue
|
||||
local instructions=("${(s.;.)questionArgs}")
|
||||
local questionType="${instructions[1]}"
|
||||
shift instructions
|
||||
|
||||
if [ "${questionType}" = 'info' ]; then
|
||||
args=(info)
|
||||
elif [ "${questionType}" = 'password' ]; then
|
||||
args=('-p' info)
|
||||
elif [ "${questionType}" = 'confirm' ]; then
|
||||
args=(confirm)
|
||||
elif [ "${questionType}" = 'select' ]; then
|
||||
for arg in "${instructions[@]}"; do
|
||||
arg=("${(s.:.)arg}")
|
||||
[ "${#arg}" -lt 2 ] && continue
|
||||
argName="${arg[1]}"
|
||||
argValue="${arg[2]}"
|
||||
[ "${argName}" != 'choose from' ] && continue
|
||||
choices=("${(s.,.)argValue}")
|
||||
done
|
||||
[ "${#choices}" -ge 1 ] || return 10
|
||||
args=(choose)
|
||||
fi
|
||||
}
|
||||
|
||||
function askUserQuestion() {
|
||||
local choices
|
||||
local questionAndArgs=("${(f)questions[$questionID]}") args=()
|
||||
local question="${questionAndArgs[1]}" questionArgs="${questionAndArgs[2]}"
|
||||
convertQuestionArgsToAskUserArgs
|
||||
askUser "${args[@]}" "${question}"
|
||||
value="${REPLY}"
|
||||
}
|
||||
|
||||
function generateConfigKeysFromQuestionID() {
|
||||
setopt localoptions extendedglob
|
||||
[ $# -lt 2 -o -z "$1" -o -z "$2" ] && return
|
||||
local modName="${1}" questID="${2}"
|
||||
modName="${${${${modName//-##/_}/#_/}/%_/}//[^A-Za-z_]/}"
|
||||
questID="${${${${questID//-##/_}/#_/}/%_/}//[^A-Za-z_]/}"
|
||||
configkeys=("${modName}" questions "${questID}")
|
||||
}
|
||||
|
||||
function answerQuestionsFromConfigOrAskUser() {
|
||||
local questionID
|
||||
config setappname "de.astzweig.macos.system-setup"
|
||||
for questionID in "${(k)questions[@]}"; do
|
||||
local value configkeys=()
|
||||
generateConfigKeysFromQuestionID "${mod}" "${questionID}"
|
||||
value="`config read "${configkeys[@]}"`"
|
||||
if [ -z "${value}" ]; then
|
||||
askUserQuestion
|
||||
config write "${value}" "${configkeys[@]}"
|
||||
fi
|
||||
answers+=("${mod}_${questionID}" "${value}")
|
||||
done
|
||||
}
|
||||
|
||||
function askNecessaryQuestions() {
|
||||
local mod
|
||||
local -A answers
|
||||
for mod in "${modulesToInstall[@]}"; do
|
||||
local -A questions=()
|
||||
populateQuestionsWithModuleRequiredInformation
|
||||
answerQuestionsFromConfigOrAskUser
|
||||
done
|
||||
}
|
||||
|
||||
function main() {
|
||||
eval "`docopts -f -V - -h - : "$@" <<- USAGE
|
||||
Usage: $0 [options] [<module>...]
|
||||
@@ -50,9 +174,11 @@ function main() {
|
||||
local modulesToInstall=(`getFilteredModules`)
|
||||
ensureDocopts
|
||||
autoloadZShLib
|
||||
askNecessaryQuestions
|
||||
hio debug "Current working dir is: `pwd`"
|
||||
}
|
||||
|
||||
if [[ "${ZSH_EVAL_CONTEXT}" == toplevel ]]; then
|
||||
_DIR="${0:A:h}"
|
||||
main
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user