Ensure that proper number of parameters is passed to each versionator
function; die otherwise. This prevents the functions from proceeding
with undefined behavior when mis-called. However, it does not cover the
most common mistake of passing an empty version that implicitly gets
replaced by ${PV}.
---
eclass/versionator.eclass | 39 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 38 insertions(+), 1 deletion(-)
diff --git a/eclass/versionator.eclass b/eclass/versionator.eclass
index 74e676ee..e42fc4d 100644
--- a/eclass/versionator.eclass
+++ b/eclass/versionator.eclass
@@ -1,4 +1,4 @@
-# Copyright 1999-2014 Gentoo Foundation
+# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
@@ -46,6 +46,8 @@ get_all_version_components() {
local ver_str=${1:-${PV}} result
result=()
+ [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
# sneaky cache trick cache to avoid having to parse the same thing
several
# times.
if [[ ${VERSIONATOR_CACHE_VER_STR} == ${ver_str} ]] ; then
@@ -101,6 +103,8 @@ get_all_version_components() {
# 20040905 -> 20040905
# 3.0c-r1 -> 3 0 c r1
get_version_components() {
+ [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
local c=$(get_all_version_components "${1:-${PV}}")
echo ${c//[-._]/ }
}
@@ -115,6 +119,8 @@ get_version_components() {
# 20040905 -> 20040905
# 3.0c-r1 -> 3
get_major_version() {
+ [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
local c=($(get_all_version_components "${1:-${PV}}"))
echo ${c[0]}
}
@@ -128,6 +134,9 @@ get_major_version() {
# 1-2 1.2.3 -> 1.2
# 2- 1.2.3 -> 2.3
get_version_component_range() {
+ [[ $# -ge 1 ]] || die "${FUNCNAME}: no range provided"
+ [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
eshopts_push -s extglob
local c v="${2:-${PV}}" range="${1}" range_start range_end
local -i i=-1 j=0
@@ -161,6 +170,8 @@ get_version_component_range() {
# 20040905 -> (empty string)
# 3.0c-r1 -> 0c-r1
get_after_major_version() {
+ [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
echo $(get_version_component_range 2- "${1:-${PV}}")
}
@@ -175,6 +186,9 @@ get_after_major_version() {
# Rather than being a number, $1 can be a separator character such as '-', '.'
# or '_'. In this case, the first separator of this kind is selected.
replace_version_separator() {
+ [[ $# -ge 2 ]] || die "${FUNCNAME}: required parameters missing"
+ [[ $# -le 3 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
eshopts_push -s extglob
local w c v="${3:-${PV}}"
declare -i i found=0
@@ -210,6 +224,9 @@ replace_version_separator() {
# Replace all version separators in $2 (defaults to $PV) with $1.
# '_' 1b.2.3 -> 1b_2_3
replace_all_version_separators() {
+ [[ $# -ge 1 ]] || die "${FUNCNAME}: no replacement provided"
+ [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
local c=($(get_all_version_components "${2:-${PV}}"))
c=${c[@]//[-._]/$1}
echo ${c// }
@@ -226,6 +243,9 @@ replace_all_version_separators() {
# Rather than being a number, $1 can be a separator character such as '-', '.'
# or '_'. In this case, the first separator of this kind is deleted.
delete_version_separator() {
+ [[ $# -ge 1 ]] || die "${FUNCNAME}: no index provided"
+ [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
replace_version_separator "${1}" "" "${2}"
}
@@ -235,6 +255,8 @@ delete_version_separator() {
# Delete all version separators in $1 (defaults to $PV).
# 1b.2.3 -> 1b23
delete_all_version_separators() {
+ [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
replace_all_version_separators "" "${1}"
}
@@ -245,6 +267,8 @@ delete_all_version_separators() {
# 1.0.1 -> 3
# 3.0c-r1 -> 4
get_version_component_count() {
+ [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
local a=($(get_version_components "${1:-${PV}}"))
echo ${#a[@]}
}
@@ -257,6 +281,8 @@ get_version_component_count() {
# 1.0.1 -> 2
# 3.0c-r1 -> 3
get_last_version_component_index() {
+ [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
echo $(($(get_version_component_count "${1:-${PV}}" ) - 1))
}
@@ -267,6 +293,9 @@ get_last_version_component_index() {
# only. May not be reliable, be sure to do very careful testing before actually
# using this.
version_is_at_least() {
+ [[ $# -ge 1 ]] || die "${FUNCNAME}: wanted version not provided"
+ [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
local want_s="$1" have_s="${2:-${PVR}}" r
version_compare "${want_s}" "${have_s}"
r=$?
@@ -291,6 +320,9 @@ version_is_at_least() {
# return 3. You probably want version_is_at_least rather than this function.
# May not be very reliable. Test carefully before using this.
version_compare() {
+ [[ $# -ge 2 ]] || die "${FUNCNAME}: versions not provided"
+ [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
eshopts_push -s extglob
local ver_a=${1} ver_b=${2} parts_a parts_b
local cur_tok_a cur_tok_b num_part_a num_part_b
@@ -468,6 +500,8 @@ version_compare() {
# algorithm for simplicity, so don't call it with more than a few dozen items.
# Uses version_compare, so be careful.
version_sort() {
+ [[ $# -ge 1 ]] || die "${FUNCNAME}: version not provided"
+
eshopts_push -s extglob
local items=
local -i left=0
@@ -501,6 +535,9 @@ version_sort() {
# MY_P=$(version_format_string '${PN}_source_$1_$2-$3_$4')
# Now MY_P will be: cow-hat_source_1_2-3_p4
version_format_string() {
+ [[ $# -ge 1 ]] || die "${FUNCNAME}: no format provided"
+ [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
local fstr=$1
shift
set -- $(get_version_components "$@")
--
2.9.2