From 17260812385a4107835b3095acb540ecfd534fd9 Mon Sep 17 00:00:00 2001 From: Markus Lehtonen Date: Mon, 25 Mar 2013 10:56:47 +0200 Subject: config: support for per-tree config files Add support for reading the local config file(s) from a given git tree-ish. Signed-off-by: Markus Lehtonen --- gbp/config.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/gbp/config.py b/gbp/config.py index 9f8e7fc..32d7de5 100644 --- a/gbp/config.py +++ b/gbp/config.py @@ -20,6 +20,7 @@ from optparse import OptionParser, OptionGroup, Option, OptionValueError from six.moves import configparser from copy import copy import os.path +import tempfile try: from gbp.version import gbp_version @@ -350,13 +351,26 @@ class GbpOptionParser(OptionParser): files = [fname for fname in files if fname.startswith('/')] return files - def _read_config_file(self, parser, repo, filename): + def _read_config_file(self, parser, repo, filename, git_treeish): """Read config file""" str_fields = {} if repo: str_fields['git_dir'] = repo.git_dir if not repo.bare: str_fields['top_dir'] = repo.path + + # Read per-tree config file + if repo and git_treeish and filename.startswith('%(top_dir)s/'): + with tempfile.TemporaryFile() as tmp: + relpath = filename.replace('%(top_dir)s/', '') + try: + config = repo.show('%s:%s' % (git_treeish, relpath)) + tmp.writelines(config) + except GitRepositoryError: + pass + tmp.seek(0) + parser.readfp(tmp) + return try: filename = filename % str_fields except KeyError: @@ -364,7 +378,7 @@ class GbpOptionParser(OptionParser): return parser.read(filename) - def parse_config_files(self): + def parse_config_files(self, git_treeish=None): """ Parse the possible config files and set appropriate values default values @@ -381,7 +395,7 @@ class GbpOptionParser(OptionParser): repo = None # Read all config files for filename in config_files: - self._read_config_file(parser, repo, filename) + self._read_config_file(parser, repo, filename, git_treeish) self.config.update(dict(parser.defaults())) # Make sure we read any legacy sections prior to the real subcommands @@ -425,7 +439,8 @@ class GbpOptionParser(OptionParser): else: self.config['filter'] = [] - def __init__(self, command, prefix='', usage=None, sections=[]): + def __init__(self, command, prefix='', usage=None, sections=[], + git_treeish=None): """ @param command: the command to build the config parser for @type command: C{str} @@ -441,7 +456,7 @@ class GbpOptionParser(OptionParser): self.sections = sections self.prefix = prefix self.config = {} - self.parse_config_files() + self.parse_config_files(git_treeish) self.valid_options = [] if self.command.startswith('git-') or self.command.startswith('gbp-'): -- cgit v1.2.3