Skip to content

Commit f7d63b7

Browse files
committed
Rework argument parsing to error out on invalid flags
1 parent c8927ee commit f7d63b7

File tree

1 file changed

+52
-18
lines changed

1 file changed

+52
-18
lines changed

bin/ruby-build

Lines changed: 52 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1268,6 +1268,7 @@ unset KEEP_BUILD_PATH
12681268
unset HAS_PATCH
12691269
unset IPV4
12701270
unset IPV6
1271+
unset EARLY_EXIT
12711272

12721273
RUBY_BUILD_INSTALL_PREFIX="$(abs_dirname "$0")/.."
12731274

@@ -1279,17 +1280,13 @@ parse_options "$@"
12791280
for option in "${OPTIONS[@]}"; do
12801281
case "$option" in
12811282
"h" | "help" )
1282-
version
1283-
echo
1284-
usage 0
1283+
EARLY_EXIT=help
12851284
;;
12861285
"definitions" )
1287-
list_definitions
1288-
exit 0
1286+
EARLY_EXIT=list_definitions
12891287
;;
12901288
"l" | "list")
1291-
list_maintained_versions
1292-
exit 0
1289+
EARLY_EXIT=list_maintained_versions
12931290
;;
12941291
"k" | "keep" )
12951292
KEEP_BUILD_PATH=true
@@ -1307,18 +1304,57 @@ for option in "${OPTIONS[@]}"; do
13071304
IPV6=true
13081305
;;
13091306
"version" )
1310-
version
1311-
exit 0
1307+
EARLY_EXIT=version
1308+
;;
1309+
* )
1310+
printf "ruby-build: invalid flag '%s'\n" "$option" >&2
1311+
EARLY_EXIT=usage_error
13121312
;;
13131313
esac
13141314
done
13151315

1316-
[ "${#ARGUMENTS[@]}" -eq 2 ] || usage 1 >&2
1317-
13181316
DEFINITION_PATH="${ARGUMENTS[0]}"
1319-
if [ -z "$DEFINITION_PATH" ]; then
1317+
PREFIX_PATH="${ARGUMENTS[1]}"
1318+
1319+
if [ -z "$EARLY_EXIT" ] && [ -z "$DEFINITION_PATH" ]; then
1320+
echo "ruby-build: missing definition argument" >&2
1321+
EARLY_EXIT=usage_error
1322+
fi
1323+
1324+
if [ -z "$EARLY_EXIT" ] && [ -z "$PREFIX_PATH" ]; then
1325+
echo "ruby-build: missing prefix argument" >&2
1326+
EARLY_EXIT=usage_error
1327+
fi
1328+
1329+
if [ "${#ARGUMENTS[@]}" -gt 2 ]; then
1330+
echo "ruby-build: expected at most 2 arguments, got [${ARGUMENTS[*]}]" >&2
1331+
EARLY_EXIT=usage_error
1332+
fi
1333+
1334+
case "$EARLY_EXIT" in
1335+
help )
1336+
version
1337+
echo
1338+
usage 0
1339+
;;
1340+
version | list_definitions | list_maintained_versions )
1341+
"$EARLY_EXIT"
1342+
exit 0
1343+
;;
1344+
usage_error )
1345+
echo >&2
13201346
usage 1 >&2
1321-
elif [ ! -f "$DEFINITION_PATH" ]; then
1347+
;;
1348+
'' )
1349+
;;
1350+
* )
1351+
echo "unimplemented EARLY_EXIT: $EARLY_EXIT" >&2
1352+
exit 1
1353+
;;
1354+
esac
1355+
1356+
# expand the <definition> argument to full path of the definition file
1357+
if [ ! -f "$DEFINITION_PATH" ]; then
13221358
for DEFINITION_DIR in "${RUBY_BUILD_DEFINITIONS[@]}"; do
13231359
if [ -f "${DEFINITION_DIR}/${DEFINITION_PATH}" ]; then
13241360
DEFINITION_PATH="${DEFINITION_DIR}/${DEFINITION_PATH}"
@@ -1332,10 +1368,8 @@ elif [ ! -f "$DEFINITION_PATH" ]; then
13321368
fi
13331369
fi
13341370

1335-
PREFIX_PATH="${ARGUMENTS[1]}"
1336-
if [ -z "$PREFIX_PATH" ]; then
1337-
usage 1 >&2
1338-
elif [ "${PREFIX_PATH#/}" = "$PREFIX_PATH" ]; then
1371+
# normalize the <prefix> argument
1372+
if [ "${PREFIX_PATH#/}" = "$PREFIX_PATH" ]; then
13391373
PREFIX_PATH="${PWD}/${PREFIX_PATH}"
13401374
fi
13411375

@@ -1366,7 +1400,7 @@ if [ -n "$noexec" ]; then
13661400
fi
13671401

13681402
if [ -z "$MAKE" ]; then
1369-
if is_freebsd && [[ $1 == jruby-* ]]; then
1403+
if is_freebsd && [[ ${ARGUMENTS[0]} == jruby-* ]]; then
13701404
# jruby-launcher requires gmake: https://github.com/ruby/ruby/pull/8591
13711405
export MAKE="gmake"
13721406
else

0 commit comments

Comments
 (0)