X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=daklib%2Fpolicy.py;h=1c6327695766b75ca1297c9a173f90bacc898507;hb=3b13cf984701df7e1167f12ca20394f8891a62ba;hp=d4bd4a81c37c1a55b90fbde24c71b4926948167d;hpb=6200b63d85a8da7d6e45fdc7e977851ddbf180ef;p=dak.git diff --git a/daklib/policy.py b/daklib/policy.py index d4bd4a81..1c632769 100644 --- a/daklib/policy.py +++ b/daklib/policy.py @@ -20,6 +20,7 @@ from .config import Config from .dbconn import BinaryMetadata, Component, MetadataKey, Override, OverrideType, Suite, get_mapped_component from .fstransactions import FilesystemTransaction from .regexes import re_file_changes, re_file_safe +from .packagelist import PackageList import daklib.utils as utils import errno @@ -39,7 +40,7 @@ class UploadCopy(object): given by the C{directory} attribute. The copy will be removed on leaving the with-block. """ - def __init__(self, upload): + def __init__(self, upload, group=None): """initializer @type upload: L{daklib.dbconn.PolicyQueueUpload} @@ -48,6 +49,7 @@ class UploadCopy(object): self.directory = None self.upload = upload + self.group = group def export(self, directory, mode=None, symlink=True, ignore_existing=False): """export a copy of the upload @@ -97,9 +99,17 @@ class UploadCopy(object): def __enter__(self): assert self.directory is None + mode = 0o0700 + symlink = True + if self.group is not None: + mode = 0o2750 + symlink = False + cnf = Config() - self.directory = tempfile.mkdtemp(dir=cnf.get('Dir::TempPath')) - self.export(self.directory, symlink=True) + self.directory = utils.temp_dirname(parent=cnf.get('Dir::TempPath'), + mode=mode, + group=self.group) + self.export(self.directory, symlink=symlink) return self def __exit__(self, *args): @@ -141,25 +151,14 @@ class PolicyQueueUploadHandler(object): .filter(Override.component == component) return query.first() - def _binary_override(self, binary, component_name): - package = binary.package + def _binary_override(self, name, binarytype, component_name): suite = self._overridesuite - overridetype = binary.binarytype component = get_mapped_component(component_name, self.session) - query = self.session.query(Override).filter_by(package=package, suite=suite) \ - .join(OverrideType).filter(OverrideType.overridetype == overridetype) \ + query = self.session.query(Override).filter_by(package=name, suite=suite) \ + .join(OverrideType).filter(OverrideType.overridetype == binarytype) \ .filter(Override.component == component) return query.first() - def _binary_metadata(self, binary, key): - metadata_key = self.session.query(MetadataKey).filter_by(key=key).first() - if metadata_key is None: - return None - metadata = self.session.query(BinaryMetadata).filter_by(binary=binary, key=metadata_key).first() - if metadata is None: - return None - return metadata.value - @property def _changes_prefix(self): changesname = self.upload.changes.changesname @@ -196,7 +195,7 @@ class PolicyQueueUploadHandler(object): fn = os.path.join(self.upload.policy_queue.path, 'COMMENTS', fn1) try: - fh = os.open(fn, os.O_CREAT | os.O_EXCL | os.O_WRONLY) + fh = os.open(fn, os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o644) os.write(fh, 'NOTOK\n') os.write(fh, 'From: {0} <{1}>\n\n'.format(utils.whoami(), cnf['Dinstall::MyAdminAddress'])) os.write(fh, reason) @@ -244,39 +243,57 @@ class PolicyQueueUploadHandler(object): missing = [] components = set() + source = self.upload.source + if hints is None: hints = [] hints_map = dict([ ((o['type'], o['package']), o) for o in hints ]) - for binary in self.upload.binaries: - priority = self._binary_metadata(binary, 'Priority') - section = self._binary_metadata(binary, 'Section') + def check_override(name, type, priority, section): component = 'main' if section.find('/') != -1: component = section.split('/', 1)[0] - override = self._binary_override(binary, component) - if override is None: - hint = hints_map.get((binary.binarytype, binary.package)) + override = self._binary_override(name, type, component) + if override is None and not any(o['package'] == name and o['type'] == type for o in missing): + hint = hints_map.get((type, name)) if hint is not None: missing.append(hint) component = hint['component'] else: missing.append(dict( - package = binary.package, + package = name, priority = priority, section = section, component = component, - type = binary.binarytype, + type = type, )) components.add(component) + for binary in self.upload.binaries: + binary_proxy = binary.proxy + priority = binary_proxy['Priority'] + section = binary_proxy['Section'] + check_override(binary.package, binary.binarytype, priority, section) + + if source is not None: + source_proxy = source.proxy + package_list = PackageList(source_proxy) + if not package_list.fallback: + packages = package_list.packages_for_suite(self.upload.target_suite) + for p in packages: + check_override(p.name, p.type, p.priority, p.section) + source_component = '(unknown)' - for component in ('main', 'contrib', 'non-free'): + for component, in self.session.query(Component.component_name).order_by(Component.ordering): if component in components: source_component = component break + else: + if source is not None: + if self._source_override(component) is not None: + source_component = component + break - source = self.upload.source if source is not None: override = self._source_override(source_component) if override is None: