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