require new releases in a series to include a minor version bump

ceilometermiddleware 1.0.1 was released from master as part of the pike
series. It should have either been 1.1.0 or on the stable/ocata
branch. This extra validation should avoid a similar mistake in the
future.

Change-Id: I044bf288a659ce144ed3d7896e9057cc361a2cf3
Signed-off-by: Doug Hellmann <doug@doughellmann.com>
This commit is contained in:
Doug Hellmann
2017-03-15 14:10:17 -04:00
parent 2bf0b33a38
commit 7f9cfba013
2 changed files with 143 additions and 0 deletions

View File

@@ -120,6 +120,28 @@ def validate_series_open(deliverable_info,
expected_branch, previous_deliverable_file, series_name))
def validate_series_first(deliverable_info, series_name,
mk_warning, mk_error):
"The first release in a series needs to end with '.0'."
# When the releases entry is present but empty, it's value may not
# be a list, so we default to a list using 'or'.
releases = deliverable_info.get('releases') or []
if len(releases) != 1:
# We only have to check this when the first release is being
# applied in the file.
return
if series_name == '_independent':
# These rules don't apply to independent projects.
return
versionstr = releases[0]['version']
patchlevel = versionstr.rpartition('.')[-1]
if patchlevel != '0':
mk_error(
'Initial releases in a series must increment at '
'least the minor version. %r' % (versionstr,)
)
def validate_launchpad(deliverable_info, mk_warning, mk_error):
"Look for the launchpad project"
try:
@@ -696,6 +718,12 @@ def main():
mk_warning,
mk_error,
)
validate_series_first(
deliverable_info,
series_name,
mk_warning,
mk_error,
)
validate_branch_prefixes(
deliverable_info,
mk_warning,

View File

@@ -1506,3 +1506,118 @@ class TestValidateSeriesOpen(base.BaseTestCase):
print(warnings, errors)
self.assertEqual(1, len(warnings))
self.assertEqual(0, len(errors))
class TestValidateSeriesFirst(base.BaseTestCase):
def setUp(self):
super(TestValidateSeriesFirst, self).setUp()
self.tmpdir = self.useFixture(fixtures.TempDir()).path
def test_version_ok(self):
series_a_dir = self.tmpdir + '/a'
series_a_filename = series_a_dir + '/automaton.yaml'
os.makedirs(series_a_dir)
deliverable_data = textwrap.dedent('''
---
releases:
- version: 1.5.0
projects:
- repo: openstack/automaton
hash: be2885f544637e6ee6139df7dc7bf937925804dd
''')
with open(series_a_filename, 'w') as f:
f.write(deliverable_data)
warnings = []
errors = []
deliverable_info = yaml.safe_load(deliverable_data)
validate.validate_series_first(
deliverable_info,
'a',
warnings.append,
errors.append,
)
print(warnings, errors)
self.assertEqual(0, len(warnings))
self.assertEqual(0, len(errors))
def test_ignore_if_second_release(self):
series_a_dir = self.tmpdir + '/a'
series_a_filename = series_a_dir + '/automaton.yaml'
os.makedirs(series_a_dir)
deliverable_data = textwrap.dedent('''
---
releases:
- version: 1.5.1
projects:
- repo: openstack/automaton
hash: be2885f544637e6ee6139df7dc7bf937925804dd
- version: 1.5.2
projects:
- repo: openstack/automaton
hash: be2885f544637e6ee6139df7dc7bf937925804dd
''')
with open(series_a_filename, 'w') as f:
f.write(deliverable_data)
warnings = []
errors = []
deliverable_info = yaml.safe_load(deliverable_data)
validate.validate_series_first(
deliverable_info,
'a',
warnings.append,
errors.append,
)
print(warnings, errors)
self.assertEqual(0, len(warnings))
self.assertEqual(0, len(errors))
def test_ignore_if_no_releases(self):
series_a_dir = self.tmpdir + '/a'
series_a_filename = series_a_dir + '/automaton.yaml'
os.makedirs(series_a_dir)
deliverable_data = textwrap.dedent('''
---
releases:
''')
with open(series_a_filename, 'w') as f:
f.write(deliverable_data)
warnings = []
errors = []
deliverable_info = yaml.safe_load(deliverable_data)
validate.validate_series_first(
deliverable_info,
'a',
warnings.append,
errors.append,
)
print(warnings, errors)
self.assertEqual(0, len(warnings))
self.assertEqual(0, len(errors))
def test_version_bad(self):
series_a_dir = self.tmpdir + '/a'
series_a_filename = series_a_dir + '/automaton.yaml'
os.makedirs(series_a_dir)
deliverable_data = textwrap.dedent('''
---
releases:
- version: 1.5.1
projects:
- repo: openstack/automaton
hash: be2885f544637e6ee6139df7dc7bf937925804dd
''')
with open(series_a_filename, 'w') as f:
f.write(deliverable_data)
warnings = []
errors = []
deliverable_info = yaml.safe_load(deliverable_data)
validate.validate_series_first(
deliverable_info,
'a',
warnings.append,
errors.append,
)
print(warnings, errors)
self.assertEqual(0, len(warnings))
self.assertEqual(1, len(errors))