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-01-30 01:22:51 +0100
commita128b27aabc246c74fc407c93fc8b696f8f1bd92 (patch)
tree0acd3fa94007be86e3468b5c08f56933e65669d3 /src/lib/Server/Plugins/Packages/Apt.py
parent540e2bc637ac99e60bc236a62ff8e885a705b562 (diff)
downloadbcfg2-a128b27aabc246c74fc407c93fc8b696f8f1bd92.tar.gz
bcfg2-a128b27aabc246c74fc407c93fc8b696f8f1bd92.tar.bz2
bcfg2-a128b27aabc246c74fc407c93fc8b696f8f1bd92.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.py49
1 files changed, 44 insertions, 5 deletions
diff --git a/src/lib/Server/Plugins/Packages/Apt.py b/src/lib/Server/Plugins/Packages/Apt.py
index d999e21c8..0c0c95e70 100644
--- a/src/lib/Server/Plugins/Packages/Apt.py
+++ b/src/lib/Server/Plugins/Packages/Apt.py
@@ -17,6 +17,7 @@ class AptSource(Source):
Source.__init__(self, basepath, xsource, config)
self.pkgnames = set()
self.versions = dict()
+ self.recommends = dict()
self.url_map = [{'rawurl': self.rawurl, 'url': self.url,
'version': self.version,
@@ -25,13 +26,13 @@ class AptSource(Source):
def save_state(self):
cache = file(self.cachefile, 'wb')
cPickle.dump((self.pkgnames, self.deps, self.provides,
- self.versions),
+ self.versions, self.recommends),
cache, 2)
cache.close()
def load_state(self):
data = file(self.cachefile)
- self.pkgnames, self.deps, self.provides, self.versions = cPickle.load(data)
+ self.pkgnames, self.deps, self.provides, self.versions, self.recommends = cPickle.load(data)
def filter_unknown(self, unknown):
filtered = set([u for u in unknown if u.startswith('choice')])
@@ -51,6 +52,7 @@ class AptSource(Source):
def read_files(self):
bdeps = dict()
+ brecs = dict()
bprov = dict()
self.versions = dict()
if self.recommended:
@@ -68,6 +70,7 @@ class AptSource(Source):
barch = self.arches[0]
if barch not in bdeps:
bdeps[barch] = dict()
+ brecs[barch] = dict()
bprov[barch] = dict()
self.versions[barch] = dict()
try:
@@ -81,7 +84,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:
@@ -92,12 +96,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()
@@ -108,12 +119,15 @@ class AptSource(Source):
self.versions[barch][pkgname] = words[1].rstrip().strip()
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] = []
@@ -123,6 +137,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))
@@ -139,6 +164,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