summaryrefslogtreecommitdiffstats
path: root/src/lib/Server/Plugins/Packages/Apt.py
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2012-11-01 02:25:57 +0100
committerAlexander Sulfrian <alexander@sulfrian.net>2013-03-06 04:52:33 +0100
commit5ec01d256cd937674a80fb0e04eac7709306ede5 (patch)
tree436676b7742417b8c23a9d20a22d2d07e25e0385 /src/lib/Server/Plugins/Packages/Apt.py
parentbe0714757cbd4dc4748855e72bcec4476fd07e38 (diff)
downloadbcfg2-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.py50
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