Integrate repo and image diff
authorLingchao Xin <lingchaox.xin@intel.com>
Fri, 6 Dec 2013 08:56:15 +0000 (16:56 +0800)
committerLingchao Xin <lingchaox.xin@intel.com>
Mon, 9 Dec 2013 03:33:26 +0000 (11:33 +0800)
From now, you can invoke unified API to diff repo and image.

Fixes: #1523
Change-Id: I1324d23f012873fb3bb9cbdc1c4c135877affd4b

setup.py
snapdiff/__init__.py
snapdiff/repo.py
tools/repo-diff [deleted file]
tools/snap-diff [new file with mode: 0755]

index b2b682db9c4083db44fb73bf1236b3ea4e7b9394..294b0db318d7fddf4e3850063ac08c5cbc127f93 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -13,7 +13,7 @@ setup(name=snapdiff.__title__,
       author='Lingchao Xin',
       author_email='lingchaox.xin@intel.com',
       url='http://www.tizen.org/',
-      scripts=['tools/repo-diff',],
+      scripts=['tools/snap-diff',],
       packages=['snapdiff',],
       include_package_data=True,
       install_requires=['Jinja2>=2.6', 'requests>=2.0.1',
index 9e206795fa74f83cad205c13d558fed20896ec4e..e94c5288c2470b1524193e052b12a95648de21a9 100644 (file)
 Snapdiff is used to generate image and repo diffs. You can use it as a module:
 
    >>> import snapdiff
-   >>> snapdiff.diff_to_JSON('old url', 'new url')
-   >>> snapdiff.diff_to_HTML('old url', 'new url')
+   >>> snapdiff.diff_to_JSON('old url', 'new url', style='repo')
+   >>> snapdiff.diff_to_HTML('old url', 'new url', style='image')
 
 or use it directly:
-   repo-diff [old url] [new url]
-   ...
+    snap-diff [-h] [--json] [-t] old new
+
+    Diff two repos with different urls
+
+    positional arguments:
+      old         old repo
+      new         new repo
+
+    optional arguments:
+      -h, --help  show this help message and exit
+      --json      output json diffs
+      -t          which diff you want(repo | image, default is repo)
+      ...
 
 """
 
 __title__ = 'python-snapdiff'
 __version__ = '0.1'
 
-from .repo import *
-from .image import *
+from .render import output_html
+from .repo import Repo
+from .image import ks_diff, packages
+
+import json
+
+def diff_to_JSON(old_url, new_url, style='repo'):
+    """Output diffs' json format"""
+
+    if not old_url or not new_url:
+        return
+
+    if style == 'repo':
+        old, new = Repo(old_url).packages, Repo(new_url).packages
+    elif style == 'image':
+        old, new = packages(old_url), packages(new_url)
+    else:
+        return
+
+    added, removed, modified, rebuilded = [], [], [], []
+    package_names = set(old.keys() + new.keys())
+
+    def _pair_old_new():
+        for name in package_names:
+            if old.get(name) is None:
+                for pkg in new[name]:
+                    yield (None, pkg)
+            elif new.get(name) is None:
+                for pkg in old[name]:
+                    yield (pkg, None)
+            else:
+                for old_pkg in old[name]:
+                    for new_pkg in new[name]:
+                        if old_pkg.version.ver == new_pkg.version.ver:
+                            yield (old_pkg, new_pkg)
+                            old[name].remove(old_pkg)
+                            new[name].remove(new_pkg)
+                for pair in map(None, old[name], new[name]):
+                    yield pair
+    for old_pkg, new_pkg in _pair_old_new():
+        if old_pkg is None:
+            added.append(new_pkg)
+        elif new_pkg is None:
+            removed.append(old_pkg)
+        elif old_pkg.version.vcs != new_pkg.version.vcs or \
+                old_pkg.version.ver != new_pkg.version.ver:
+            modified.append((old_pkg, new_pkg))
+        elif old_pkg.version.rel != new_pkg.version.rel:
+            rebuilded.append((old_pkg, new_pkg))
+
+    obj = {style: {'old': old_url, 'new': new_url},
+            'diff': {
+                'added': [{'oldpkg': None, 'newpkg': {'name': _new.name, \
+                        'version': {'epoch': _new.version.epoch, \
+                        'rel': _new.version.rel, 'ver': _new.version.ver}, \
+                        'vcs': _new.version.vcs}, 'codediff': None} \
+                        for _new in added],
+                'removed': [{'oldpkg': {'name': _old.name, \
+                        'version': {'epoch': _old.version.epoch, \
+                        'rel': _old.version.rel, 'ver': _old.version.ver}, \
+                        'vcs': _old.version.vcs}, 'newpkg': None, \
+                        'codediff': None} for _old in added],
+                'modified': [{'oldpkg': {'name': _old.name, \
+                        'version': {'epoch': _old.version.epoch, \
+                        'rel': _old.version.rel, 'ver': _old.version.ver}, \
+                        'vcs': _old.version.vcs}, \
+                        'newpkg': {'name': _new.name, \
+                        'version': {'epoch': _new.version.epoch, \
+                        'rel': _new.version.rel, 'ver': _new.version.ver},
+                            'vcs': _new.version.vcs}, 'codediff': None} \
+                                    for _old, _new in modified],
+                 'rebuilded': [{'oldpkg': {'name': _old.name, \
+                        'version': {'epoch': _old.version.epoch, \
+                        'rel': _old.version.rel, 'ver': _old.version.ver}, \
+                        'vcs': _old.version.vcs}, \
+                        'newpkg': {'name': _new.name, \
+                        'version': {'epoch': _new.version.epoch, \
+                        'rel': _new.version.rel, 'ver': _new.version.ver},
+                            'vcs': _new.version.vcs}, 'codediff': None} \
+                                    for _old, _new in rebuilded],
+                }
+            }
+
+    if style == 'image':
+        obj['diff']['ks'] = ''.join([d for d in ks_diff(old_url, new_url)])
+
+    return json.dumps(obj, indent=4)
+
+def diff_to_HTML(old_url, new_url, style='repo'):
+    """Output diffs' html format"""
+
+    json_obj = diff_to_JSON(old_url, new_url, style)
+
+    if json_obj is None:
+        return
+
+    data = json.loads(json_obj)
+
+    context = {'old_url': old_url,
+            'new_url': new_url,
+            'diff': data['diff'],
+            }
+
+    return output_html('diff.html', **context)
 
index eb2f504011b2d9e9b6fed83b719fa24db4923178..cccb932509a1d9be4578a13da8d1a3823ca37925 100644 (file)
@@ -1,10 +1,7 @@
 from .utils import xml2obj
-from .render import output_html
 
 import gzip
-import json
 import mimetypes
-import os
 import requests
 from StringIO import StringIO
 
@@ -71,94 +68,4 @@ class Repo(object):
 
         return packages_info
 
-def diff_to_JSON(old_url, new_url):
-    """Output diffs' json format"""
-
-    if not old_url or not new_url:
-        return
-
-    old, new = Repo(old_url).packages, Repo(new_url).packages
-
-    added, removed, modified, rebuilded = [], [], [], []
-    package_names = set(old.keys() + new.keys())
-
-    def _pair_old_new():
-        for name in package_names:
-            if old.get(name) is None:
-                for pkg in new[name]:
-                    yield (None, pkg)
-            elif new.get(name) is None:
-                for pkg in old[name]:
-                    yield (pkg, None)
-            else:
-                for old_pkg in old[name]:
-                    for new_pkg in new[name]:
-                        if old_pkg.version.ver == new_pkg.version.ver:
-                            yield (old_pkg, new_pkg)
-                            old[name].remove(old_pkg)
-                            new[name].remove(new_pkg)
-                for pair in map(None, old[name], new[name]):
-                    yield pair
-    for old_pkg, new_pkg in _pair_old_new():
-        if old_pkg is None:
-            added.append(new_pkg)
-        elif new_pkg is None:
-            removed.append(old_pkg)
-        elif old_pkg.version.vcs != new_pkg.version.vcs or \
-                old_pkg.version.ver != new_pkg.version.ver:
-            modified.append((old_pkg, new_pkg))
-        elif old_pkg.version.rel != new_pkg.version.rel:
-            rebuilded.append((old_pkg, new_pkg))
-
-    obj = {'repo': {'old': old_url, 'new': new_url},
-            'diff': {
-                'added': [{'oldpkg': None, 'newpkg': {'name': _new.name, \
-                        'version': {'epoch': _new.version.epoch, \
-                        'rel': _new.version.rel, 'ver': _new.version.ver}, \
-                        'vcs': _new.version.vcs}, 'codediff': None} \
-                        for _new in added],
-                'removed': [{'oldpkg': {'name': _old.name, \
-                        'version': {'epoch': _old.version.epoch, \
-                        'rel': _old.version.rel, 'ver': _old.version.ver}, \
-                        'vcs': _old.version.vcs}, 'newpkg': None, \
-                        'codediff': None} for _old in added],
-                'modified': [{'oldpkg': {'name': _old.name, \
-                        'version': {'epoch': _old.version.epoch, \
-                        'rel': _old.version.rel, 'ver': _old.version.ver}, \
-                        'vcs': _old.version.vcs}, \
-                        'newpkg': {'name': _new.name, \
-                        'version': {'epoch': _new.version.epoch, \
-                        'rel': _new.version.rel, 'ver': _new.version.ver},
-                            'vcs': _new.version.vcs}, 'codediff': None} \
-                                    for _old, _new in modified],
-                 'rebuilded': [{'oldpkg': {'name': _old.name, \
-                        'version': {'epoch': _old.version.epoch, \
-                        'rel': _old.version.rel, 'ver': _old.version.ver}, \
-                        'vcs': _old.version.vcs}, \
-                        'newpkg': {'name': _new.name, \
-                        'version': {'epoch': _new.version.epoch, \
-                        'rel': _new.version.rel, 'ver': _new.version.ver},
-                            'vcs': _new.version.vcs}, 'codediff': None} \
-                                    for _old, _new in rebuilded],
-                }
-            }
-
-    return json.dumps(obj, indent=4)
-
-def diff_to_HTML(old_url, new_url):
-    """Output diffs' html format"""
-
-    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,
-            'diff': data['diff'],
-            }
-
-    return output_html('diff.html', **context)
 
diff --git a/tools/repo-diff b/tools/repo-diff
deleted file mode 100755 (executable)
index d94eebe..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/env python
-
-from snapdiff import diff_to_JSON, diff_to_HTML
-
-import argparse
-import sys
-
-def main(argv):
-    description = 'Diff two repos with different urls'
-    parser = argparse.ArgumentParser(description=description)
-    parser.add_argument(dest='old', help='old repo')
-    parser.add_argument(dest='new', help='new repo')
-    parser.add_argument('--json', help='output json diffs', action='store_true')
-    args = parser.parse_args(argv)
-
-    if args.json:
-        print diff_to_JSON(args.old, args.new)
-    else:
-        print diff_to_HTML(args.old, args.new)
-
-if __name__ == '__main__':
-    sys.exit(main(sys.argv[1:]))
-
diff --git a/tools/snap-diff b/tools/snap-diff
new file mode 100755 (executable)
index 0000000..1217d5b
--- /dev/null
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+import snapdiff
+
+import argparse
+import sys
+
+def main(argv):
+    description = 'Diff two repos with different urls'
+    parser = argparse.ArgumentParser(description=description)
+    parser.add_argument(dest='old', help='old repo')
+    parser.add_argument(dest='new', help='new repo')
+    parser.add_argument('--json', help='output json diffs', action='store_true')
+    parser.add_argument('-t', dest='type', help="which diff you want(repo | image, default is repo)")
+    args = parser.parse_args(argv)
+
+    if args.json:
+        print snapdiff.diff_to_JSON(args.old, args.new, style=args.type or 'repo')
+    else:
+        print snapdiff.diff_to_HTML(args.old, args.new, style=args.type or 'repo')
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv[1:]))
+