From e5a1930dbcb7f78db37ebfb80d6e939f31ee1116 Mon Sep 17 00:00:00 2001 From: Lingchao Xin Date: Thu, 28 Nov 2013 18:04:00 +0800 Subject: [PATCH] Depend requests module, do NOT use temp file again Change-Id: Ibfd54595c0e337a37001e976524d646c5785de09 --- packaging/snapdiff.spec | 1 + setup.py | 2 +- snapdiff/repo.py | 66 +++++++++++++++++++++-------------------- 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/packaging/snapdiff.spec b/packaging/snapdiff.spec index b8825f2..93dffc5 100644 --- a/packaging/snapdiff.spec +++ b/packaging/snapdiff.spec @@ -15,6 +15,7 @@ Source: %{name}-%{version}.tar.gz BuildRequires: python-devel Requires: python >= 2.7 Requires: python-jinja2 +Requires: python-requests BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildArch: noarch %{!?python_sitelib: %define python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} diff --git a/setup.py b/setup.py index ef7d6ee..4ce3b72 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ setup(name = 'python-snapdiff', scripts = ['tools/repo-diff',], packages=['snapdiff',], include_package_data=True, - install_requires=['Jinja2>=2.6'], + install_requires=['Jinja2>=2.6', 'requests>=2.0.1'], zip_safe=False, ) diff --git a/snapdiff/repo.py b/snapdiff/repo.py index 1e53508..8e0a59f 100644 --- a/snapdiff/repo.py +++ b/snapdiff/repo.py @@ -4,9 +4,8 @@ from .render import output_html import gzip import json import os -import tempfile -import urllib2 -import xml.etree.cElementTree as ET +import requests +from StringIO import StringIO class RepoError(Exception): @@ -14,49 +13,47 @@ class RepoError(Exception): pass -def _get_primary_md(url, workspace, name): - """Get primary.xml.gz file from remote repodata directory""" - repomd_xml = _download(url + '/repodata/repomd.xml', workspace, name) - with open(repomd_xml, 'rb') as repomd: - data = xml2obj(repomd.read()) - for item in data['data']: - if item.type == 'primary': - href = item.location.href - if href: - return _download(url + href, workspace, - href.split('/')[-1]) - else: - raise RepoError('Repo primary metadata can\'t be found !') +def _get_primary_md(url): + """Return xxx-primary.xml.gz's content""" + repomd = _download(url + '/repodata/repomd.xml') + + if repomd is None: + raise RepoError('Get repo: {0} metadata failed ...'.format(url)) -def _download(url, workspace, name): - """Download needed xml file to local by given url""" - xs_file = os.path.join(workspace, name) + for item in xml2obj(repomd)['data']: + if item.type == 'primary': + href = item.location.href + if href: + return _download(url + href) - try: - rf = urllib2.urlopen(url) - except urllib2.HTTPError: - xs_file = None - else: - with open(xs_file, 'wb') as xs: - xs.write(rf.read()) + raise RepoError('Get repo: {0} primary metadata failed ...'.format(url)) - return xs_file +def _download(url): + """Return given url's content""" + response = requests.get(url) + + if response.status_code == 200: + if response.headers['content-type'] == 'application/x-gzip': + gzf = gzip.GzipFile(fileobj=StringIO(response.content)) + return gzf.read() + elif response.headers['content-type'] == 'text/xml': + return response.content class Repo(object): """Stuff packages' info""" def __init__(self, url): - workspace = tempfile.mkdtemp(dir='/var/tmp') - primary_md = _get_primary_md(url, workspace, 'repomd.xml') - self._et = xml2obj(gzip.open(primary_md)) + self._primary = xml2obj(_get_primary_md(url)) @property def packages(self): packages_info = {} - for _package in self._et.package: + + for _package in self._primary.package: packages_info[_package.name] = (packages_info.get(_package.name) \ or []) + [_package] + return packages_info def diff_to_JSON(old_url, new_url): @@ -136,7 +133,12 @@ def diff_to_JSON(old_url, new_url): def diff_to_HTML(old_url, new_url): """Output diffs' html format""" - data = json.loads(diff_to_JSON(old_url, new_url)) + json_obj = diff_to_JSON(old_url, new_url) + + if json_obj is None: + return + + data = json.loads(json_obj) context = {'old_url': old_url, 'new_url': new_url, -- 2.34.1