22#
33# Usage: ruby-build [-dvpk] <definition> <prefix> [-- <configure-args...>]
44# ruby-build {--list|--definitions}
5+ # ruby-build {--resolve} <version>
56# ruby-build --version
67#
78# -l, --list List latest stable releases for each Ruby
9+ # --resolve Find the most recent version matching a prefix.
810# --definitions List all local definitions, including outdated ones
911# --version Show version of ruby-build
1012#
@@ -1411,6 +1413,38 @@ list_maintained_versions() {
14111413 } | extract_latest_versions | sort_versions | uniq
14121414}
14131415
1416+ filter_version_prefix ()
1417+ {
1418+ pattern=" ${1// ./ \. } "
1419+ pattern=" ${pattern// +/ \+ } "
1420+ grep -e " ^${pattern} [-.$]"
1421+ }
1422+
1423+ resolve () {
1424+ prefix=" ${1# ruby-} "
1425+
1426+ # Look for an exact match first.
1427+ for DEFINITION_DIR in " ${RUBY_BUILD_DEFINITIONS[@]} " ; do
1428+ if [ -f " ${DEFINITION_DIR} /${prefix} " ]; then
1429+ echo " ${1} "
1430+ return 0
1431+ fi
1432+ done
1433+
1434+ prefix=" ${prefix% .} "
1435+
1436+ version=$( list_definitions | \
1437+ grep -v -e ' -rc[0-9]*$' -e ' -preview[0-9]*$' -e ' -dev$' | \
1438+ filter_version_prefix " ${prefix} " | \
1439+ LC_ALL=C sort -t. -k 1,1 -k 2,2n -k 3,3n -k 4,4n -k 5,5n | \
1440+ tail -n 1)
1441+
1442+ [[ -z " ${version} " ]] && return 1
1443+ [[ " ${1} " = " ruby-" * ]] && version=" ruby-${version} "
1444+
1445+ echo " ${version} "
1446+ }
1447+
14141448extract_latest_versions () {
14151449 # sort in this function looks redundunt but it is necessary
14161450 # rbx-3.99 appears latest unless the sort
@@ -1453,6 +1487,9 @@ for option in "${OPTIONS[@]}"; do
14531487 " l" | " list" )
14541488 EARLY_EXIT=list_maintained_versions
14551489 ;;
1490+ " resolve" )
1491+ EARLY_EXIT=resolve
1492+ ;;
14561493 " d" | " dir" )
14571494 APPEND_DEFINITION_TO_PREFIX=true
14581495 ;;
@@ -1503,23 +1540,19 @@ if [ "${#EXTRA_ARGUMENTS[@]}" -gt 0 ]; then
15031540 RUBY_CONFIGURE_OPTS_ARRAY=(" ${EXTRA_ARGUMENTS[@]} " )
15041541fi
15051542
1506- if [ " $APPEND_DEFINITION_TO_PREFIX " = " true" ]; then
1507- if [ -p " $DEFINITION_PATH " ]; then
1508- echo " ruby-build: using named pipes in combination with \` --dir' is not possible" >&2
1509- EARLY_EXIT=usage_error
1510- fi
1511- PREFIX_PATH=" $PREFIX_PATH /$( basename " $DEFINITION_PATH " ) "
1512- fi
1513-
15141543case " $EARLY_EXIT " in
15151544help )
15161545 version
15171546 echo
15181547 usage 0
15191548 ;;
1520- version | list_definitions | list_maintained_versions )
1521- " $EARLY_EXIT "
1522- exit 0
1549+ version | list_definitions | list_maintained_versions | resolve )
1550+ shift
1551+ if " $EARLY_EXIT " " $@ " ; then
1552+ exit 0
1553+ else
1554+ exit 1
1555+ fi
15231556 ;;
15241557usage_error )
15251558 echo >&2
@@ -1533,6 +1566,8 @@ usage_error )
15331566 ;;
15341567esac
15351568
1569+ DEFINITION_PREFIX=" "
1570+
15361571# expand the <definition> argument to full path of the definition file
15371572if [[ ! -f " $DEFINITION_PATH " && ! -p " $DEFINITION_PATH " ]]; then
15381573 for DEFINITION_DIR in " ${RUBY_BUILD_DEFINITIONS[@]} " ; do
@@ -1544,10 +1579,27 @@ if [[ ! -f "$DEFINITION_PATH" && ! -p "$DEFINITION_PATH" ]]; then
15441579
15451580 # If the given definition is like ruby-X.Y.Z, search again with X.Y.Z
15461581 if [[ " $DEFINITION_PATH " =~ ^ruby-[0-9] ]]; then
1547- DEFINITION_PATH =" ${DEFINITION_PATH# ruby-} "
1582+ UNPREFIXED_DEFINITION_PATH =" ${DEFINITION_PATH# ruby-} "
15481583 for DEFINITION_DIR in " ${RUBY_BUILD_DEFINITIONS[@]} " ; do
1549- if [ -f " ${DEFINITION_DIR} /${DEFINITION_PATH} " ]; then
1550- DEFINITION_PATH=" ${DEFINITION_DIR} /${DEFINITION_PATH} "
1584+ if [ -f " ${DEFINITION_DIR} /${UNPREFIXED_DEFINITION_PATH} " ]; then
1585+ DEFINITION_PREFIX=" ruby-"
1586+ DEFINITION_PATH=" ${DEFINITION_DIR} /${UNPREFIXED_DEFINITION_PATH} "
1587+ break
1588+ fi
1589+ done
1590+ fi
1591+
1592+ # If the given definition isn't a perfect match, we do a prefix search.
1593+ if [ ! -f " $DEFINITION_PATH " ]; then
1594+ FULLY_QUALIFIED_VERSION=$( resolve " $DEFINITION_PATH " )
1595+ if [[ " $FULLY_QUALIFIED_VERSION " =~ ^ruby-[0-9] ]]; then
1596+ DEFINITION_PREFIX=" ruby-"
1597+ FULLY_QUALIFIED_VERSION=" ${FULLY_QUALIFIED_VERSION# ruby-} "
1598+ fi
1599+
1600+ for DEFINITION_DIR in " ${RUBY_BUILD_DEFINITIONS[@]} " ; do
1601+ if [ -f " ${DEFINITION_DIR} /${FULLY_QUALIFIED_VERSION} " ]; then
1602+ DEFINITION_PATH=" ${DEFINITION_DIR} /${FULLY_QUALIFIED_VERSION} "
15511603 break
15521604 fi
15531605 done
@@ -1559,6 +1611,14 @@ if [[ ! -f "$DEFINITION_PATH" && ! -p "$DEFINITION_PATH" ]]; then
15591611 fi
15601612fi
15611613
1614+ if [ " $APPEND_DEFINITION_TO_PREFIX " = " true" ]; then
1615+ if [ -p " $DEFINITION_PATH " ]; then
1616+ echo " ruby-build: using named pipes in combination with \` --dir' is not possible" >&2
1617+ EARLY_EXIT=usage_error
1618+ fi
1619+ PREFIX_PATH=" $PREFIX_PATH /${DEFINITION_PREFIX} $( basename " $DEFINITION_PATH " ) "
1620+ fi
1621+
15621622# normalize the <prefix> argument
15631623if [ " ${PREFIX_PATH#/ } " = " $PREFIX_PATH " ]; then
15641624 PREFIX_PATH=" ${PWD} /${PREFIX_PATH} "
0 commit comments