summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Collins <rbtcollins@hp.com>2014-08-26 15:46:16 +1200
committerlifeless <robertc@robertcollins.net>2014-08-26 23:39:15 +0000
commit85ba9600b2009f47552ce35a7e7de02cda0c179e (patch)
tree9eb584817f6879c43919203f211e0191b48e6589
parent81c200088198fb9c73e32bae23e021b7c27016aa (diff)
downloadpbr-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.py31
-rw-r--r--pbr/version.py16
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(