[TIC-CORE] Support analysis of unified repositories
[archive/20170607/tools/tic-core.git] / tic / dependency.py
index 80b9045..09af564 100644 (file)
 # Contributors:
 # - S-Core Co., Ltd
 
-import rpm
 import logging
 from lxml import etree
 from tic.utils.error import TICError
+from tic.utils.rpmmisc import meetRequireVersion, compare_ver
 
 def analyze_dependency(pkg_group):
     
@@ -95,37 +95,16 @@ def analyze_dependency(pkg_group):
 def get_installed_packages(recipe, repoinfo, pkg_group):
     logger = logging.getLogger(__name__)
     
-    def _compare_ver(ver1, ver2):
-        return rpm.labelCompare((ver1.get('epoch'), ver1.get('ver'), ver1.get('rel')), 
-                                (ver2.get('epoch'), ver2.get('ver'), ver2.get('rel')))
-        
-    def _compare_req_cap_ver(req, cap):
-        epoch = cap.get('epoch')
-        ver = cap.get('ver')
-        rel = cap.get('rel')
-        if not req.get('epoch'): epoch = None
-        if not req.get('rel'): rel = None
-        return rpm.labelCompare((req.get('epoch'), req.get('ver'), req.get('rel')), (epoch, ver, rel))
-    
-    def _meetRequireVersion(req_ver, cmp_ver):
-        cmp_ret = _compare_req_cap_ver(req_ver, cmp_ver)
-        if cmp_ret == 0 and (req_ver['flags'] == 'EQ' or req_ver['flags'] == 'GE' or req_ver['flags'] == 'LE'):
-            return True
-        elif cmp_ret == 1 and (req_ver['flags'] == 'LT' or req_ver['flags'] == 'LE'):
-            return True
-        elif cmp_ret == -1 and (req_ver['flags'] == 'GT' or req_ver['flags'] == 'GE'):
-            return True
-        return False
-    
     def _select_rpm(capability, require):
         provide_list = []
         # 1. Choose the rpm included in version from provides
         if require.get('ver') is not None:
             for provide in capability:
                 ver_data = provide['data']
+                # If there is no capability version, use version of package
                 if not ver_data.get('ver'):
                     ver_data = pkg_dict.get(provide['name']).get('version')
-                if _meetRequireVersion(require, ver_data):
+                if meetRequireVersion(require, ver_data):
                     provide_list.append(provide)
         else:
             provide_list = capability
@@ -150,7 +129,7 @@ def get_installed_packages(recipe, repoinfo, pkg_group):
             if not _check_conflicts(pkg_dict.get(provide_list[i]['name'])):
                 if max_ver:
                     cap_info = provide_list[i].get('data')
-                    ret = _compare_ver(max_ver.get('data'), cap_info)
+                    ret = compare_ver(max_ver.get('data'), cap_info)
                     # cap_info is greater than max_ver
                     if ret == -1:
                         max_ver = provide_list[i]
@@ -207,7 +186,7 @@ def get_installed_packages(recipe, repoinfo, pkg_group):
             for pro in pkg_info['provides']:
                 if pro['name'] in conflicts:
                     for con in conflicts[pro['name']]:
-                        if not con['data'].get('ver') or _meetRequireVersion(con['data'], pro):
+                        if not con['data'].get('ver') or meetRequireVersion(con['data'], pro):
                             #package conflict
                             return True
         
@@ -218,12 +197,12 @@ def get_installed_packages(recipe, repoinfo, pkg_group):
                     for pro in provides[con['name']]:
                         pkg = pkg_dict[pro['name']]
                         if selected[pkg['id']] != 0:
-                            if not con.get('ver') or _meetRequireVersion(con, pkg['version']):
+                            if not con.get('ver') or meetRequireVersion(con, pkg['version']):
                                 return True
                 elif con['name'] in pkg_dict:
                     pkg = pkg_dict[con['name']]
                     if selected[pkg['id']] != 0:
-                        if not con.get('ver') or _meetRequireVersion(con, pkg['version']):
+                        if not con.get('ver') or meetRequireVersion(con, pkg['version']):
                             return True
         return False
     
@@ -257,7 +236,7 @@ def get_installed_packages(recipe, repoinfo, pkg_group):
         _add_conflicts(pkg_info)
         
         # Installation dependency analysis of rpm
-        for dep_tag in ['requires']: # 'recommends'
+        for dep_tag in ['requires', 'recommends']:
             if pkg_info.get(dep_tag):
                 for req in pkg_info.get(dep_tag):
                     choose = None
@@ -392,24 +371,28 @@ def get_installed_packages(recipe, repoinfo, pkg_group):
             group_set.update(g.get('Groups'))
         if g.has_key('ExtraPackages'):
             pkg_set.update(g.get('ExtraPackages'))
-    group_dict = dict.fromkeys(group_set)
+    #group_dict = dict.fromkeys(group_set)
     
     # parsing group.xml
-    try:
-        tree = etree.parse(repoinfo[0].get('comps'))
-        root = tree.getroot()
-    except etree.XMLSyntaxError as e:
-        raise TICError('primary.xml syntax error. %s', e)
-    
-    # Convert groups to packages
-    for elm in root.findall('group'):
-        group_name = elm.find('name').text
-        if group_dict.has_key(group_name):
-            pkglist = elm.find('packagelist')
-            plist = []
-            for pkgreq in pkglist.findall('packagereq'):                
-                plist.append(pkgreq.text)
-            pkg_set.update(set(plist))
+    if group_set:
+        for repo in repoinfo:
+            if repo.get('comps'):
+                try:
+                    tree = etree.parse(repo.get('comps'))
+                    root = tree.getroot()
+                except etree.XMLSyntaxError as e:
+                    raise TICError('group.xml syntax error. %s', e)
+                
+                # Convert groups to packages
+                for elm in root.findall('group'):
+                    group_name = elm.find('name').text
+                    if group_name in group_set:
+                        pkglist = elm.find('packagelist')
+                        plist = []
+                        for pkgreq in pkglist.findall('packagereq'):
+                            plist.append(pkgreq.text)
+                        pkg_set.update(set(plist))
+                        group_set.discard(group_name);
     
     pkg_dict = pkg_group.get('pkg_dict')
     provides = pkg_group.get('provides')