#
# Contributors:
# - S-Core Co., Ltd
+from lxml import etree
+from tic.utils.error import TICError
+import logging
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')
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
- #TODO: package doest not exist
- #print('def_dfs::', req['name'], 'is not exist (in dep_analysis)')
if min_num[pkg_id] == visited[pkg_id]:
# scc (string connected components)
scc_list[p_id] = scc_num[0]
pkg_list[p_id]['dependency'] = dep_list
if pkg_id == p_id:
- break;
+ break
def analyze():
for pkg_id in range(len(pkg_list)):
return analyze()
+def get_installed_packages(recipe, repoinfo, pkg_group):
+ logger = logging.getLogger(__name__)
+ if not recipe or not repoinfo:
+ return []
+
+ default = recipe.get('Default')
+ config = recipe.get('Configurations')[0]
+ platform_name = config.get('Platform')
+ platform = recipe.get(platform_name)
+
+ # check groups/extraPackages
+ group_set = set([])
+ extrapkg_set = set([])
+ for g in [default, platform, config]:
+ if g.has_key('Groups'):
+ group_set.update(g.get('Groups'))
+ if g.has_key('ExtraPackages'):
+ extrapkg_set.update(g.get('ExtraPackages'))
+ 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
+ pkg_set = set([])
+ 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))
+
+ # set up required package from group packages
+ pkg2id = pkg_group.get('pkg2id')
+ pkg_list = pkg_group.get('pkg_list')
+ for pkg in pkg_set:
+ pkg_id = pkg2id.get(pkg)
+ if pkg_id and pkg_list[pkg_id].get('dependency'):
+ extrapkg_set.update(set(pkg_list[pkg_id].get('dependency')))
+
+ return list(extrapkg_set)
\ No newline at end of file