# HG changeset patch # User Bernhard Herzog # Date 1214329934 0 # Node ID df7498d0bd9da9dbb4211e3383f718c5329611f8 # Parent 7bde59aa611eb0084a04e2ae631cce8948645dcc Add bin/treepkgbuilder.py, a script to manage treepkg's pbuilder instance diff -r 7bde59aa611e -r df7498d0bd9d bin/treepkgbuilder.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bin/treepkgbuilder.py Tue Jun 24 17:52:14 2008 +0000 @@ -0,0 +1,137 @@ +#! /usr/bin/python2.4 +# Copyright (C) 2007, 2008 by Intevation GmbH +# Authors: +# Bernhard Herzog +# +# 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 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()