diff options
Diffstat (limited to 'bitbake/lib/bb/utils.py')
| -rw-r--r-- | bitbake/lib/bb/utils.py | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index 2e3937ec12..dce80b6342 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py | |||
| @@ -92,6 +92,149 @@ def vercmp(ta, tb): | |||
| 92 | r = vercmp_part(ra, rb) | 92 | r = vercmp_part(ra, rb) |
| 93 | return r | 93 | return r |
| 94 | 94 | ||
| 95 | _package_weights_ = {"pre":-2,"p":0,"alpha":-4,"beta":-3,"rc":-1} # dicts are unordered | ||
| 96 | _package_ends_ = ["pre", "p", "alpha", "beta", "rc", "cvs", "bk", "HEAD" ] # so we need ordered list | ||
| 97 | |||
| 98 | def relparse(myver): | ||
| 99 | """Parses the last elements of a version number into a triplet, that can | ||
| 100 | later be compared: | ||
| 101 | |||
| 102 | >>> relparse('1.2_pre3') | ||
| 103 | [1.2, -2, 3.0] | ||
| 104 | >>> relparse('1.2b') | ||
| 105 | [1.2, 98, 0] | ||
| 106 | >>> relparse('1.2') | ||
| 107 | [1.2, 0, 0] | ||
| 108 | """ | ||
| 109 | |||
| 110 | number = 0 | ||
| 111 | p1 = 0 | ||
| 112 | p2 = 0 | ||
| 113 | mynewver = myver.split('_') | ||
| 114 | if len(mynewver)==2: | ||
| 115 | # an _package_weights_ | ||
| 116 | number = float(mynewver[0]) | ||
| 117 | match = 0 | ||
| 118 | for x in _package_ends_: | ||
| 119 | elen = len(x) | ||
| 120 | if mynewver[1][:elen] == x: | ||
| 121 | match = 1 | ||
| 122 | p1 = _package_weights_[x] | ||
| 123 | try: | ||
| 124 | p2 = float(mynewver[1][elen:]) | ||
| 125 | except: | ||
| 126 | p2 = 0 | ||
| 127 | break | ||
| 128 | if not match: | ||
| 129 | # normal number or number with letter at end | ||
| 130 | divider = len(myver)-1 | ||
| 131 | if myver[divider:] not in "1234567890": | ||
| 132 | # letter at end | ||
| 133 | p1 = ord(myver[divider:]) | ||
| 134 | number = float(myver[0:divider]) | ||
| 135 | else: | ||
| 136 | number = float(myver) | ||
| 137 | else: | ||
| 138 | # normal number or number with letter at end | ||
| 139 | divider = len(myver)-1 | ||
| 140 | if myver[divider:] not in "1234567890": | ||
| 141 | #letter at end | ||
| 142 | p1 = ord(myver[divider:]) | ||
| 143 | number = float(myver[0:divider]) | ||
| 144 | else: | ||
| 145 | number = float(myver) | ||
| 146 | return [number,p1,p2] | ||
| 147 | |||
| 148 | __vercmp_cache__ = {} | ||
| 149 | |||
| 150 | def vercmp_string(val1,val2): | ||
| 151 | """This takes two version strings and returns an integer to tell you whether | ||
| 152 | the versions are the same, val1>val2 or val2>val1. | ||
| 153 | |||
| 154 | >>> vercmp('1', '2') | ||
| 155 | -1.0 | ||
| 156 | >>> vercmp('2', '1') | ||
| 157 | 1.0 | ||
| 158 | >>> vercmp('1', '1.0') | ||
| 159 | 0 | ||
| 160 | >>> vercmp('1', '1.1') | ||
| 161 | -1.0 | ||
| 162 | >>> vercmp('1.1', '1_p2') | ||
| 163 | 1.0 | ||
| 164 | """ | ||
| 165 | |||
| 166 | # quick short-circuit | ||
| 167 | if val1 == val2: | ||
| 168 | return 0 | ||
| 169 | valkey = val1+" "+val2 | ||
| 170 | |||
| 171 | # cache lookup | ||
| 172 | try: | ||
| 173 | return __vercmp_cache__[valkey] | ||
| 174 | try: | ||
| 175 | return - __vercmp_cache__[val2+" "+val1] | ||
| 176 | except KeyError: | ||
| 177 | pass | ||
| 178 | except KeyError: | ||
| 179 | pass | ||
| 180 | |||
| 181 | # consider 1_p2 vc 1.1 | ||
| 182 | # after expansion will become (1_p2,0) vc (1,1) | ||
| 183 | # then 1_p2 is compared with 1 before 0 is compared with 1 | ||
| 184 | # to solve the bug we need to convert it to (1,0_p2) | ||
| 185 | # by splitting _prepart part and adding it back _after_expansion | ||
| 186 | |||
| 187 | val1_prepart = val2_prepart = '' | ||
| 188 | if val1.count('_'): | ||
| 189 | val1, val1_prepart = val1.split('_', 1) | ||
| 190 | if val2.count('_'): | ||
| 191 | val2, val2_prepart = val2.split('_', 1) | ||
| 192 | |||
| 193 | # replace '-' by '.' | ||
| 194 | # FIXME: Is it needed? can val1/2 contain '-'? | ||
| 195 | |||
| 196 | val1 = string.split(val1,'-') | ||
| 197 | if len(val1) == 2: | ||
| 198 | val1[0] = val1[0] +"."+ val1[1] | ||
| 199 | val2 = string.split(val2,'-') | ||
| 200 | if len(val2) == 2: | ||
| 201 | val2[0] = val2[0] +"."+ val2[1] | ||
| 202 | |||
| 203 | val1 = string.split(val1[0],'.') | ||
| 204 | val2 = string.split(val2[0],'.') | ||
| 205 | |||
| 206 | # add back decimal point so that .03 does not become "3" ! | ||
| 207 | for x in range(1,len(val1)): | ||
| 208 | if val1[x][0] == '0' : | ||
| 209 | val1[x] = '.' + val1[x] | ||
| 210 | for x in range(1,len(val2)): | ||
| 211 | if val2[x][0] == '0' : | ||
| 212 | val2[x] = '.' + val2[x] | ||
| 213 | |||
| 214 | # extend varion numbers | ||
| 215 | if len(val2) < len(val1): | ||
| 216 | val2.extend(["0"]*(len(val1)-len(val2))) | ||
| 217 | elif len(val1) < len(val2): | ||
| 218 | val1.extend(["0"]*(len(val2)-len(val1))) | ||
| 219 | |||
| 220 | # add back _prepart tails | ||
| 221 | if val1_prepart: | ||
| 222 | val1[-1] += '_' + val1_prepart | ||
| 223 | if val2_prepart: | ||
| 224 | val2[-1] += '_' + val2_prepart | ||
| 225 | # The above code will extend version numbers out so they | ||
| 226 | # have the same number of digits. | ||
| 227 | for x in range(0,len(val1)): | ||
| 228 | cmp1 = relparse(val1[x]) | ||
| 229 | cmp2 = relparse(val2[x]) | ||
| 230 | for y in range(0,3): | ||
| 231 | myret = cmp1[y] - cmp2[y] | ||
| 232 | if myret != 0: | ||
| 233 | __vercmp_cache__[valkey] = myret | ||
| 234 | return myret | ||
| 235 | __vercmp_cache__[valkey] = 0 | ||
| 236 | return 0 | ||
| 237 | |||
| 95 | def explode_deps(s): | 238 | def explode_deps(s): |
| 96 | """ | 239 | """ |
| 97 | Take an RDEPENDS style string of format: | 240 | Take an RDEPENDS style string of format: |
