mirror of
https://git.launchpad.net/~ubuntu-release/britney/+git/britney2-ubuntu
synced 2025-02-23 19:31:55 +00:00
Move read_sources_file to utils
Signed-off-by: Niels Thykier <niels@thykier.net>
This commit is contained in:
parent
0f45b195a6
commit
c4be8436db
44
britney.py
44
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
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user