Gentoo Archives: gentoo-dev

From: "Michał Górny" <mgorny@g.o>
To: gentoo-dev@l.g.o
Cc: "Michał Górny" <mgorny@g.o>
Subject: [gentoo-dev] [PATCH] versionator.eclass: Add tests for parameter counts
Date: Sat, 23 Jul 2016 13:27:39
Message-Id: 20160723132714.2110-1-mgorny@gentoo.org
1 Ensure that proper number of parameters is passed to each versionator
2 function; die otherwise. This prevents the functions from proceeding
3 with undefined behavior when mis-called. However, it does not cover the
4 most common mistake of passing an empty version that implicitly gets
5 replaced by ${PV}.
6 ---
7 eclass/versionator.eclass | 39 ++++++++++++++++++++++++++++++++++++++-
8 1 file changed, 38 insertions(+), 1 deletion(-)
9
10 diff --git a/eclass/versionator.eclass b/eclass/versionator.eclass
11 index 74e676ee..e42fc4d 100644
12 --- a/eclass/versionator.eclass
13 +++ b/eclass/versionator.eclass
14 @@ -1,4 +1,4 @@
15 -# Copyright 1999-2014 Gentoo Foundation
16 +# Copyright 1999-2016 Gentoo Foundation
17 # Distributed under the terms of the GNU General Public License v2
18 # $Id$
19
20 @@ -46,6 +46,8 @@ get_all_version_components() {
21 local ver_str=${1:-${PV}} result
22 result=()
23
24 + [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
25 +
26 # sneaky cache trick cache to avoid having to parse the same thing several
27 # times.
28 if [[ ${VERSIONATOR_CACHE_VER_STR} == ${ver_str} ]] ; then
29 @@ -101,6 +103,8 @@ get_all_version_components() {
30 # 20040905 -> 20040905
31 # 3.0c-r1 -> 3 0 c r1
32 get_version_components() {
33 + [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
34 +
35 local c=$(get_all_version_components "${1:-${PV}}")
36 echo ${c//[-._]/ }
37 }
38 @@ -115,6 +119,8 @@ get_version_components() {
39 # 20040905 -> 20040905
40 # 3.0c-r1 -> 3
41 get_major_version() {
42 + [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
43 +
44 local c=($(get_all_version_components "${1:-${PV}}"))
45 echo ${c[0]}
46 }
47 @@ -128,6 +134,9 @@ get_major_version() {
48 # 1-2 1.2.3 -> 1.2
49 # 2- 1.2.3 -> 2.3
50 get_version_component_range() {
51 + [[ $# -ge 1 ]] || die "${FUNCNAME}: no range provided"
52 + [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
53 +
54 eshopts_push -s extglob
55 local c v="${2:-${PV}}" range="${1}" range_start range_end
56 local -i i=-1 j=0
57 @@ -161,6 +170,8 @@ get_version_component_range() {
58 # 20040905 -> (empty string)
59 # 3.0c-r1 -> 0c-r1
60 get_after_major_version() {
61 + [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
62 +
63 echo $(get_version_component_range 2- "${1:-${PV}}")
64 }
65
66 @@ -175,6 +186,9 @@ get_after_major_version() {
67 # Rather than being a number, $1 can be a separator character such as '-', '.'
68 # or '_'. In this case, the first separator of this kind is selected.
69 replace_version_separator() {
70 + [[ $# -ge 2 ]] || die "${FUNCNAME}: required parameters missing"
71 + [[ $# -le 3 ]] || die "${FUNCNAME}: too many parameters ($#)"
72 +
73 eshopts_push -s extglob
74 local w c v="${3:-${PV}}"
75 declare -i i found=0
76 @@ -210,6 +224,9 @@ replace_version_separator() {
77 # Replace all version separators in $2 (defaults to $PV) with $1.
78 # '_' 1b.2.3 -> 1b_2_3
79 replace_all_version_separators() {
80 + [[ $# -ge 1 ]] || die "${FUNCNAME}: no replacement provided"
81 + [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
82 +
83 local c=($(get_all_version_components "${2:-${PV}}"))
84 c=${c[@]//[-._]/$1}
85 echo ${c// }
86 @@ -226,6 +243,9 @@ replace_all_version_separators() {
87 # Rather than being a number, $1 can be a separator character such as '-', '.'
88 # or '_'. In this case, the first separator of this kind is deleted.
89 delete_version_separator() {
90 + [[ $# -ge 1 ]] || die "${FUNCNAME}: no index provided"
91 + [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
92 +
93 replace_version_separator "${1}" "" "${2}"
94 }
95
96 @@ -235,6 +255,8 @@ delete_version_separator() {
97 # Delete all version separators in $1 (defaults to $PV).
98 # 1b.2.3 -> 1b23
99 delete_all_version_separators() {
100 + [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
101 +
102 replace_all_version_separators "" "${1}"
103 }
104
105 @@ -245,6 +267,8 @@ delete_all_version_separators() {
106 # 1.0.1 -> 3
107 # 3.0c-r1 -> 4
108 get_version_component_count() {
109 + [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
110 +
111 local a=($(get_version_components "${1:-${PV}}"))
112 echo ${#a[@]}
113 }
114 @@ -257,6 +281,8 @@ get_version_component_count() {
115 # 1.0.1 -> 2
116 # 3.0c-r1 -> 3
117 get_last_version_component_index() {
118 + [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
119 +
120 echo $(($(get_version_component_count "${1:-${PV}}" ) - 1))
121 }
122
123 @@ -267,6 +293,9 @@ get_last_version_component_index() {
124 # only. May not be reliable, be sure to do very careful testing before actually
125 # using this.
126 version_is_at_least() {
127 + [[ $# -ge 1 ]] || die "${FUNCNAME}: wanted version not provided"
128 + [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
129 +
130 local want_s="$1" have_s="${2:-${PVR}}" r
131 version_compare "${want_s}" "${have_s}"
132 r=$?
133 @@ -291,6 +320,9 @@ version_is_at_least() {
134 # return 3. You probably want version_is_at_least rather than this function.
135 # May not be very reliable. Test carefully before using this.
136 version_compare() {
137 + [[ $# -ge 2 ]] || die "${FUNCNAME}: versions not provided"
138 + [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
139 +
140 eshopts_push -s extglob
141 local ver_a=${1} ver_b=${2} parts_a parts_b
142 local cur_tok_a cur_tok_b num_part_a num_part_b
143 @@ -468,6 +500,8 @@ version_compare() {
144 # algorithm for simplicity, so don't call it with more than a few dozen items.
145 # Uses version_compare, so be careful.
146 version_sort() {
147 + [[ $# -ge 1 ]] || die "${FUNCNAME}: version not provided"
148 +
149 eshopts_push -s extglob
150 local items=
151 local -i left=0
152 @@ -501,6 +535,9 @@ version_sort() {
153 # MY_P=$(version_format_string '${PN}_source_$1_$2-$3_$4')
154 # Now MY_P will be: cow-hat_source_1_2-3_p4
155 version_format_string() {
156 + [[ $# -ge 1 ]] || die "${FUNCNAME}: no format provided"
157 + [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
158 +
159 local fstr=$1
160 shift
161 set -- $(get_version_components "$@")
162 --
163 2.9.2

Replies

Subject Author
Re: [gentoo-dev] [PATCH] versionator.eclass: Add tests for parameter counts "Chí-Thanh Christopher Nguyễn" <chithanh@g.o>