X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=tic%2Fdependency.py;h=09af5647c3b1075c901dbb1ed46eeb9919169a9d;hb=f2dd73bd47c4d6e4601cb2e8f044aa59db170a98;hp=80b9045e72f6007eceba9a639f0f757276a3c070;hpb=2ea48c27f10477b94966509cc2bb0584245a93f8;p=archive%2F20170607%2Ftools%2Ftic-core.git diff --git a/tic/dependency.py b/tic/dependency.py index 80b9045..09af564 100644 --- a/tic/dependency.py +++ b/tic/dependency.py @@ -19,10 +19,10 @@ # 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')