[PATCH aiaiai 1/2] aiaiai: add checks to configuration file
Keller, Jacob E
jacob.e.keller at intel.com
Tue Apr 8 14:38:45 PDT 2014
Same for both of these patches. I will send out the whole series of
patches I currently have.
Thanks,
Jake
On Mon, 2014-04-07 at 16:27 -0700, Jacob Keller wrote:
> This patch adds configuration check functions and performs some basic
> checks against the configuration file. A future effort may be to clean
> up these checks so that it outputs a bit more error cases.
>
> The main value of these checks is to prevent weird errors later when we
> assume that values have some standard meaning. In addition, it allows
> cleaning up boolean values to always be canonicalized into 0 or 1.
>
> Signed-off-by: Jacob Keller <jacob.e.keller at intel.com>
> ---
> email/aiaiai-email-sh-functions | 72 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 72 insertions(+)
>
> diff --git a/email/aiaiai-email-sh-functions b/email/aiaiai-email-sh-functions
> index 1d23decfb89b..ad3ee1d299f9 100644
> --- a/email/aiaiai-email-sh-functions
> +++ b/email/aiaiai-email-sh-functions
> @@ -142,6 +142,52 @@ get_cfgfile_projects_list()
> LC_ALL=C sed -n -e "s/^\[prj_\(.*\)\]$/\1/p" "$cfgfile"
> }
>
> +# Like opt_check_number, except doesn't fail on empty value
> +# Arguments: $1 is config name, $2 is config value.
> +# If $2 is a positive decimal number (or empty), outputs it, otherwise fails.
> +config_check_number()
> +{
> + [ -n "${2##0*}" -a -n "${2##*[!0-9]*}" ] ||
> + fatal "$1: $2: invalid number."
> + printf %s "$2"
> +}
> +
> +# Like opt_check_file, except requires executable permissions
> +# Arguments: $1 is config name, $2 is config value.
> +# If $2 is an executable file, outputs canonicalized file name,
> +# otherwise fails.
> +config_check_exec()
> +{
> + local value
> + [ -x "$2" ] &&
> + value="$(readlink -ev "$2")" ||
> + fatal "$1: $2: not an executable file."
> + printf %s "$value"
> +}
> +
> +# Check whether config value is boolean. Empty string is considered false.
> +# Arguments: $1 is config name, $2 is config value.
> +# If $2 is a boolean value, output canonicalized value,
> +# otherwise, fails.
> +config_check_boolean()
> +{
> + local value
> + value="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
> +
> + # Prefixing with _ makes it easier to catch empty string as false
> + case "_$value" in
> + _|_0|_false|no)
> + printf %s "0"
> + ;;
> + _1|_true|yes)
> + printf %s "1"
> + ;;
> + *)
> + fatal "$1: $2: not a boolean value."
> + ;;
> + esac
> +}
> +
> # Parse the "global" section of the config file. The result is a set of
> # per-option variables and their values are exactly as in the configuration
> # file:
> @@ -166,18 +212,24 @@ parse_config()
> ini_config_get_or_die cfg_adminmail "$cfgfile" "global" "adminmail"
> ini_config_get_or_die cfg_adminname "$cfgfile" "global" "adminname"
> ini_config_get_or_die cfg_workdir "$cfgfile" "global" "workdir"
> + cfg_workdir="$(opt_check_dir "workdir" "$cfg_workdir")"
> ini_config_get_or_die cfg_max_validators "$cfgfile" "global" "max_validators"
> + cfg_max_validators="$(config_check_number "max_validators" "$cfg_max_validators")"
> ini_config_get_or_die cfg_jobs "$cfgfile" "global" "jobs"
> + cfg_jobs="$(config_check_number "jobs" "$cfg_jobs")"
> ini_config_get_or_die cfg_preamble "$cfgfile" "global" "preamble"
> ini_config_get_or_die cfg_signature "$cfgfile" "global" "signature"
> ini_config_get_or_die cfg_built_preamble "$cfgfile" "global" "built_preamble"
>
> # Get the location of email hook(s)
> cfg_email_hook="$(ini_config_get "$cfgfile" "hooks" "email")"
> + cfg_email_hook="$(config_check_exec "email" "$cfg_email_hook")"
>
> # Debug options
> cfg_disable_notifications="$(ini_config_get "$cfgfile" "debug" "disable_notifications")"
> + cfg_disable_notifications="$(config_check_boolean "disable_notifications" "$cfg_disable_notifications")"
> cfg_preserve_files="$(ini_config_get "$cfgfile" "debug" "preserve_files")"
> + cfg_preserve_files="$(config_check_boolean "preserve_files" "$cfg_preserve_files")"
>
> # Get the contents of the preamble file
> cfg_preamble="$(cat "$cfg_preamble")"
> @@ -262,30 +314,50 @@ parse_prj_config()
> # project config does not specify anything.
> pcfg_configs="$(ini_config_get "$cfgfile" "prj_$prj" "configs")"
> ini_config_is_set "$cfgfile" "prj_$prj" "configs" || pcfg_configs="$__dcfg_configs"
> +
> pcfg_reply_to_all="$(ini_config_get "$cfgfile" "prj_$prj" "reply_to_all")"
> ini_config_is_set "$cfgfile" "prj_$prj" "reply_to_all" || pcfg_reply_to_all="$__dcfg_reply_to_all"
> + pcfg_reply_to_all="$(config_check_boolean "reply_to_all" "$pcfg_reply_to_all")"
> +
> pcfg_accept_notify="$(ini_config_get "$cfgfile" "prj_$prj" "accept_notify")"
> ini_config_is_set "$cfgfile" "prj_$prj" "accept_notify" || pcfg_accept_notify="$__dcfg_accept_notify"
> + pcfg_accept_notify="$(config_check_boolean "accept_notify" "$pcfg_accept_notify")"
> +
> pcfg_always_cc="$(ini_config_get "$cfgfile" "prj_$prj" "always_cc")"
> ini_config_is_set "$cfgfile" "prj_$prj" "always_cc" || pcfg_always_cc="$__dcfg_always_cc"
> +
> pcfg_unwanted_keywords="$(ini_config_get "$cfgfile" "prj_$prj" "unwanted_keywords")"
> ini_config_is_set "$cfgfile" "prj_$prj" "unwanted_keywords" || pcfg_unwanted_keywords="$__dcfg_unwanted_keywords"
> +
> pcfg_kmake_opts="$(ini_config_get "$cfgfile" "prj_$prj" "kmake_opts")"
> ini_config_is_set "$cfgfile" "prj_$prj" "kmake_opts" || pcfg_kmake_opts="$__dcfg_kmake_opts"
> +
> pcfg_targets="$(ini_config_get "$cfgfile" "prj_$prj" "targets")"
> ini_config_is_set "$cfgfile" "prj_$prj" "targets" || pcfg_targets="$__dcfg_targets"
> +
> pcfg_defconfigdir="$(ini_config_get "$cfgfile" "prj_$prj" "defconfigdir")"
> ini_config_is_set "$cfgfile" "prj_$prj" "defconfigdir" || pcfg_defconfigdir="$__dcfg_defconfigdir"
> + [ -z "$pcfg_defconfigdir" ] || pcfg_defconfigdir="$(opt_check_dir "defconfigdir" "$pcfg_defconfigdir")"
> +
> pcfg_bisectability="$(ini_config_get "$cfgfile" "prj_$prj" "bisectability")"
> ini_config_is_set "$cfgfile" "prj_$prj" "bisectability" || pcfg_bisectability="$__dcfg_bisectability"
> + pcfg_bisectability="$(config_check_boolean "bisectability" "$pcfg_bisectability")"
> +
> pcfg_sparse="$(ini_config_get "$cfgfile" "prj_$prj" "sparse")"
> ini_config_is_set "$cfgfile" "prj_$prj" "sparse" || pcfg_sparse="$__dcfg_sparse"
> + pcfg_sparse="$(config_check_boolean "sparse" "$pcfg_sparse")"
> +
> pcfg_smatch="$(ini_config_get "$cfgfile" "prj_$prj" "smatch")"
> ini_config_is_set "$cfgfile" "prj_$prj" "smatch" || pcfg_smatch="$__dcfg_smatch"
> + pcfg_smatch="$(config_check_boolean "smatch" "$pcfg_smatch")"
> +
> pcfg_cppcheck="$(ini_config_get "$cfgfile" "prj_$prj" "cppcheck")"
> ini_config_is_set "$cfgfile" "prj_$prj" "cppcheck" || pcfg_cppcheck="$__dcfg_cppcheck"
> + pcfg_cppcheck="$(config_check_boolean "cppcheck" "$pcfg_cppcheck")"
> +
> pcfg_coccinelle="$(ini_config_get "$cfgfile" "prj_$prj" "coccinelle")"
> ini_config_is_set "$cfgfile" "prj_$prj" "coccinelle" || pcfg_coccinelle="$__dcfg_coccinelle"
> + pcfg_coccinelle="$(config_check_boolean "coccinelle" "$pcfg_coccinelle")"
> }
>
> # Compose (but not send) e-mail reply. This function assumes that the following
More information about the aiaiai
mailing list