summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>2013-03-25 10:56:47 +0200
committerTzafrir Cohen <tzafrir@debian.org>2015-03-26 14:27:44 +0200
commit17260812385a4107835b3095acb540ecfd534fd9 (patch)
treefa040bc71fce7bc28168da15849d3ac4a9f88896
parentc769b660911de03a8bf7ffb6e22991646b486790 (diff)
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 <markus.lehtonen@linux.intel.com>
-rw-r--r--gbp/config.py25
1 files 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-'):