Merge "require final releases to match the previous release candidate"

This commit is contained in:
Zuul 2018-03-16 13:25:56 +00:00 committed by Gerrit Code Review
commit 62add1cefe
3 changed files with 246 additions and 0 deletions

View File

@ -209,6 +209,48 @@ def validate_series_first(deliv, context):
)
def validate_series_final(deliv, context):
"The final release after a RC should tag the same commit."
releases = deliv.releases
if len(releases) < 2:
# We only have to check this when the first release is being
# applied in the file.
print('this rule only applies to the final release in a series')
return
previous_release = releases[-2]
current_release = releases[-1]
if (current_release.is_release_candidate or
not previous_release.is_release_candidate):
print('this rule only applies when tagging a final from a candidate')
return
current_projects = sorted(releases[-1].projects)
previous_projects = sorted(previous_release.projects)
for c_proj, p_proj in zip(current_projects, previous_projects):
LOG.debug(
'comparing {}:{} with {}:{}'.format(
c_proj.repo.name, c_proj.hash,
p_proj.repo.name, p_proj.hash,
))
if c_proj.repo.name != p_proj.repo.name:
context.error(
'{} does not match {} so there is some missing info '
'in this release'.format(c_proj.repo.name, p_proj.repo.name)
)
elif c_proj.hash != p_proj.hash:
context.error(
'{} for {} is on {} but should be {} '
'to match version {}'.format(
current_release.version, c_proj.repo.name, c_proj.hash,
p_proj.hash, previous_release.version)
)
else:
print('OK')
def validate_bugtracker(deliv, context):
"Does the bug tracker info link to something that exists?"
lp_name = deliv.launchpad_id
@ -1382,6 +1424,7 @@ def main():
validate_new_releases,
validate_series_open,
validate_series_first,
validate_series_final,
validate_branch_prefixes,
validate_stable_branches,
validate_feature_branches,

View File

@ -280,6 +280,10 @@ class Release(object):
def diff_start(self):
return self._data.get('diff-start')
@property
def is_release_candidate(self):
return 'rc' in self.version
def __eq__(self, other):
return self.version == other.version

View File

@ -2434,6 +2434,205 @@ class TestValidateSeriesFirst(base.BaseTestCase):
self.assertEqual(0, len(self.ctx.errors))
class TestValidateSeriesFinal(base.BaseTestCase):
def setUp(self):
super().setUp()
self.tmpdir = self.useFixture(fixtures.TempDir()).path
self.ctx = validate.ValidationContext()
def test_no_releases(self):
deliverable_data = yamlutils.loads(textwrap.dedent('''
---
team: Release Management
'''))
deliv = deliverable.Deliverable(
None,
defaults.RELEASE,
'test',
deliverable_data,
)
validate.validate_series_final(
deliv,
self.ctx,
)
self.ctx.show_summary()
self.assertEqual(0, len(self.ctx.warnings))
self.assertEqual(0, len(self.ctx.errors))
def test_only_rc(self):
deliverable_data = yamlutils.loads(textwrap.dedent('''
---
team: Release Management
releases:
- version: 1.5.1.0rc1
projects:
- repo: openstack/automaton
hash: be2885f544637e6ee6139df7dc7bf937925804dd
'''))
deliv = deliverable.Deliverable(
None,
defaults.RELEASE,
'test',
deliverable_data,
)
validate.validate_series_final(
deliv,
self.ctx,
)
self.ctx.show_summary()
self.assertEqual(0, len(self.ctx.warnings))
self.assertEqual(0, len(self.ctx.errors))
def test_no_rc(self):
deliverable_data = yamlutils.loads(textwrap.dedent('''
---
team: Release Management
releases:
- version: 1.5.1
projects:
- repo: openstack/automaton
hash: be2885f544637e6ee6139df7dc7bf937925804dd
- version: 1.5.2
projects:
- repo: openstack/automaton
hash: ce2885f544637e6ee6139df7dc7bf937925804dd
'''))
deliv = deliverable.Deliverable(
None,
defaults.RELEASE,
'test',
deliverable_data,
)
validate.validate_series_final(
deliv,
self.ctx,
)
self.ctx.show_summary()
self.assertEqual(0, len(self.ctx.warnings))
self.assertEqual(0, len(self.ctx.errors))
def test_rc_with_final_match(self):
deliverable_data = yamlutils.loads(textwrap.dedent('''
---
team: Release Management
releases:
- version: 1.5.1.0rc1
projects:
- repo: openstack/automaton
hash: be2885f544637e6ee6139df7dc7bf937925804dd
- version: 1.5.1
projects:
- repo: openstack/automaton
hash: be2885f544637e6ee6139df7dc7bf937925804dd
'''))
deliv = deliverable.Deliverable(
None,
defaults.RELEASE,
'test',
deliverable_data,
)
validate.validate_series_final(
deliv,
self.ctx,
)
self.ctx.show_summary()
self.assertEqual(0, len(self.ctx.warnings))
self.assertEqual(0, len(self.ctx.errors))
def test_rc_with_final_mismatch(self):
deliverable_data = yamlutils.loads(textwrap.dedent('''
---
team: Release Management
releases:
- version: 1.5.1.0rc1
projects:
- repo: openstack/automaton
hash: be2885f544637e6ee6139df7dc7bf937925804dd
- version: 1.5.1
projects:
- repo: openstack/automaton
hash: ce2885f544637e6ee6139df7dc7bf937925804dd
'''))
deliv = deliverable.Deliverable(
None,
defaults.RELEASE,
'test',
deliverable_data,
)
validate.validate_series_final(
deliv,
self.ctx,
)
self.ctx.show_summary()
self.assertEqual(0, len(self.ctx.warnings))
self.assertEqual(1, len(self.ctx.errors))
def test_rc_with_final_mismatch_many_rcs(self):
deliverable_data = yamlutils.loads(textwrap.dedent('''
---
team: Release Management
releases:
- version: 1.5.1.0rc1
projects:
- repo: openstack/automaton
hash: be2885f544637e6ee6139df7dc7bf937925804dd
- version: 1.5.1.0rc2
projects:
- repo: openstack/automaton
hash: ce2885f544637e6ee6139df7dc7bf937925804dd
- version: 1.5.1
projects:
- repo: openstack/automaton
hash: de2885f544637e6ee6139df7dc7bf937925804dd
'''))
deliv = deliverable.Deliverable(
None,
defaults.RELEASE,
'test',
deliverable_data,
)
validate.validate_series_final(
deliv,
self.ctx,
)
self.ctx.show_summary()
self.assertEqual(0, len(self.ctx.warnings))
self.assertEqual(1, len(self.ctx.errors))
def test_match_wrong_rc(self):
deliverable_data = yamlutils.loads(textwrap.dedent('''
---
team: Release Management
releases:
- version: 1.5.1.0rc1
projects:
- repo: openstack/automaton
hash: be2885f544637e6ee6139df7dc7bf937925804dd
- version: 1.5.1.0rc2
projects:
- repo: openstack/automaton
hash: ce2885f544637e6ee6139df7dc7bf937925804dd
- version: 1.5.1
projects:
- repo: openstack/automaton
hash: be2885f544637e6ee6139df7dc7bf937925804dd
'''))
deliv = deliverable.Deliverable(
None,
defaults.RELEASE,
'test',
deliverable_data,
)
validate.validate_series_final(
deliv,
self.ctx,
)
self.ctx.show_summary()
self.assertEqual(0, len(self.ctx.warnings))
self.assertEqual(1, len(self.ctx.errors))
class TestValidateBranchPoints(base.BaseTestCase):
def setUp(self):