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__)
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'))
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'])
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']:
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
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'):
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
# 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
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)