Skip to content

Commit beeb338

Browse files
committed
Parse a configuration file
1 parent 10b7d42 commit beeb338

File tree

2 files changed

+89
-8
lines changed

2 files changed

+89
-8
lines changed

script/install.sh

Lines changed: 73 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,17 +124,19 @@ check_tools() {
124124

125125
# ------------------------------------------------------------------------------
126126

127-
mkdir -p "$ROOT"
128-
TMP_ROOT=$(mktemp -d "$ROOT/.installer_tmp_XXXXXX")
127+
init() {
128+
mkdir -p "$ROOT"
129+
TMP_ROOT=$(mktemp -d "$ROOT/.installer_tmp_XXXXXX")
129130

130-
mkdtemp() {
131-
mktemp -d "$TMP_ROOT/XXXXXX"
132-
}
131+
mkdtemp() {
132+
mktemp -d "$TMP_ROOT/XXXXXX"
133+
}
133134

134-
cleanup() {
135-
rm -rf "$TMP_ROOT";
135+
cleanup() {
136+
rm -rf "$TMP_ROOT";
137+
}
138+
trap cleanup EXIT
136139
}
137-
trap cleanup EXIT
138140

139141
# ------------------------------------------------------------------------------
140142

@@ -155,12 +157,31 @@ Options
155157
-h --help Show this help
156158
-p --path Install location (default ~/dlang)
157159
-v --verbose Verbose output
160+
--config List all available configuration parameters
158161
159162
Run "install.sh <command> --help to get help for a specific command.
160163
If no argument are provided, the latest DMD compiler will be installed.
161164
'
162165
}
163166

167+
command_config() {
168+
log 'Configuration
169+
170+
~/.config/dlang/installer.cfg can be used to store permanent configuration settings.
171+
Alternatively a global configuration file can be used (/etc/dlang/installer.cfg).
172+
The parameters are listed in line-wise a <param>=<value> format.
173+
Lines starting with # are ignored.
174+
175+
Example:
176+
177+
ROOT=~/.dlang
178+
179+
Available options:
180+
181+
ROOT Install location (default ~/dlang)
182+
'
183+
}
184+
164185
command_help() {
165186
if [ -z "${1-}" ]; then
166187
usage
@@ -283,6 +304,11 @@ parse_args() {
283304
COMPILER=$1
284305
;;
285306

307+
--config)
308+
command_config
309+
exit 0
310+
;;
311+
286312
*)
287313
usage
288314
fatal "Unrecognized command-line parameter: $1"
@@ -685,8 +711,47 @@ install_dub() {
685711
ln -s "$dub" "$ROOT/dub"
686712
}
687713

714+
# ------------------------------------------------------------------------------
715+
# Read user configuration
716+
# ------------------------------------------------------------------------------
717+
718+
local config_file config_files
719+
config_files=(
720+
"${XDG_CONFIG_HOME:-$HOME/.config/}/dlang/installer.cfg" \
721+
"${XDG_CONFIG_DIRS:-/etc}/dlang/installer.cfg" \
722+
"$HOME/Library/Application Support/dlang/installer.cfg" \
723+
)
724+
config_file=""
725+
for file in "${config_files[@]}" ; do
726+
if [ -e "${file}" ] ; then
727+
config_file="${file}"
728+
fi
729+
done
730+
if [ -n "${config_file}" ] ; then
731+
# Use a whitelist of allowed parameters
732+
allowedParams=("ROOT")
733+
containsValue() {
734+
local e value="$1"
735+
shift
736+
for e; do [[ "${e}" == "${value}" ]] && return 0; done
737+
return 1
738+
}
739+
IFS="="
740+
# Ignore empty lines or lines with comments
741+
grep -vE "^(#|$)" "${config_file}" | while read -r param value ; do
742+
if containsValue "${param}" "${allowedParams[@]}" ; then
743+
log "${param}: ${value//\"/}"
744+
declare -a "${param}=${value//\"/}"
745+
else
746+
log "${param} is invalid. Please check."
747+
fi
748+
done
749+
ROOT="${ROOT/#\~/$HOME}"
750+
fi
751+
688752
# ------------------------------------------------------------------------------
689753

754+
init
690755
parse_args "$@"
691756
resolve_latest "$COMPILER"
692757
run_command ${COMMAND:-install} "$COMPILER"

travis.sh

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,19 @@ git checkout -- script/install.sh
9191
if [ "${TRAVIS_OS_NAME:-}" != "osx" ]; then
9292
shellcheck script/install.sh
9393
fi
94+
95+
# Test user config
96+
mkdir -p ~/.config/dlang
97+
echo "ROOT=~/.dlang" > ~/.config/dlang/installer.cfg
98+
./script/install.sh dmd
99+
has_user_installed_dmd=0
100+
for file in ~/.dlang/dmd* ; do
101+
if [ -e "$file" ] ; then
102+
has_user_installed_dmd=1
103+
break
104+
fi
105+
done
106+
if [ ${has_user_installed_dmd} -eq 0 ] ; then
107+
echo "Failed to install DMD in the user-specified directory."
108+
fi
109+
rm -rf ~/.dlang ~/.config

0 commit comments

Comments
 (0)