Merge "Add a new tool to help find the latest versions"
This commit is contained in:
commit
023daa574f
@ -9,3 +9,5 @@ GitPython>=1.0.1 # BSD License (3 clause)
|
||||
six>=1.9.0 # MIT
|
||||
oslo.config>=3.7.0 # Apache-2.0
|
||||
graphviz>=0.4.0 # MIT License
|
||||
beautifulsoup4 # MIT
|
||||
setuptools>=16.0 # PSF/ZPL
|
||||
|
129
tools/version_check.py
Executable file
129
tools/version_check.py
Executable file
@ -0,0 +1,129 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
import collections
|
||||
import re
|
||||
import sys
|
||||
|
||||
from bs4 import BeautifulSoup as bs
|
||||
from oslo_config import cfg
|
||||
import pkg_resources
|
||||
import requests
|
||||
|
||||
from kolla.common import config as common_config
|
||||
|
||||
|
||||
# Use an OrderedDict to ensure the results are displayed alphabetically
|
||||
MAJOR_VERSIONS_MAP = collections.OrderedDict([
|
||||
('ceilometer', 5),
|
||||
('cinder', 7),
|
||||
('designate', 1),
|
||||
('glance', 11),
|
||||
('gnocchi', 1),
|
||||
('heat', 5),
|
||||
('horizon', 8),
|
||||
('ironic', 4),
|
||||
('keystone', 8),
|
||||
('magnum', 1),
|
||||
('murano', 1),
|
||||
('neutron', 7),
|
||||
('nova', 12),
|
||||
('swift', 2),
|
||||
('zaqar', 1)
|
||||
])
|
||||
|
||||
TARBALLS_BASE_URL = 'http://tarballs.openstack.org'
|
||||
VERSIONS = dict()
|
||||
|
||||
|
||||
def retrieve_upstream_versions():
|
||||
upstream_versions = dict()
|
||||
for project in MAJOR_VERSIONS_MAP:
|
||||
winner = None
|
||||
series = MAJOR_VERSIONS_MAP[project]
|
||||
base = '{}/{}'.format(TARBALLS_BASE_URL, project)
|
||||
r = requests.get(base)
|
||||
s = bs(r.text, 'html.parser')
|
||||
|
||||
for link in s.find_all('a'):
|
||||
version = link.get('href')
|
||||
if (version.endswith('.tar.gz') and
|
||||
version.startswith('{}-{}'.format(project, series))):
|
||||
split = '{}-|.tar.gz'.format(project)
|
||||
candidate = re.split(split, version)[1]
|
||||
if not winner or more_recent(candidate, winner):
|
||||
winner = candidate
|
||||
|
||||
if not winner:
|
||||
print('Could not find version for {}'.format(project))
|
||||
continue
|
||||
|
||||
upstream_versions[project] = winner
|
||||
|
||||
VERSIONS['upstream'] = upstream_versions
|
||||
|
||||
|
||||
def retrieve_local_versions(conf):
|
||||
local_versions = dict()
|
||||
for project in MAJOR_VERSIONS_MAP:
|
||||
series = MAJOR_VERSIONS_MAP[project]
|
||||
for project_section in [match.group(0) for match in
|
||||
(re.search('^{}(?:-base)?$'.format(project),
|
||||
section) for section in
|
||||
conf._groups) if match]:
|
||||
archive = conf[project_section]['location'].split('/')[-1]
|
||||
if (archive.endswith('.tar.gz') and
|
||||
archive.startswith('{}-{}'.format(project, series))):
|
||||
split = '{}-|.tar.gz'.format(project)
|
||||
local_versions[project] = re.split(split, archive)[1]
|
||||
|
||||
VERSIONS['local'] = local_versions
|
||||
|
||||
|
||||
def more_recent(candidate, reference):
|
||||
return pkg_resources.parse_version(candidate) > \
|
||||
pkg_resources.parse_version(reference)
|
||||
|
||||
|
||||
def diff_link(project, old_ref, new_ref):
|
||||
return "https://github.com/openstack/{}/compare/{}...{}".format(
|
||||
project, old_ref, new_ref)
|
||||
|
||||
|
||||
def compare_versions():
|
||||
up_to_date = True
|
||||
for project in VERSIONS['upstream']:
|
||||
if project in VERSIONS['local']:
|
||||
upstream_version = VERSIONS['upstream'][project]
|
||||
local_version = VERSIONS['local'][project]
|
||||
if more_recent(upstream_version, local_version):
|
||||
print("{} has newer version {} > {}, see diff at {}".format(
|
||||
project, upstream_version, local_version,
|
||||
diff_link(project, local_version, upstream_version)))
|
||||
up_to_date = False
|
||||
if up_to_date:
|
||||
print("Everything is up to date")
|
||||
|
||||
|
||||
def main():
|
||||
conf = cfg.ConfigOpts()
|
||||
common_config.parse(conf, sys.argv[1:], prog='kolla-build')
|
||||
|
||||
retrieve_upstream_versions()
|
||||
retrieve_local_versions(conf)
|
||||
|
||||
compare_versions()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
Reference in New Issue
Block a user