modernize propose-final-releases command
We never updated the implementation of this command when release model tags were moved into the releases repository. This patch uses the deliverable search code to create Deliverable objects, then uses the model information from those objects instead of looking at the governance data. Two new properties are added to the Deliverable class to facilitate writing the updates to the existing files. At the same time the verbose output content is made more detailed. Change-Id: I807ee48244c3f6b2a33a918668620ab2a82c3674 Signed-off-by: Doug Hellmann <doug@doughellmann.com>
This commit is contained in:
@@ -16,15 +16,14 @@ from __future__ import print_function
|
|||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import atexit
|
import atexit
|
||||||
import glob
|
|
||||||
import os.path
|
import os.path
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
import openstack_releases
|
import openstack_releases
|
||||||
|
from openstack_releases import deliverable
|
||||||
from openstack_releases import gitutils
|
from openstack_releases import gitutils
|
||||||
from openstack_releases import governance
|
|
||||||
from openstack_releases import yamlutils
|
from openstack_releases import yamlutils
|
||||||
|
|
||||||
PRE_RELEASE = re.compile('(a|b|rc)')
|
PRE_RELEASE = re.compile('(a|b|rc)')
|
||||||
@@ -111,17 +110,6 @@ def main():
|
|||||||
|
|
||||||
deliverables_dir = args.deliverables_dir
|
deliverables_dir = args.deliverables_dir
|
||||||
|
|
||||||
team_data = governance.get_team_data()
|
|
||||||
teams = [
|
|
||||||
governance.Team(n, i)
|
|
||||||
for n, i in team_data.items()
|
|
||||||
]
|
|
||||||
deliverables = {
|
|
||||||
d.name: d
|
|
||||||
for t in teams
|
|
||||||
for d in t.deliverables.values()
|
|
||||||
}
|
|
||||||
|
|
||||||
workdir = tempfile.mkdtemp(prefix='releases-')
|
workdir = tempfile.mkdtemp(prefix='releases-')
|
||||||
print('creating temporary files in %s' % workdir)
|
print('creating temporary files in %s' % workdir)
|
||||||
|
|
||||||
@@ -135,53 +123,60 @@ def main():
|
|||||||
print('not cleaning up %s' % workdir)
|
print('not cleaning up %s' % workdir)
|
||||||
atexit.register(cleanup_workdir)
|
atexit.register(cleanup_workdir)
|
||||||
|
|
||||||
pattern = os.path.join(deliverables_dir,
|
verbose('Scanning {}/{}'.format(deliverables_dir, args.series))
|
||||||
args.series, '*.yaml')
|
all_deliv = deliverable.Deliverables(
|
||||||
verbose('Scanning {}'.format(pattern))
|
root_dir=args.deliverables_dir,
|
||||||
deliverable_files = sorted(glob.glob(pattern))
|
collapse_history=False,
|
||||||
|
)
|
||||||
|
|
||||||
for filename in deliverable_files:
|
for entry in all_deliv.get_deliverables(None, args.series):
|
||||||
verbose('\n{}'.format(filename))
|
deliv = deliverable.Deliverable(*entry)
|
||||||
deliverable_name = os.path.basename(filename)[:-5]
|
verbose('\n{} {}'.format(deliv.name, deliv.model))
|
||||||
with open(filename, 'r', encoding='utf-8') as f:
|
|
||||||
deliverable_data = yamlutils.loads(f.read())
|
if deliv.model == 'cycle-trailing':
|
||||||
releases = deliverable_data.get('releases')
|
verbose('# {} is a cycle-trailing project'.format(
|
||||||
if not releases:
|
deliv.name))
|
||||||
|
if not args.all:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if not deliv.releases:
|
||||||
verbose('# no releases')
|
verbose('# no releases')
|
||||||
continue
|
continue
|
||||||
latest_release = releases[-1]
|
|
||||||
|
latest_release = deliv.releases[-1]
|
||||||
projects = latest_release.get('projects')
|
projects = latest_release.get('projects')
|
||||||
if not projects:
|
if not projects:
|
||||||
verbose('# no projects')
|
verbose('# no projects in latest release')
|
||||||
continue
|
continue
|
||||||
for pre_rel in ['a', 'b', 'rc']:
|
for pre_rel in ['a', 'b', 'rc']:
|
||||||
if pre_rel in str(latest_release['version']):
|
if pre_rel in str(latest_release['version']):
|
||||||
break
|
break
|
||||||
else: # we did not find any pre_rel
|
else: # we did not find any pre_rel
|
||||||
verbose('# not a release candidate')
|
verbose('# {} was not a release candidate'.format(
|
||||||
|
latest_release['version']))
|
||||||
continue
|
continue
|
||||||
deliverable = deliverables.get(deliverable_name)
|
|
||||||
if deliverable and 'release:cycle-trailing' in deliverable.tags:
|
|
||||||
verbose('# {} is a cycle-trailing project'.format(deliverable_name))
|
|
||||||
if not args.all:
|
|
||||||
continue
|
|
||||||
# The new version is the same as the latest release version
|
# The new version is the same as the latest release version
|
||||||
# without the pre-release component at the end. Make sure it
|
# without the pre-release component at the end. Make sure it
|
||||||
# has 3 sets of digits.
|
# has 3 sets of digits.
|
||||||
new_version = '.'.join(
|
new_version = '.'.join(
|
||||||
(latest_release['version'].split('.')[:-1] + ['0'])[:3]
|
(latest_release['version'].split('.')[:-1] + ['0'])[:3]
|
||||||
)
|
)
|
||||||
|
|
||||||
branch = 'stable/{}'.format(args.prior_series)
|
branch = 'stable/{}'.format(args.prior_series)
|
||||||
diff_start = get_prior_branch_point(
|
diff_start = get_prior_branch_point(
|
||||||
workdir, projects[0]['repo'], branch,
|
workdir, projects[0]['repo'], branch,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
deliverable_data = deliv.data
|
||||||
deliverable_data['releases'].append({
|
deliverable_data['releases'].append({
|
||||||
'version': new_version,
|
'version': new_version,
|
||||||
'diff_start': diff_start,
|
'diff_start': diff_start,
|
||||||
'projects': latest_release['projects'],
|
'projects': latest_release['projects'],
|
||||||
})
|
})
|
||||||
print('new version for {}: {}'.format(os.path.basename(filename),
|
print('new version for {}: {}'.format(
|
||||||
new_version))
|
deliv.name, new_version))
|
||||||
|
|
||||||
|
filename = os.path.join(deliverables_dir, deliv.filename)
|
||||||
with open(filename, 'w', encoding='utf-8') as f:
|
with open(filename, 'w', encoding='utf-8') as f:
|
||||||
f.write(yamlutils.dumps(deliverable_data))
|
f.write(yamlutils.dumps(deliverable_data))
|
||||||
|
@@ -18,6 +18,7 @@ import collections
|
|||||||
import copy
|
import copy
|
||||||
import glob
|
import glob
|
||||||
import os
|
import os
|
||||||
|
import os.path
|
||||||
|
|
||||||
import pbr.version
|
import pbr.version
|
||||||
|
|
||||||
@@ -263,3 +264,11 @@ class Deliverable(object):
|
|||||||
def tags(self):
|
def tags(self):
|
||||||
return governance.get_tags_for_deliverable(
|
return governance.get_tags_for_deliverable(
|
||||||
self._governance_data, self.team, self.name)
|
self._governance_data, self.team, self.name)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def filename(self):
|
||||||
|
return os.path.join(self.series, self.name + '.yaml')
|
||||||
|
|
||||||
|
@property
|
||||||
|
def data(self):
|
||||||
|
return copy.deepcopy(self._data)
|
||||||
|
Reference in New Issue
Block a user