[TIC-Core] Fixed recovery code to handle rpm conflicts 04/123604/3
authorChulwoo Shin <cw1.shin@samsung.com>
Thu, 6 Apr 2017 08:05:25 +0000 (17:05 +0900)
committerChulwoo Shin <cw1.shin@samsung.com>
Thu, 6 Apr 2017 08:09:54 +0000 (17:09 +0900)
- Fixed recovery code to handle rpm conflicts

Change-Id: I712bf82f3fb045e0e534165b68b1e65460d2c50f
Signed-off-by: Chulwoo Shin <cw1.shin@samsung.com>
tic/dependency.py

index c3d9de7..64d29a0 100644 (file)
@@ -28,74 +28,6 @@ from tic.config import configmgr
 
 DEFAULT_PROFILE = 'EMPTY'
 
-def analyze_dependency(pkg_group):
-    
-    def dep_dfs(pkg_id):
-        #logger = logging.getLogger(__name__)
-        if pkg_list[pkg_id].get('dependency') is not None:
-            return pkg_list[pkg_id].get('dependency')
-        
-        number[0] += 1
-        visited[pkg_id] = number[0]
-        min_num[pkg_id] = number[0]
-        stack.append(pkg_id)
-
-        dep_set = set([pkg_list[pkg_id]['name']])
-        
-        if pkg_list[pkg_id].get('requires'):
-            for req in pkg_list[pkg_id].get('requires'):
-                req_id = req.get('id')
-                if req_id is not None:
-                    if scc_list[req_id] > 0:
-                        dep_set.update(pkg_list[req_id].get('dependency'))
-                        continue
-                    
-                    if visited[req_id] == 0:
-                        dep_set.update(dep_dfs(req_id))
-                    
-                    min_num[pkg_id] = min(min_num[pkg_id], min_num[req_id])
-                else:
-                    #TODO: package does not exist
-                    #logger.warning('%s does not exist in repo', req['name'])
-                    pass
-        
-        if min_num[pkg_id] == visited[pkg_id]:
-            # scc (string connected components)
-            make_scc(pkg_id, list(dep_set))
-        
-        return dep_set
-    
-    def make_scc(pkg_id, dep_list):
-        p_id = 0 
-        scc_num[0] += 1
-        # stack is not empty
-        while stack:
-            p_id = stack.pop()
-            scc_list[p_id] = scc_num[0]
-            pkg_list[p_id]['dependency'] = dep_list
-            if pkg_id == p_id:
-                break
-    
-    def analyze():
-        for pkg_id in range(len(pkg_list)):
-            if visited[pkg_id] == 0:
-                dep_dfs(pkg_id)
-    
-    #TODO: Exception handling
-    if not pkg_group:
-        return None
-    
-    # package install-dependency analysis
-    pkg_list = pkg_group.get('pkg_list')
-    number = [0]
-    scc_num = [0]
-    visited = [0]*len(pkg_list)
-    min_num = [0]*len(pkg_list)
-    scc_list = [0]*len(pkg_list)
-    stack = []
-    
-    return analyze()
-    
 def get_installed_packages(recipe, repoinfo, pkg_group):
     logger = logging.getLogger(__name__)
     
@@ -286,7 +218,7 @@ def get_installed_packages(recipe, repoinfo, pkg_group):
                     choose = None
                     #  Find dependency rpm based on capability/files
                     if req['name'] in provides:
-                        # capability : [provide_rpm_1, provide_rpm_2, ... ] 
+                        # capability : [provide_rpm_1, provide_rpm_2, ... ]
                         # Select the rpm that meets the condition (version)
                         if dep_tag == Dependency.REQUIRES:
                             choose = _select_rpm(provides[req['name']], req, pkg_info.get('recommends'))
@@ -294,7 +226,6 @@ def get_installed_packages(recipe, repoinfo, pkg_group):
                             choose = _select_rpm(provides[req['name']], req)
                     elif req['name'] in files:
                         choose = _select_rpm_from_files(files[req['name']], req)
-                        #choose = pkg_dict.get(files[req['name']][0])
                     elif req['name'] in pkg_dict:
                         choose = pkg_dict.get(req['name'])
                     
@@ -305,6 +236,12 @@ def get_installed_packages(recipe, repoinfo, pkg_group):
                             continue
 
                     if choose:
+                        # add forward/backward reference
+                        _create_reference(pkg_info, choose)
+                        
+                        # ref count
+                        # choose['ref_cnt'] = {req['name']: 1}
+                        
                         if selected[choose['id']] == 0:
                             dep_set = _analyze_dep(choose)
                             if not progress['status']:
@@ -312,17 +249,14 @@ def get_installed_packages(recipe, repoinfo, pkg_group):
                             
                             dep_rpms.update(dep_set)
                             min_num[pkg_id] = min(min_num[pkg_id], min_num[choose['id']])
-                        elif scc_id[choose['id']] == 0: 
+                        elif scc_id[choose['id']] == 0:
                             # cross edge that can not be ignored
                             min_num[pkg_id] = min(min_num[pkg_id], min_num[choose['id']])
-                        
-                        # add forward/backward reference
-                        _create_reference(pkg_info, choose)
                     else:
                         # the rpm does not exists
                         logger.info(configmgr.message['dependency_not_exist'] % (req['name'], pkg_info['name']))
                         progress['status'] = False
-                        break                     
+                        break
             
             if not progress['status']:
                 break
@@ -344,7 +278,8 @@ def get_installed_packages(recipe, repoinfo, pkg_group):
         for pkgname in g_pkg_list:
             pkg = pkg_dict[pkgname]
             # the node is selfchecked (the root node ignores selfchecked)
-            if stack[0]['id'] != pkg['id'] and pkg['selfChecked']:
+            #if stack[0]['id'] != pkg['id'] and pkg['selfChecked']:
+            if selected_pkg['id'] != pkg['id'] and pkg['selfChecked']:
                 return False
             # check backward ref.
             for bname in pkg.get('backward'):
@@ -381,13 +316,13 @@ def get_installed_packages(recipe, repoinfo, pkg_group):
                         del node['backward'][i]
                         break
             # selfCheck node do not remove
-            if pkg_info.get('selfChecked'):
+            if node.get('selfChecked'):
                 return
                          
         if node.get('backward'):
-            if node.get('group') is None or _check_circular_dep(node):
+            if node.get('group') is None or not _check_circular_dep(node):
                 return
-            
+        
         # the selected node is uncheckable
         if node.get('group') and group_visited[node['group']]:
             group_visited[node['group']][node['name']] = 1
@@ -395,7 +330,7 @@ def get_installed_packages(recipe, repoinfo, pkg_group):
         # if selected node has forward references
         if node.get('forward'):
             for fname in node.get('forward'):
-                fnode = pkg_dict[fname]
+                fnode = pkg_dict.get(fname)
                 
                 # If pkg has a circular dependency and is unchekcable,
                 # circular dep. pkgs can only be visited once
@@ -461,23 +396,23 @@ def get_installed_packages(recipe, repoinfo, pkg_group):
     
     for pkg_name in pkg_set:
         progress['status'] = True
-        pkg_info = pkg_dict.get(pkg_name)
+        selected_pkg = pkg_dict.get(pkg_name)
         
-        if not pkg_info:
+        if not selected_pkg:
             if provides.get(pkg_name):
                 pro = provides.get(pkg_name)[0]
-                pkg_info = pkg_dict.get(pro['name'])
+                selected_pkg = pkg_dict.get(pro['name'])
             else:
                 logger.info(configmgr.message['package_not_exist'] % pkg_name)
-                continue 
+                continue
 
-        pkg_info['selfChecked'] = True
-        if selected[pkg_info['id']] == 0:
-            dep_set = _analyze_dep(pkg_info)
+        selected_pkg['selfChecked'] = True
+        if selected[selected_pkg['id']] == 0:
+            dep_set = _analyze_dep(selected_pkg)
             if progress['status']:
                 install_rpm.update(dep_set)
             else:
                 # delete forward/backward reference
-                group_visited = {} 
-                _remove_reference(None, pkg_info)
+                group_visited = {}
+                _remove_reference(None, selected_pkg)
     return list(install_rpm)