diff options
author | Alexander Sulfrian <alexander@sulfrian.net> | 2012-11-01 02:25:57 +0100 |
---|---|---|
committer | Alexander Sulfrian <alexander@sulfrian.net> | 2013-03-06 04:52:33 +0100 |
commit | 5ec01d256cd937674a80fb0e04eac7709306ede5 (patch) | |
tree | 436676b7742417b8c23a9d20a22d2d07e25e0385 /src/lib/Server/Plugins/Packages/Apt.py | |
parent | be0714757cbd4dc4748855e72bcec4476fd07e38 (diff) | |
download | bcfg2-5ec01d256cd937674a80fb0e04eac7709306ede5.tar.gz bcfg2-5ec01d256cd937674a80fb0e04eac7709306ede5.tar.bz2 bcfg2-5ec01d256cd937674a80fb0e04eac7709306ede5.zip |
Packages: ability to overwrite recommended flag per package
Diffstat (limited to 'src/lib/Server/Plugins/Packages/Apt.py')
-rw-r--r-- | src/lib/Server/Plugins/Packages/Apt.py | 50 |
1 files changed, 45 insertions, 5 deletions
diff --git a/src/lib/Server/Plugins/Packages/Apt.py b/src/lib/Server/Plugins/Packages/Apt.py index f76bf7fa1..cffe42ee4 100644 --- a/src/lib/Server/Plugins/Packages/Apt.py +++ b/src/lib/Server/Plugins/Packages/Apt.py @@ -16,6 +16,7 @@ class AptSource(Source): def __init__(self, basepath, xsource, config): Source.__init__(self, basepath, xsource, config) self.pkgnames = set() + self.recommends = dict() self.url_map = [{'rawurl': self.rawurl, 'url': self.url, 'version': self.version, @@ -23,13 +24,14 @@ class AptSource(Source): def save_state(self): cache = file(self.cachefile, 'wb') - cPickle.dump((self.pkgnames, self.deps, self.provides), + cPickle.dump((self.pkgnames, self.deps, self.provides, + self.recommends), cache, 2) cache.close() def load_state(self): data = file(self.cachefile) - self.pkgnames, self.deps, self.provides = cPickle.load(data) + self.pkgnames, self.deps, self.provides, self.recommends = cPickle.load(data) def filter_unknown(self, unknown): filtered = set([u for u in unknown if u.startswith('choice')]) @@ -49,6 +51,7 @@ class AptSource(Source): def read_files(self): bdeps = dict() + brecs = dict() bprov = dict() if self.recommended: depfnames = ['Depends', 'Pre-Depends', 'Recommends'] @@ -65,6 +68,7 @@ class AptSource(Source): barch = self.arches[0] if barch not in bdeps: bdeps[barch] = dict() + brecs[barch] = dict() bprov[barch] = dict() try: reader = gzip.GzipFile(fname) @@ -77,7 +81,8 @@ class AptSource(Source): pkgname = words[1].strip().rstrip() self.pkgnames.add(pkgname) bdeps[barch][pkgname] = [] - elif words[0] in depfnames: + brecs[barch][pkgname] = [] + elif words[0] in ['Depends', 'Pre-Depends', 'Recommends']: vindex = 0 for dep in words[1].split(','): if '|' in dep: @@ -88,12 +93,19 @@ class AptSource(Source): barch, vindex) vindex += 1 - bdeps[barch][pkgname].append(dyn_dname) + + if words[0] == 'Recommends': + brecs[barch][pkgname].append(dyn_dname) + else: + bdeps[barch][pkgname].append(dyn_dname) bprov[barch][dyn_dname] = set(cdeps) else: raw_dep = re.sub('\(.*\)', '', dep) raw_dep = raw_dep.rstrip().strip() - bdeps[barch][pkgname].append(raw_dep) + if words[0] == 'Recommends': + brecs[barch][pkgname].append(raw_dep) + else: + bdeps[barch][pkgname].append(raw_dep) elif words[0] == 'Provides': for pkg in words[1].split(','): dname = pkg.rstrip().strip() @@ -102,12 +114,15 @@ class AptSource(Source): bprov[barch][dname].add(pkgname) self.deps['global'] = dict() + self.recommends['global'] = dict() self.provides['global'] = dict() for barch in bdeps: self.deps[barch] = dict() + self.recommends[barch] = dict() self.provides[barch] = dict() for pkgname in self.pkgnames: pset = set() + rset = set() for barch in bdeps: if pkgname not in bdeps[barch]: bdeps[barch][pkgname] = [] @@ -117,6 +132,17 @@ class AptSource(Source): else: for barch in bdeps: self.deps[barch][pkgname] = bdeps[barch][pkgname] + + for barch in brecs: + if pkgname not in brecs[barch]: + brecs[barch][pkgname] = [] + rset.add(tuple(brecs[barch][pkgname])) + if len(rset) == 1: + self.recommends['global'][pkgname] = rset.pop() + else: + for barch in brecs: + self.recommends[barch][pkgname] = brecs[barch][pkgname] + provided = set() for bprovided in list(bprov.values()): provided.update(set(bprovided)) @@ -133,6 +159,20 @@ class AptSource(Source): self.provides[barch][prov] = bprov[barch].get(prov, ()) self.save_state() + def get_deps(self, metadata, pkgname, recommended=None): + recs = [] + if ((recommended is None and self.recommended) or + (recommended and recommended.lower() == 'true')): + for arch in self.get_arches(metadata): + if pkgname in self.recommends[arch]: + recs.extend(self.recommends[arch][pkgname]) + + for arch in self.get_arches(metadata): + if pkgname in self.deps[arch]: + recs.extend(self.deps[arch][pkgname]) + + return recs + def is_package(self, _, pkg): return (pkg in self.pkgnames and pkg not in self.blacklist and |