From 0621745589e674b79d3cb7d2957d89f81cd6e4a6 Mon Sep 17 00:00:00 2001 From: Lingchao Xin Date: Fri, 29 Nov 2013 17:19:58 +0800 Subject: [PATCH] Add local path support Now snapdiff supports a local repo parsing Change-Id: Ifde1bdc28f8c0ea6d30fc0a75ec4843ffbf6b66f --- snapdiff/repo.py | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/snapdiff/repo.py b/snapdiff/repo.py index 8e0a59f..6721a59 100644 --- a/snapdiff/repo.py +++ b/snapdiff/repo.py @@ -3,6 +3,7 @@ from .render import output_html import gzip import json +import mimetypes import os import requests from StringIO import StringIO @@ -24,20 +25,34 @@ def _get_primary_md(url): if item.type == 'primary': href = item.location.href if href: - return _download(url + href) + return _download(url + '/' + href) raise RepoError('Get repo: {0} primary metadata failed ...'.format(url)) 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 + # a very simple judgement :) + if url.startswith('http') or url.startswith('https'): + 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 + else: + # if url is a local path + _type = mimetypes.guess_type(url) + try: + if _type[0] == 'text/xml' and _type[1] == 'gzip': + with gzip.open(url) as gzf: + return gzf.read() + elif _type[0] == 'text/xml' and _type[1] is None: + with open(url, 'rb') as xml: + return xml.read() + except IOError, err: + print(err) class Repo(object): -- 2.34.1