From 6e1cc151604ab2e89844c1428fbb89e6b0ec893e Mon Sep 17 00:00:00 2001 From: Alexander Lakhin Date: Mon, 17 Feb 2014 17:43:46 +0400 Subject: [PATCH] Make the same package preferred for a requirement resolution --- prepare-repodb.py | 117 +++++++++++++++++++++++----------------------- 1 file changed, 59 insertions(+), 58 deletions(-) diff --git a/prepare-repodb.py b/prepare-repodb.py index ebfec96..946dcbf 100755 --- a/prepare-repodb.py +++ b/prepare-repodb.py @@ -230,84 +230,86 @@ SELECT packages.id AS package_id, packages.name AS package_name, packages.nvra, in_repodirs = ','.join(str(id) for id in search_repodirs) # print 'package requires count: ', len(package_requires) broken_dep = 0 - requires_cache = {} - # TODO: Reuse the cache for dependent repositories??? for packreq in package_requires: (cpackage_id, package_nvra, requires_id, requires_name, requires_flags, requires_version) = \ (packreq[0], packreq[2], packreq[3], packreq[4], packreq[5], packreq[6]) - requirement_uid = requires_name + '\x00' + str(requires_flags) + '\x00' + requires_version - req_res = requires_cache.get(requirement_uid, None) - if req_res is None: - req_res = [] - if (re.match(r'\A(rpmlib|executable)\(.+\)\Z', requires_name)): - # see if($N=~/\A(rpmlib|executable)\(.+\)\Z/) in urpm_repoclosure.pl - req_res.append({}) - else: - depend_candidates = dbc.execute(""" + req_res = [] + if (re.match(r'\A(rpmlib|executable)\(.+\)\Z', requires_name)): + # see if($N=~/\A(rpmlib|executable)\(.+\)\Z/) in urpm_repoclosure.pl + req_res.append({}) + else: + depend_candidates = dbc.execute(""" SELECT packages.id AS package_id, packages.name AS package_name, packages.nvra, prov.id, prov.name, flags, prov.version FROM packages, rpm_provides AS prov WHERE prov.package_id = packages.id AND repodir_id IN (%s) AND prov.name = ? ORDER by packages.name, packages.nvra """ % in_repodirs, [requires_name]).fetchall() - preferred_version = None + preferred_version = None + for dep_cand in depend_candidates: + (pkg_id, provides_id, + provides_flags, provides_version) = \ + (dep_cand[0], dep_cand[3], + dep_cand[5], dep_cand[6]) + if provides_flags & RPMSENSE_SENSEMASK == 0: + if not provides_version: + provides_version = '*' + else: + raise Exception('Invalid provides version ' + '(flags = %d, version = %s)!' % + (provides_flags, provides_version)) + if version_ok(requires_version, + requires_flags & RPMSENSE_SENSEMASK, + provides_version): + if pkg_id == cpackage_id: + # the same package is preferred over any other + req_res.append({'prov_id': provides_id, + 'pkg_id': pkg_id}) + preferred_version = None + break + better_version = preferred_version is None or \ + provides_version == '*' + if not better_version: + better_version = version_ok(provides_version, + RPMSENSE_GREATER, + preferred_version) + if better_version: + preferred_version = provides_version + + if preferred_version is not None: for dep_cand in depend_candidates: - (provides_flags, provides_version) = \ - (dep_cand[5], dep_cand[6]) - #print 'provides_version: ', provides_flags, ' ', provides_version - if provides_flags & RPMSENSE_SENSEMASK == 0: - if not provides_version: - provides_version = '*' - else: - raise Exception('Invalid provides version ' - '(flags = %d, version = %s)!' % - (provides_flags, provides_version)) - if version_ok(requires_version, - requires_flags & RPMSENSE_SENSEMASK, - provides_version): - better_version = preferred_version is None or \ - provides_version == '*' - if not better_version: - better_version = version_ok(provides_version, - RPMSENSE_GREATER, - preferred_version) - if better_version: - preferred_version = provides_version - - if preferred_version is not None: - for dep_cand in depend_candidates: - (pkg_id, provides_id, provides_version) = \ - (dep_cand[0], dep_cand[3], dep_cand[6]) - if provides_version == preferred_version or \ - version_ok(provides_version, RPMSENSE_EQUAL, - preferred_version): - req_res.append({'prov_id': provides_id, - 'pkg_id': pkg_id}) + (pkg_id, provides_id, provides_version) = \ + (dep_cand[0], dep_cand[3], dep_cand[6]) + if provides_version == preferred_version or \ + version_ok(provides_version, RPMSENSE_EQUAL, + preferred_version): + req_res.append({'prov_id': provides_id, + 'pkg_id': pkg_id}) - if len(req_res) == 0 and requires_name.startswith('/'): # file dependency - if (requires_flags & (RPMSENSE_SCRIPT_POST | - RPMSENSE_SCRIPT_PREUN | - RPMSENSE_SCRIPT_POSTUN)) != 0: - int_files_cnt = dbc.execute(""" + if len(req_res) == 0 and requires_name.startswith('/'): # file dependency + if (requires_flags & (RPMSENSE_SCRIPT_POST | + RPMSENSE_SCRIPT_PREUN | + RPMSENSE_SCRIPT_POSTUN)) != 0: + int_files_cnt = dbc.execute(""" SELECT COUNT(1) FROM package_files WHERE package_id = ? AND path = ? """, [cpackage_id, requires_name]).fetchone() - if int_files_cnt[0] > 0: - req_res.append({}) - else: - #TODO: Check file dependencies (/usr/bin/python (required by ant-scripts-1.7.1-7.0.6.noarch), /usr/sbin/useradd (required by tomcat5-5.5.28-0.5.2.noarch))? - files_deps = dbc.execute(""" + if int_files_cnt[0] > 0: + req_res.append({}) + else: + #TODO: Check file dependencies (/usr/bin/python (required by ant-scripts-1.7.1-7.0.6.noarch), /usr/sbin/useradd (required by tomcat5-5.5.28-0.5.2.noarch))? + files_deps = dbc.execute(""" SELECT package_id FROM package_files WHERE path = ? AND package_id in (SELECT id FROM packages WHERE repodir_id IN (%s)) """ % in_repodirs, [requires_name]).fetchall() - for file_dep in files_deps: - req_res.append({'pkg_id': file_dep[0]}) + for file_dep in files_deps: + req_res.append({'pkg_id': file_dep[0]}) - if len(req_res) == 0 and (requires_flags & RPMSENSE_MISSINGOK) != 0: - req_res.append({}) + if len(req_res) == 0 and (requires_flags & RPMSENSE_MISSINGOK) != 0: + req_res.append({}) if len(req_res) > 0: for res_rec in req_res: @@ -319,7 +321,6 @@ VALUES (?, ?, ?, ?) else: print requires_name, ' ', requires_version, ' (required by %s)' % package_nvra, ' not found!!!' broken_dep += 1 - requires_cache[requirement_uid] = req_res n = n + 1 #print "n = ", n # if n == 60000: