summaryrefslogtreecommitdiff
path: root/gbp/config.py
diff options
context:
space:
mode:
Diffstat (limited to 'gbp/config.py')
-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-'):