From c4be8436db3ea23a3970a075b149d82880e7a48c Mon Sep 17 00:00:00 2001 From: Niels Thykier Date: Tue, 15 Nov 2016 22:22:24 +0000 Subject: [PATCH] Move read_sources_file to utils Signed-off-by: Niels Thykier --- britney.py | 44 +++++------------------------------------ britney2/utils.py | 50 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 39 deletions(-) diff --git a/britney.py b/britney.py index f563025..2f5478b 100755 --- a/britney.py +++ b/britney.py @@ -207,6 +207,7 @@ from britney2.utils import (old_libraries_format, undo_changes, old_libraries, is_nuninst_asgood_generous, clone_nuninst, check_installability, create_provides_map, read_release_file, + read_sources_file, ) __author__ = 'Fabio Tranchitella and the Debian Release Team' @@ -767,46 +768,9 @@ class Britney(object): self._inst_tester = builder.build() - # Data reading/writing methods # ---------------------------- - def _read_sources_file(self, filename, sources=None, intern=sys.intern): - if sources is None: - sources = {} - - self.log("Loading source packages from %s" % filename) - - Packages = apt_pkg.TagFile(filename) - get_field = Packages.section.get - step = Packages.step - - while step(): - if get_field('Extra-Source-Only', 'no') == 'yes': - # Ignore sources only referenced by Built-Using - continue - pkg = get_field('Package') - ver = get_field('Version') - # There may be multiple versions of the source package - # (in unstable) if some architectures have out-of-date - # binaries. We only ever consider the source with the - # largest version for migration. - if pkg in sources and apt_pkg.version_compare(sources[pkg][0], ver) > 0: - continue - maint = get_field('Maintainer') - if maint: - maint = intern(maint.strip()) - section = get_field('Section') - if section: - section = intern(section.strip()) - sources[intern(pkg)] = SourcePackage(intern(ver), - section, - [], - maint, - False, - ) - return sources - def read_sources(self, basedir): """Read the list of source packages from the specified directory @@ -824,10 +788,12 @@ class Britney(object): for component in self.options.components: filename = os.path.join(basedir, component, "source", "Sources") filename = possibly_compressed(filename) - self._read_sources_file(filename, sources) + self.log("Loading source packages from %s" % filename) + read_sources_file(filename, sources) else: filename = os.path.join(basedir, "Sources") - sources = self._read_sources_file(filename) + self.log("Loading source packages from %s" % filename) + sources = read_sources_file(filename) return sources diff --git a/britney2/utils.py b/britney2/utils.py index 10bf9dc..35ed0af 100644 --- a/britney2/utils.py +++ b/britney2/utils.py @@ -24,6 +24,7 @@ import apt_pkg import errno import os +import sys import time from collections import defaultdict from datetime import datetime @@ -32,6 +33,7 @@ from itertools import filterfalse import yaml +from britney2 import SourcePackage from britney2.consts import (VERSION, PROVIDES, DEPENDS, CONFLICTS, ARCHITECTURE, SECTION, SOURCE, MAINTAINER, MULTIARCH, @@ -677,3 +679,51 @@ def read_release_file(suite_dir): if next(tag_file, None) is not None: # pragma: no cover raise TypeError("%s has more than one paragraph" % release_file) return result + + +def read_sources_file(filename, sources=None, intern=sys.intern): + """Parse a single Sources file into a hash + + Parse a single Sources file into a dict mapping a source package + name to a SourcePackage object. If there are multiple source + packages with the same version, then highest versioned source + package (that is not marked as "Extra-Source-Only") is the + version kept in the dict. + + :param filename: Path to the Sources file. Can be compressed by any algorithm supported by apt_pkg.TagFile + :param sources: Optional dict to add the packages to. If given, this is also the value returned. + :param intern: Internal optimisation / implementation detail to avoid python's "LOAD_GLOBAL" instruction in a loop + :return a dict mapping a name to a source package + """ + if sources is None: + sources = {} + + tag_file = apt_pkg.TagFile(filename) + get_field = tag_file.section.get + step = tag_file.step + + while step(): + if get_field('Extra-Source-Only', 'no') == 'yes': + # Ignore sources only referenced by Built-Using + continue + pkg = get_field('Package') + ver = get_field('Version') + # There may be multiple versions of the source package + # (in unstable) if some architectures have out-of-date + # binaries. We only ever consider the source with the + # largest version for migration. + if pkg in sources and apt_pkg.version_compare(sources[pkg][0], ver) > 0: + continue + maint = get_field('Maintainer') + if maint: + maint = intern(maint.strip()) + section = get_field('Section') + if section: + section = intern(section.strip()) + sources[intern(pkg)] = SourcePackage(intern(ver), + section, + [], + maint, + False, + ) + return sources