buildroot/utils/config
Arnout Vandecappelle 7150edc790 utils/config: fix shellcheck errors
In utils/config line 54:
                ARG="`echo $ARG | tr a-z- A-Z_`"
                     ^------------------------^ SC2006: Use $(...) notation instead of legacy backticked `...`.
                           ^--^ SC2086: Double quote to prevent globbing and word splitting.

Did you mean:
                ARG="$(echo "$ARG" | tr a-z- A-Z_)"

In utils/config line 87:
        local tmpfile="$infile.swp"
              ^-----^ SC2034: tmpfile appears unused. Verify use (or export if used externally).

In utils/config line 182:
                        if [ $? != 0 ] ; then
                             ^-- SC2181: Check exit code directly with e.g. 'if mycmd;', not indirectly with $?.

For more information:
  https://www.shellcheck.net/wiki/SC2034 -- tmpfile appears unused. Verify us...
  https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
  https://www.shellcheck.net/wiki/SC2006 -- Use $(...) notation instead of le...

The suggestions from shellcheck can be applied.

The unused variable tmpfile in fact occurs in several functions, all of
them can be removed.

For the check exit code, the condition is swapped to avoid negative
logic.

Signed-off-by: Arnout Vandecappelle <arnout@mind.be>
2023-02-08 15:28:30 +01:00

203 lines
3.9 KiB
Bash
Executable File

#!/bin/bash
# Manipulate options in a .config file from the command line
myname=${0##*/}
# If no prefix forced, use the default BR2_
BR2_PREFIX="${BR2_PREFIX-BR2_}"
usage() {
cat >&2 <<EOL
Manipulate options in a .config file from the command line.
Usage:
$myname options command ...
commands:
--enable|-e option Enable option
--disable|-d option Disable option
--set-str option string
Set option to "string"
--set-val option value
Set option to value
--undefine|-u option Undefine option
--state|-s option Print state of option (n,y,m,undef)
--enable-after|-E beforeopt option
Enable option directly after other option
--disable-after|-D beforeopt option
Disable option directly after other option
commands can be repeated multiple times
options:
--file config-file .config file to change (default .config)
--keep-case|-k Keep next symbols' case (dont' upper-case it)
--package|-p Operate on package (set prefix to BR2_PACKAGE_)
$myname doesn't check the validity of the .config file. This is done at next
make time.
By default, $myname will upper-case the given symbol. Use --keep-case to keep
the case of all following symbols unchanged.
$myname uses 'BR2_' as the default symbol prefix. Set the environment
variable BR2_PREFIX to the prefix to use. Eg.: BR2_PREFIX="FOO_" $myname ...
EOL
exit 1
}
checkarg() {
ARG="$1"
if [ "$ARG" = "" ] ; then
usage
fi
if [ "$MUNGE_CASE" = "yes" ] ; then
ARG="$(echo "$ARG" | tr a-z- A-Z_)"
fi
case "$ARG" in
${BR2_PREFIX}*)
ARG="${ARG/${BR2_PREFIX}/}"
;;
esac
}
txt_append() {
local anchor="$1"
local insert="$2"
local infile="$3"
# sed append cmd: 'a\' + newline + text + newline
cmd="$(printf "a\\%b$insert" "\n")"
sed -i -e "/$anchor/$cmd" "$infile"
}
txt_subst() {
local before="$1"
local after="$2"
local infile="$3"
sed -i -e "s:$before:$after:" "$infile"
}
txt_delete() {
local text="$1"
local infile="$2"
sed -i -e "/$text/d" "$infile"
}
set_var() {
local name=$1 new=$2 before=$3
name_re="^($name=|# $name is not set)"
before_re="^($before=|# $before is not set)"
if test -n "$before" && grep -Eq "$before_re" "$FN"; then
txt_append "^$before=" "$new" "$FN"
txt_append "^# $before is not set" "$new" "$FN"
elif grep -Eq "$name_re" "$FN"; then
txt_subst "^$name=.*" "$new" "$FN"
txt_subst "^# $name is not set" "$new" "$FN"
else
echo "$new" >>"$FN"
fi
}
undef_var() {
local name=$1
txt_delete "^$name=" "$FN"
txt_delete "^# $name is not set" "$FN"
}
if [ "$1" = "--file" ]; then
FN="$2"
if [ "$FN" = "" ] ; then
usage
fi
shift 2
else
FN=.config
fi
if [ "$1" = "" ] ; then
usage
fi
MUNGE_CASE=yes
while [ "$1" != "" ] ; do
CMD="$1"
shift
case "$CMD" in
--keep-case|-k)
MUNGE_CASE=no
continue
;;
--package|-p)
BR2_PREFIX="BR2_PACKAGE_"
continue
;;
--*-after|-E|-D|-M)
checkarg "$1"
A=$ARG
checkarg "$2"
B=$ARG
shift 2
;;
-*)
checkarg "$1"
shift
;;
esac
case "$CMD" in
--enable|-e)
set_var "${BR2_PREFIX}$ARG" "${BR2_PREFIX}$ARG=y"
;;
--disable|-d)
set_var "${BR2_PREFIX}$ARG" "# ${BR2_PREFIX}$ARG is not set"
;;
--set-str)
# sed swallows one level of escaping, so we need double-escaping
set_var "${BR2_PREFIX}$ARG" "${BR2_PREFIX}$ARG=\"${1//\"/\\\\\"}\""
shift
;;
--set-val)
set_var "${BR2_PREFIX}$ARG" "${BR2_PREFIX}$ARG=$1"
shift
;;
--undefine|-u)
undef_var "${BR2_PREFIX}$ARG"
;;
--state|-s)
if grep -q "# ${BR2_PREFIX}$ARG is not set" $FN ; then
echo n
else
if V="$(grep "^${BR2_PREFIX}$ARG=" $FN)"; then
V="${V/#${BR2_PREFIX}$ARG=/}"
V="${V/#\"/}"
V="${V/%\"/}"
V="${V//\\\"/\"}"
echo "${V}"
else
echo undef
fi
fi
;;
--enable-after|-E)
set_var "${BR2_PREFIX}$B" "${BR2_PREFIX}$B=y" "${BR2_PREFIX}$A"
;;
--disable-after|-D)
set_var "${BR2_PREFIX}$B" "# ${BR2_PREFIX}$B is not set" "${BR2_PREFIX}$A"
;;
*)
usage
;;
esac
done