view treepkg/readconfig.py @ 387:c1f3be727f9d treepkg-status

renamed new status dir to info because of a naming conflict with status.py let the user specify a treepkg name in the config the name is propagated to PackagerGroup [treepkg] name: <treepkgname> becomes: pg = PackagerGroup(...) pg.name
author Bjoern Ricks <bricks@intevation.de>
date Thu, 08 Jul 2010 10:07:39 +0000
parents 41226e427823
children a690fc689f2f
line wrap: on
line source
# Copyright (C) 2007, 2008, 2009 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.

"""Reads the configuration file"""

import sys
import shlex
from ConfigParser import SafeConfigParser, NoOptionError

import util
import packager

def convert_bool(s):
    s = s.lower()
    if s in ("true", "yes", "1"):
        return True
    if s in ("false", "no", "0"):
        return False
    raise ValueError("cannot determine boolean value of %r" % (s,))


def convert_subversion_subset(raw):
    """Converts the string representation an svn subset into internal form
    The format in the config file is typically:
    svn_url: svn://example.com/repository/trunk
    svn_subset: -N .
                subdir1
                subdir2

    Each line of the svn_subset value consists of an optional flag
    followed by a subdirectory.  Empty lines are ignored.  Each
    non-empty line is split into words using shlex.split, so whitespace
    characters can be included in filenames using e.g. quotes (see the
    shlex documentation for details).  The only flag supported is -N
    which indicates that the subdirectory on that line is not to be
    checked out recursively.  If -N is given on a line, svn checkout
    will be called with -N as parameter.

    The example above will be converted into the internal form [('.',
    False), ('subdir1', True), ('subdir2', True)] used by the
    treepkg.subversion module.
    """
    subset = []
    for line in raw.splitlines():
        split = shlex.split(line)
        if len(split) < 1:
            # ignore empty lines
            continue
        subdir = split[-1]
        recurse = True
        flags = split[:-1]
        if flags:
            if flags == ["-N"]:
                recurse = False
            else:
                raise ValueError("Only -N is supported as flag, but flags = %r"
                                 % (flags,))
        subset.append((subdir, recurse))
    return subset


packager_desc = [
    "name", "base_dir",
    ("svn_url", str,""),
    ("svn_subset", convert_subversion_subset, ""),
    ("svn_externals", shlex.split, ""),
    ("rules_svn_url", str, ""), "packager_class",
    ("root_cmd", shlex.split, "sudo"), "builderconfig",
    "deb_email", "deb_fullname", ("deb_build_options", str, ""),
    ("version_template", str, "%(revision)s"),
    "pkg_revision_template", ("pkg_basename", str, ""),
    ("handle_dependencies", convert_bool),
    ("signing_key_id", str, ""),
    ("changelog_msg_template", str, "Update to revision %(revision)s"),
    ("git_branch", str,""),
    ("git_url", str,""),
    ("builder_cls",str,"PBuilder")
    ]

treepkg_desc = [
    ("check_interval", int),
    "instructions_file",
    ("name", str, "")
    ]


def read_config_section(parser, section, item_desc, defaults=None):
    if defaults is None:
        defaults = dict()
    options = dict()
    for item in item_desc:
        has_default_value = False
        if isinstance(item, tuple):
            key, converter = item[:2]
            if len(item) == 3:
                default_value = item[-1]
                has_default_value = True
        else:
            key = item
            converter = str
        try:
            value = parser.get(section, key, vars=defaults)
        except NoOptionError:
            if has_default_value:
                value = default_value
            else:
                print >>sys.stderr, "Missing option %r in section %r" \
                      % (key, section)
                sys.exit(1)
        options[key] = converter(value)
    return options


def read_config(filename):
    """Reads the tree packager configuration from the file given by filename.

    The function returns a tuple with a dict ('treepkg') and a list of
    dicts ('packagers').  The treepkg dict contains the main
    configuration of the tree packager.  The packagers list contains one
    dict with the configuratiin for each packager.
    """
    parser = SafeConfigParser()
    parser.read([filename])

    # extract packager configurations
    packagers = []
    for section in parser.sections():
        if section.startswith("pkg_"):
            vars = dict(name=section[4:])
            packager_class = parser.get(section, "packager_class", vars=vars)
            module = packager.import_packager_module(packager_class)
            desc = packager_desc + module.PackageTrack.extra_config_desc
            packager_options = (read_config_section(parser, section, desc,
                                                    defaults=vars))
            if not packager_options.get("svn_url") \
            and not packager_options.get('git_url'):
                print >>sys.stderr, "Missing repository URL in section %r" \
                                     % (section)
                sys.exit(1)
            elif packager_options.get("svn_url") \
            and packager_options.get('git_url'):
                print >>sys.stderr, \
                      "Warning: git_url in section %r will be ignored" \
                       % (section)
            packagers.append(read_config_section(parser, section, desc,
                                                 defaults=vars))

    # main config
    treepkg = read_config_section(parser, "treepkg", treepkg_desc)

    return treepkg, packagers


if __name__ == "__main__":
    import pprint
    print pprint.pprint(read_config(sys.argv[1]))
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)