Skip to content
Commits on Source (5)
blends (0.6.103) UNRELEASED; urgency=medium
blends (0.6.103) experimental; urgency=low
[ Andreas Tille ]
* d/control:
- Build-Depends: dh-python, python3-all
- blends-dev: Depends: ${python3:Depends}
......@@ -7,8 +8,12 @@ blends (0.6.103) UNRELEASED; urgency=medium
* ignore false lintian warning binary-package-depends-on-toolchain-package
* cme fix dpkg-control
* Take over tasks_diff from blends-gsoc to create dependency_data
* Use Deb822List to evaluate taskprefix in tasks_diff
[ Ole Streicher ]
* Add UDD query options to blend-gen-control
-- Andreas Tille <tille@debian.org> Wed, 28 Mar 2018 16:22:10 +0200
-- Ole Streicher <olebole@debian.org> Thu, 29 Mar 2018 21:33:29 +0200
blends (0.6.102) experimental; urgency=low
......@@ -449,7 +454,7 @@ blends (0.6.3) unstable; urgency=low
* Section for cdd-common misc instead of devel
* Updated mailing list address of Debian Pure Blends team
* devtools/blends-gen-control:
* devtools/blends-gen-control:
- If a task lists not a single package which is available in
the target distribution the metapackage will be suppressed
if option '-S' is set; there is one exception which is needed
......@@ -736,7 +741,7 @@ cdd (0.3.10) unstable; urgency=low
* Otavio Salvador
- cdd-gen-control:
o Add -D suport to cdd-gen-control to degrade dependencies to
recommends;
recommends;
o Add support for architecture dependent packages;
o Add fallback to architecture independent packages so allow
backward compatibility;
......
......@@ -12,7 +12,7 @@ Build-Depends-Indep: xmlto,
dblatex,
w3m,
dh-python,
python3-all
python3
Standards-Version: 4.1.3
Vcs-Browser: https://salsa.debian.org/blends-team/blends
Vcs-Git: https://salsa.debian.org/blends-team/blends.git
......@@ -21,7 +21,7 @@ Package: blends-dev
Architecture: all
Depends: debconf,
make | build-essential,
debhelper (>= 9),
debhelper (>= 9),python3,
${misc:Depends},
${python3:Depends}
Suggests: blends-doc
......
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Files: *
Copyright: © 2003-2012 Andreas Tille <tille@debian.org>
License: GPL-2+
Files: devtools/blend-gen-control
Copyright: © 2003-2007 Petter Reinholdtsen <pere@debian.org>
© 2007-2012 Andreas Tille <tille@debian.org>
Copyright: © 2018 Ole Streicher <olebole@debian.org>
License: GPL-2+
Files: share/blends/*
......
......@@ -100,6 +100,12 @@ class Blend:
self.update(cache)
return self
@property
def all(self):
'''All Base Dependencies of this task
'''
return list(itertools.chain(*(t.all for t in self.tasks)))
def fix_dependencies(self):
'''Fix the dependencies according to available packages
......@@ -122,8 +128,8 @@ class Blend:
all_task = Task(
self, "all",
'''Description: Default selection of tasks for {task.title}
This package is part of the {task.title} Pure Blend and installs all
tasks for a default installation of this blend.'''.format(task=self),
This package is part of the {task.title} Pure Blend and installs all
tasks for a default installation of this blend.'''.format(task=self),
base_deps = ['${misc:Depends}'])
for task in tasks:
if task.install:
......@@ -458,8 +464,9 @@ class Task:
pkg = cache.get(dep.name)
if pkg is not None:
dep.target_versions += pkg.versions
for pkg in cache.get_providing_packages(dep.name):
dep.target_versions += pkg.versions
if hasattr(cache, 'get_providing_packages'):
for pkg in cache.get_providing_packages(dep.name):
dep.target_versions += pkg.versions
def __iadd__(self, cache):
self.update(cache)
......@@ -699,34 +706,91 @@ class Deb822List(list):
return fd.getvalue()
def aptcache(distribution = None):
def aptcache(release = None, srcdirs = [ '/etc/blends' ]):
'''Open and update a (temporary) apt cache for the specified distribution.
:param release: Distribution name
:param srcdirs: List of directories to search for ``sources.list.<<release>>``
If the distribution is not given, use the system's cache without update.
'''
import tempfile
import apt
if distribution is None:
if release is None:
return apt.Cache()
d = tempfile.mkdtemp()
os.makedirs(os.path.join(d, 'etc', 'apt'))
shutil.copytree('/etc/apt/trusted.gpg.d',
os.path.join(d, 'etc', 'apt', 'trusted.gpg.d'))
shutil.copy('/etc/blends/sources.list.{}'.format(distribution),
os.path.join(d, 'etc', 'apt', 'sources.list'))
c = apt.Cache(rootdir=d, memonly=True)
c.update()
c.open()
shutil.rmtree(d)
return c
rootdir = tempfile.mkdtemp()
try:
os.makedirs(os.path.join(rootdir, 'etc', 'apt'))
shutil.copytree('/etc/apt/trusted.gpg.d',
os.path.join(rootdir, 'etc', 'apt', 'trusted.gpg.d'))
for src_dir in srcdirs:
sources_list = os.path.join(src_dir,
'sources.list.{}'.format(release))
if os.path.exists(sources_list):
shutil.copy(sources_list,
os.path.join(rootdir, 'etc', 'apt', 'sources.list'))
break
else:
raise OSError("sources.list not found in " + str(srcdirs))
cache = apt.Cache(rootdir=rootdir, memonly=True)
cache.update()
cache.open()
finally:
shutil.rmtree(rootdir)
return cache
def uddcache(release, packages, **db_args):
'''Create a ``dict`` from UDD that is roughly modelled after ``apt.Cache``.
The ``dict`` just resolves the version number and archs for the packages.
For performance reasons, an initial package list needs to be given.
:param release: Distribution name
:param packages: Initial package list
:param db_args: UDD connection parameters
``Provided`` dependencies are integrated in the returned ``dict``.
'''
import collections
import psycopg2
pkgtuple = tuple(set(p.name for p in packages))
Package = collections.namedtuple('Package',
('name', 'versions',))
Version = collections.namedtuple('Version',
('package', 'architecture', 'version'))
stmt = '''SELECT packages.package,
packages.provides,
packages.architecture,
packages.version
FROM packages, releases
WHERE packages.release=releases.release
AND (releases.release=%s OR releases.role=%s)
AND (packages.package IN %s OR packages.provides in %s);'''
with psycopg2.connect(**db_args) as conn:
cursor = conn.cursor()
cursor.execute(stmt, (release, release, pkgtuple, pkgtuple))
cache = dict()
for package, provides, arch, version in cursor:
p = cache.setdefault(package, Package(package, []))
p.versions.append(Version(p, arch, version))
if provides:
pp = cache.setdefault(provides, Package(package, []))
pp.versions.append(Version(p, arch, version))
return cache
if __name__ == '__main__':
import sys
import argparse
blend_dev_dir = "/usr/share/blends-dev/"
default_release = "testing"
parser = argparse.ArgumentParser()
......@@ -765,10 +829,30 @@ if __name__ == '__main__':
action="store_true", default=False,
help="modify tasks desc file in case the blend uses udebs")
parser.add_argument("-U", '--upgrade-tasks', dest="upgrade_tasks",
parser.add_argument("-F", '--upgrade-task-format', dest="upgrade_tasks",
action="store_true", default=False,
help="Upgrade tasks files to the latest format version")
parser.add_argument("-U", "--udd", dest="udd",
action="store_true", default=False,
help="Query UDD instead of apt")
parser.add_argument("--udd-host", dest="udd_host",
default="udd-mirror.debian.net",
help="UDD host name (default: udd-mirror.debian.net)")
parser.add_argument("--udd-user", dest="udd_user",
default="udd-mirror",
help="UDD user (default: udd-mirror)")
parser.add_argument("--udd-password", dest="udd_password",
default="udd-mirror",
help="UDD password (default: udd-mirror)")
parser.add_argument("--udd-database", dest="udd_database",
default="udd",
help="UDD database name (default: udd)")
args = parser.parse_args()
if args.release == "current":
......@@ -781,7 +865,13 @@ if __name__ == '__main__':
if not task.is_metapackage:
blend.tasks.remove(task)
blend += aptcache(args.release)
if args.udd:
blend += uddcache(args.release, blend.all, host=args.udd_host,
user=args.udd_user, password=args.udd_password,
database=args.udd_database)
else:
blend += aptcache(args.release, [ args.dir, '/etc/blends' ])
missing = blend.fix_dependencies()
if args.suppressempty:
......