diff --git a/openstack_releases/cmds/missing.py b/openstack_releases/cmds/missing.py index 03d1576794..ddaae168ff 100644 --- a/openstack_releases/cmds/missing.py +++ b/openstack_releases/cmds/missing.py @@ -29,6 +29,7 @@ from requests.packages import urllib3 from openstack_releases import defaults from openstack_releases import gitutils from openstack_releases import links +from openstack_releases import pythonutils from openstack_releases import yamlutils urllib3.disable_warnings() @@ -164,6 +165,19 @@ def main(): project) + '.asc', ) ) + + sdist_name = pythonutils.guess_sdist_name(project) + pypi_info = pythonutils.get_pypi_info(sdist_name) + if release['version'] not in pypi_info.get('releases', {}): + msg = ('{} dist with version {} ' + 'not uploaded to PyPI').format( + sdist_name, release['version']) + print(' {}'.format(msg)) + errors.append(msg) + else: + print(' found version {} on PyPI'.format( + release['version'])) + print() if errors: diff --git a/openstack_releases/pythonutils.py b/openstack_releases/pythonutils.py index 4f5666ae65..162c9756d4 100644 --- a/openstack_releases/pythonutils.py +++ b/openstack_releases/pythonutils.py @@ -12,10 +12,15 @@ # License for the specific language governing permissions and limitations # under the License. +import logging import os import os.path import subprocess +import requests + +LOG = logging.getLogger(__name__) + def get_sdist_name(workdir, repo): "Check out the code." @@ -46,3 +51,18 @@ def get_sdist_name(workdir, repo): print('Results: %s' % (out,)) name = out.splitlines()[-1].strip() return name + + +def guess_sdist_name(project): + "Guess the name without checking out the repo." + repo_base = project['repo'].rsplit('/')[-1] + base = project.get('tarball-base', repo_base) + return base + + +def get_pypi_info(dist_name): + "Return PyPI information for the distribution." + LOG.debug('looking at PyPI for {}'.format(dist_name)) + url = 'https://pypi.python.org/pypi/{}/json'.format(dist_name) + LOG.debug(url) + return requests.get(url).json()