view bin/treepkgbuilder.py @ 191:94fb3f3ab58b

When building a subset of tracks, make sure new packages are added to pbuilder even if the tracks that depend on them are not being built. To achieve this, the information which tracks are to be built is now stored as the do_build flag in the individual tracks and not by passing only a subset of the tracks ot the PackagerGroup. Otherwise the PackagerGroup would not determine the dependencies correctly.
author Bernhard Herzog <bh@intevation.de>
date Wed, 30 Jul 2008 19:23:10 +0000
parents 83c77307ffb1
children eaadf5350a1a
line wrap: on
line source
#! /usr/bin/python2.4
# Copyright (C) 2007, 2008 by Intevation GmbH
# Authors:
# Bernhard Herzog <bh@intevation.de>
#
# This program is free software under the GPL (>=v2)
# Read the file COPYING coming with the software for details.

"""Usage: treepkgbuilder COMMAND [options]

Manage the pbuilder environment for a tree packager installation.  The
pbuilder settings are taken from the configuration file, either the
default treepkg.cfg or the one given with the --config-file option.
Also, this script assumes that there is only one pbuilder setting for
all packagers.  Use treepkgbuilder COMMAND --help for more details about
the commands.
"""

import sys

import treepkgcmd
from treepkg.options import create_parser
from treepkg.packager import create_package_track, PackagerGroup
from treepkg.readconfig import read_config


class Command(object):

    names = ()

    def __init__(self, arguments):
        parser = self.create_parser()
        self.opts, self.rest = parser.parse_args(arguments)

    def create_parser(self):
        return create_parser()

    def read_config(self):
        self.treepkg_opts, self.packager_opts \
                           = read_config(self.opts.config_file)

    def get_builder(self):
        self.read_config()
        group = PackagerGroup([create_package_track(**opts)
                               for opts in self.packager_opts],
                              **self.treepkg_opts)
        track = group.get_package_tracks()[0]
        return track.builder



class InitCommand(Command):

    names = ("init",)

    def __init__(self, arguments):
        super(InitCommand, self).__init__(arguments)
        if self.opts.mirrorsite is None:
            print >>sys.stderr, "Missing required option --mirrorsite"
            sys.exit(1)

    def create_parser(self):
        parser = super(InitCommand, self).create_parser()
        parser.set_defaults(distribution="etch")
        parser.add_option("--mirrorsite",
                          help=("The debian mirror site"
                                " (pbuilder MIRRORSITE setting).  Required."))
        parser.add_option("--othermirror",
                          help=("Extra contents of the OTHERMIRROR setting."
                                " See the pbuilder documentation for the"
                                " format."))
        parser.add_option("--distribution",
                          help=("The debian distribution for the pbuilder"
                                " chroot. Default is etch."))
        return parser

    def run(self):
        builder = self.get_builder()
        builder.init_pbuilder(distribution=self.opts.distribution,
                              mirrorsite=self.opts.mirrorsite,
                              extramirrors=self.opts.othermirror)


class UpdateCommand(Command):

    names = ("update",)

    def run(self):
        builder = self.get_builder()
        builder.update(suppress_output=False, log_info=False)


class AddKeyCommand(Command):

    names = ("addkey", "add-key")

    def __init__(self, arguments):
        super(AddKeyCommand, self).__init__(arguments)
        if not self.opts.key_id:
            print >>sys.stderr, "No key id given"
            sys.exit(1)

    def create_parser(self):
        parser = super(AddKeyCommand, self).create_parser()
        parser.add_option("--key-id",
                          help=("The id of the key to add.  Required."))
        return parser

    def run(self):
        builder = self.get_builder()
        builder.add_apt_key(self.opts.key_id)


class HelpCommand(Command):

    names = ("help", "--help", "-h")

    def run(self):
        print __doc__.rstrip()
        print "Supported commands:"
        commands = sorted((cmd for cmd in iter_commands() if cmd.names),
                          key=lambda cmd: cmd.names[0])
        for cmd in commands:
            print "   ", " ".join(cmd.names)


def iter_commands():
    for key, obj in globals().items():
        if key.endswith("Command"):
            yield obj

def get_command_class(name):
    for obj in iter_commands():
        if name in obj.names:
            return obj
    return None


def main():
    arguments = sys.argv[1:]

    if len(arguments) < 1:
        print >>sys.stderr, "Missing command"
        sys.exit(1)

    command_name = arguments[0]
    arguments = arguments[1:]

    command_class = get_command_class(command_name)
    if command_class is None:
        print >>sys.stderr, "Unknown command %r" % command_name
        sys.exit(1)

    command = command_class(arguments)
    command.run()


main()
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)