[TIC-CORE] Support analysis of unified repositories
[archive/20170607/tools/tic-core.git] / tic / parser / view_parser.py
index 586307d..30cd3aa 100644 (file)
@@ -1,30 +1,55 @@
 import logging
 from operator import itemgetter
+from tic.utils.rpmmisc import meetRequireVersion
 
 
 def make_view_data(pkg_group):
     logger = logging.getLogger(__name__)
     
+    def _select_provide_rpm(capability, require):
+        provide_list = []
+        if require.get('ver') is not None:
+            for provide in capability:
+                ver_data = provide['data']
+                if not ver_data.get('ver'):
+                    ver_data = pkg_dict.get(provide['name']).get('version')
+                if meetRequireVersion(require, ver_data):
+                    provide_list.append(provide)
+        else:
+            provide_list = capability
+            
+        result = []
+        for provide in provide_list:
+            result.append(pkg_dict[provide['name']])
+            
+        return result
+    
     def set_meta_require(meta_info):
         meta_nodes = meta_info.get('nodes')
         for child_meta in meta_nodes:
             refer_count[child_meta['id']] += 1
             set_meta_require(child_meta)
             
-        req_list = pkg_dict[meta_info['text']].get('requires')
-        if req_list is not None:
-            for req in req_list:
-                if provides.get(req['name']):
-                    provide_info = provides[req['name']][0]
-                    pkg_name = provide_info['name']
-                    if 'meta' not in pkg_dict[pkg_name]:
-                        child_pkg = pkg_dict[pkg_name]
-                        meta_nodes.append(make_node(child_pkg))
-                        refer_count[child_pkg['id']] += 1
+        pkg_info = pkg_dict[meta_info['text']]
+        for dep_tag in ['requires', 'recommends']:
+            if pkg_info.get(dep_tag):
+                for req in pkg_info.get(dep_tag):
+                    targets = []
+                    if req['name'] in provides:
+                        targets = _select_provide_rpm(provides[req['name']], req)
+                    elif req['name'] in files:
+                        targets.append(pkg_dict.get(files[req['name']][0]))
+                    elif req['name'] in pkg_dict:
+                        targets.append(pkg_dict.get(req['name']))
                     else:
-                        # The meta-pkg of the other group are excluded.
                         # the dependent package does not exist.
                         pass
+                        
+                    for pkg in targets:
+                        # The meta-pkg of the other group are excluded.
+                        if not pkg.get('meta'):
+                            refer_count[pkg['id']] += 1
+                            meta_nodes.append(make_node(pkg))
                 
     def make_node(pkg_info):
         return dict(id=pkg_info['id'], text=pkg_info['name'], nodes=[])
@@ -39,6 +64,7 @@ def make_view_data(pkg_group):
       
     pkg_dict = pkg_group['pkg_dict']
     provides = pkg_group['provides']
+    files = pkg_group['files']
     refer_count = [0] * len(pkg_dict)
     
     # sort by pkg_name ([0]:name, [1]:root, [2]:sub1)