diff options
author | Robert Collins <rbtcollins@hp.com> | 2014-08-26 15:46:16 +1200 |
---|---|---|
committer | lifeless <robertc@robertcollins.net> | 2014-08-26 23:39:15 +0000 |
commit | 85ba9600b2009f47552ce35a7e7de02cda0c179e (patch) | |
tree | 9eb584817f6879c43919203f211e0191b48e6589 | |
parent | 81c200088198fb9c73e32bae23e021b7c27016aa (diff) | |
download | pbr-85ba9600b2009f47552ce35a7e7de02cda0c179e.tar.gz |
Handle more legacy version numbers
We were not handling 1.2.1a1 or 2.1.0.rc1.
Change-Id: I087ff6f0449d528ee86b8e16721d12fd9b231846
Closes-Bug: #1361251
-rw-r--r-- | pbr/tests/test_version.py | 31 | ||||
-rw-r--r-- | pbr/version.py | 16 |
2 files changed, 45 insertions, 2 deletions
diff --git a/pbr/tests/test_version.py b/pbr/tests/test_version.py index 2a1143a..e55b81d 100644 --- a/pbr/tests/test_version.py +++ b/pbr/tests/test_version.py @@ -107,6 +107,31 @@ class TestSemanticVersion(base.BaseTestCase): parsed = from_pip_string('1.2.0rc1') self.assertEqual(expected, parsed) + def test_from_pip_string_legacy_nonzero_lead_in(self): + # reported in bug 1361251 + expected = version.SemanticVersion( + 0, 0, 1, prerelease_type='a', prerelease=2) + parsed = from_pip_string('0.0.1a2') + self.assertEqual(expected, parsed) + + def test_from_pip_string_legacy_short_nonzero_lead_in(self): + expected = version.SemanticVersion( + 0, 1, 0, prerelease_type='a', prerelease=2) + parsed = from_pip_string('0.1a2') + self.assertEqual(expected, parsed) + + def test_from_pip_string_legacy_no_0_prerelease(self): + expected = version.SemanticVersion( + 2, 1, 0, prerelease_type='rc', prerelease=1) + parsed = from_pip_string('2.1.0.rc1') + self.assertEqual(expected, parsed) + + def test_from_pip_string_legacy_no_0_prerelease_2(self): + expected = version.SemanticVersion( + 2, 0, 0, prerelease_type='rc', prerelease=1) + parsed = from_pip_string('2.0.0.rc1') + self.assertEqual(expected, parsed) + def test_from_pip_string_legacy_non_440_beta(self): expected = version.SemanticVersion( 2014, 2, prerelease_type='b', prerelease=2) @@ -153,6 +178,12 @@ class TestSemanticVersion(base.BaseTestCase): self.assertEqual("1.2.3", semver.rpm_string()) self.assertEqual(semver, from_pip_string("1.2.3")) + def test_parsing_short_forms(self): + semver = version.SemanticVersion(1, 0, 0) + self.assertEqual(semver, from_pip_string("1")) + self.assertEqual(semver, from_pip_string("1.0")) + self.assertEqual(semver, from_pip_string("1.0.0")) + def test_dev_version(self): semver = version.SemanticVersion(1, 2, 4, dev_count=5, githash='12') self.assertEqual((1, 2, 4, 'dev', 4), semver.version_tuple()) diff --git a/pbr/version.py b/pbr/version.py index 748364f..dc88500 100644 --- a/pbr/version.py +++ b/pbr/version.py @@ -169,6 +169,16 @@ class SemanticVersion(object): if digit_len == 0: raise ValueError("Invalid version %r" % version_string) elif digit_len < 3: + if (digit_len < len(input_components) and + input_components[digit_len][0].isdigit()): + # Handle X.YaZ - Y is a digit not a leadin to pre-release. + mixed_component = input_components[digit_len] + last_component = ''.join(itertools.takewhile( + lambda x: x.isdigit(), mixed_component)) + components.append(last_component) + input_components[digit_len:digit_len + 1] = [ + last_component, mixed_component[len(last_component):]] + digit_len += 1 components.extend([0] * (3 - digit_len)) components.extend(input_components[digit_len:]) major = int(components[0]) @@ -205,7 +215,7 @@ class SemanticVersion(object): dev_count = int(remainder[0]) else: if remainder and (remainder[0][0] == '0' or - remainder[0][0] in ('a', 'b', 'rc')): + remainder[0][0] in ('a', 'b', 'r')): # Current RC/beta layout prerelease_type, prerelease = _parse_type(remainder[0]) remainder = remainder[1:] @@ -218,7 +228,9 @@ class SemanticVersion(object): dev_count = 1 githash = component[1:] else: - raise ValueError('Unknown remainder %r' % (remainder,)) + raise ValueError( + 'Unknown remainder %r in %r' + % (remainder, version_string)) if len(remainder) > 1: githash = remainder[1][1:] return SemanticVersion( |