new_release: work from a release history object
The calculation of the last release was working from release information from targeted series, and used specific code to retrieve the data from the previous series if that failed. In preparation for landing code to look further backwards in history, refactor that code to retrieve and work from a release history object containing list of releases for each considered series. To preserve current behavior, for the moment, we only retrieve history for the targeted series and the series before that. This allows to get rid of mocks in get_last_release() tests and simplify testing from a history of releases. Change-Id: I48ff9c46c1e9250fbdfc5dd5344f18c7e046735a
This commit is contained in:
parent
30c6258ab4
commit
e7ac6d6ab8
@ -98,21 +98,38 @@ def get_last_series_info(series, deliverable):
|
||||
'Could not determine previous version: %s' % (e,))
|
||||
|
||||
|
||||
def get_last_release(deliverable_info, series, deliverable, release_type):
|
||||
try:
|
||||
last_release = deliverable_info['releases'][-1]
|
||||
except (KeyError, IndexError):
|
||||
print('No releases for %s in %s, yet.' % (
|
||||
deliverable, series))
|
||||
if release_type == 'bugfix':
|
||||
def get_release_history(series, deliverable):
|
||||
"""Retrieve the history of releases for a given deliverable.
|
||||
Returns an array of arrays containing the releases for each series,
|
||||
in reverse chronological order starting from specified series.
|
||||
"""
|
||||
all_series = sorted(os.listdir('deliverables'), reverse=True)
|
||||
series_index = all_series.index(series)
|
||||
release_history = []
|
||||
# Only consider current & previous series, to preserve current behavior
|
||||
for current_series in all_series[series_index:series_index + 1]:
|
||||
try:
|
||||
deliv_info = get_deliverable_data(current_series, deliverable)
|
||||
releases = deliv_info['releases']
|
||||
except (IOError, OSError, KeyError):
|
||||
print('No releases for %s in %s, yet.' % (
|
||||
deliverable, series))
|
||||
releases = []
|
||||
release_history.append(releases)
|
||||
return release_history
|
||||
|
||||
|
||||
def get_last_release(release_history, deliverable, release_type):
|
||||
for releases in release_history:
|
||||
if releases:
|
||||
return releases[-1]
|
||||
elif release_type == 'bugfix':
|
||||
raise RuntimeError(
|
||||
'The first release for a series must '
|
||||
'be at least a feature release to allow '
|
||||
'for stable releases from the previous series.')
|
||||
# Look for the version of the previous series.
|
||||
prev_info = get_last_series_info(series, deliverable)
|
||||
last_release = prev_info['releases'][-1]
|
||||
return last_release
|
||||
|
||||
raise RuntimeError('No previous version could be found')
|
||||
|
||||
|
||||
def main():
|
||||
@ -181,9 +198,9 @@ def main():
|
||||
parser.error(e)
|
||||
|
||||
try:
|
||||
release_history = get_release_history(series, args.deliverable)
|
||||
last_release = get_last_release(
|
||||
deliverable_info,
|
||||
series,
|
||||
release_history,
|
||||
args.deliverable,
|
||||
args.release_type,
|
||||
)
|
||||
|
@ -18,8 +18,6 @@ from oslotest import base
|
||||
|
||||
from openstack_releases.cmds import new_release
|
||||
|
||||
import fixtures
|
||||
|
||||
|
||||
class TestIncrementVersion(base.BaseTestCase):
|
||||
|
||||
@ -120,128 +118,94 @@ class TestIncrementMilestoneVersion(base.BaseTestCase):
|
||||
class TestGetLastRelease(base.BaseTestCase):
|
||||
|
||||
def test_existing_releases(self):
|
||||
deliverable_info = {
|
||||
'releases': [
|
||||
release_history = [
|
||||
[
|
||||
{'version': '1.0.0'},
|
||||
],
|
||||
}
|
||||
]
|
||||
self.assertEqual(
|
||||
{'version': '1.0.0'},
|
||||
new_release.get_last_release(
|
||||
deliverable_info,
|
||||
'anyseries',
|
||||
release_history,
|
||||
'anydeliverable',
|
||||
'bugfix',
|
||||
)
|
||||
)
|
||||
|
||||
def test_existing_releases2(self):
|
||||
deliverable_info = {
|
||||
'releases': [
|
||||
release_history = [
|
||||
[
|
||||
{'version': '1.0.0'},
|
||||
{'version': '1.0.1'},
|
||||
],
|
||||
}
|
||||
]
|
||||
self.assertEqual(
|
||||
{'version': '1.0.1'},
|
||||
new_release.get_last_release(
|
||||
deliverable_info,
|
||||
'anyseries',
|
||||
release_history,
|
||||
'anydeliverable',
|
||||
'bugfix',
|
||||
)
|
||||
)
|
||||
|
||||
def test_first_bugfix_is_error(self):
|
||||
deliverable_info = {
|
||||
'releases': [],
|
||||
}
|
||||
self.assertRaises(
|
||||
RuntimeError,
|
||||
new_release.get_last_release,
|
||||
deliverable_info,
|
||||
'anyseries',
|
||||
'anydeliverable',
|
||||
'bugfix',
|
||||
)
|
||||
|
||||
|
||||
class TestGetLastReleaseFirstInSeries(base.BaseTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestGetLastReleaseFirstInSeries, self).setUp()
|
||||
# Avoid scanning the filesystem to find the release series.
|
||||
listdir = self.useFixture(fixtures.MockPatch('os.listdir')).mock
|
||||
listdir.return_value = [
|
||||
'olderseries',
|
||||
'anyseries',
|
||||
'newerseries',
|
||||
]
|
||||
# When we look for the previous series data, return a valid
|
||||
# set of info.
|
||||
gdd = self.useFixture(
|
||||
fixtures.MockPatchObject(new_release, 'get_deliverable_data')
|
||||
).mock
|
||||
gdd.return_value = {
|
||||
'releases': [
|
||||
release_history = [
|
||||
[],
|
||||
[
|
||||
{'version': '1.0.0'},
|
||||
{'version': '1.0.1'},
|
||||
],
|
||||
}
|
||||
|
||||
def test_empty_release_list(self):
|
||||
deliverable_info = {
|
||||
'releases': [],
|
||||
}
|
||||
self.assertEqual(
|
||||
{'version': '1.0.1'},
|
||||
new_release.get_last_release(
|
||||
deliverable_info,
|
||||
'anyseries',
|
||||
'anydeliverable',
|
||||
'feature',
|
||||
)
|
||||
)
|
||||
|
||||
def test_first_in_series_keyerror(self):
|
||||
deliverable_info = {
|
||||
}
|
||||
self.assertEqual(
|
||||
{'version': '1.0.1'},
|
||||
new_release.get_last_release(
|
||||
deliverable_info,
|
||||
'anyseries',
|
||||
'anydeliverable',
|
||||
'feature',
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
class TestGetLastReleaseFirstEver(base.BaseTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestGetLastReleaseFirstEver, self).setUp()
|
||||
# Avoid scanning the filesystem to find the release series.
|
||||
listdir = self.useFixture(fixtures.MockPatch('os.listdir')).mock
|
||||
listdir.return_value = [
|
||||
'olderseries',
|
||||
'anyseries',
|
||||
'newerseries',
|
||||
]
|
||||
# When we look for the previous series data, return no
|
||||
# information.
|
||||
gdd = self.useFixture(
|
||||
fixtures.MockPatchObject(new_release, 'get_deliverable_data')
|
||||
).mock
|
||||
gdd.side_effect = IOError('test error')
|
||||
|
||||
def test_no_previous_release(self):
|
||||
deliverable_info = {
|
||||
}
|
||||
self.assertRaises(
|
||||
RuntimeError,
|
||||
new_release.get_last_release,
|
||||
deliverable_info,
|
||||
'anyseries',
|
||||
release_history,
|
||||
'anydeliverable',
|
||||
'bugfix',
|
||||
)
|
||||
|
||||
def test_empty_release_list(self):
|
||||
release_history = [
|
||||
[],
|
||||
[
|
||||
{'version': '1.0.0'},
|
||||
{'version': '1.0.1'},
|
||||
],
|
||||
]
|
||||
self.assertEqual(
|
||||
{'version': '1.0.1'},
|
||||
new_release.get_last_release(
|
||||
release_history,
|
||||
'anydeliverable',
|
||||
'feature',
|
||||
)
|
||||
)
|
||||
|
||||
def test_no_previous_release(self):
|
||||
release_history = [
|
||||
[],
|
||||
[],
|
||||
]
|
||||
self.assertRaises(
|
||||
RuntimeError,
|
||||
new_release.get_last_release,
|
||||
release_history,
|
||||
'anydeliverable',
|
||||
'bugfix',
|
||||
)
|
||||
|
||||
def test_last_release_in_older_series(self):
|
||||
release_history = [
|
||||
[],
|
||||
[],
|
||||
[
|
||||
{'version': '1.0.0'},
|
||||
],
|
||||
]
|
||||
self.assertRaises(
|
||||
RuntimeError,
|
||||
new_release.get_last_release,
|
||||
release_history,
|
||||
'anydeliverable',
|
||||
'bugfix',
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user