summaryrefslogtreecommitdiff
path: root/lib/git/config.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/git/config.py')
-rw-r--r--lib/git/config.py24
1 files changed, 18 insertions, 6 deletions
diff --git a/lib/git/config.py b/lib/git/config.py
index 0187af1d..b555677e 100644
--- a/lib/git/config.py
+++ b/lib/git/config.py
@@ -23,8 +23,6 @@ class _MetaParserBuilder(type):
Equip all base-class methods with a _needs_values decorator, and all non-const methods
with a _set_dirty_and_flush_changes decorator in addition to that.
"""
- new_type = super(_MetaParserBuilder, metacls).__new__(metacls, name, bases, clsdict)
-
mutating_methods = clsdict['_mutating_methods_']
for base in bases:
methods = ( t for t in inspect.getmembers(base, inspect.ismethod) if not t[0].startswith("_") )
@@ -35,9 +33,11 @@ class _MetaParserBuilder(type):
if name in mutating_methods:
method_with_values = _set_dirty_and_flush_changes(method_with_values)
# END mutating methods handling
+
clsdict[name] = method_with_values
# END for each base
+ new_type = super(_MetaParserBuilder, metacls).__new__(metacls, name, bases, clsdict)
return new_type
@@ -98,7 +98,7 @@ class GitConfigParser(cp.RawConfigParser, object):
)
# list of RawConfigParser methods able to change the instance
- _mutating_methods_ = ("remove_section", "remove_option", "set")
+ _mutating_methods_ = ("add_section", "remove_section", "remove_option", "set")
def __init__(self, file_or_files, read_only=True):
"""
@@ -141,8 +141,10 @@ class GitConfigParser(cp.RawConfigParser, object):
"""
Write pending changes if required and release locks
"""
- if self.read_only:
- return
+ # checking for the lock here makes sure we do not raise during write()
+ # in case an invalid parser was created who could not get a lock
+ if self.read_only or not self._has_lock():
+ return
try:
try:
@@ -242,7 +244,7 @@ class GitConfigParser(cp.RawConfigParser, object):
close_fp = False
# assume a path if it is not a file-object
if not hasattr(file_object, "seek"):
- fp = open(file_object, "w")
+ fp = open(file_object)
close_fp = True
# END fp handling
@@ -271,6 +273,7 @@ class GitConfigParser(cp.RawConfigParser, object):
map(lambda t: write_section(t[0],t[1]), self._sections.items())
+ @_needs_values
def write(self):
"""
Write changes to our file, if there are changes at all
@@ -307,6 +310,15 @@ class GitConfigParser(cp.RawConfigParser, object):
if self.read_only:
raise IOError("Cannot execute non-constant method %s.%s" % (self, method_name))
+ @_needs_values
+ @_set_dirty_and_flush_changes
+ def add_section(self, section):
+ """
+ Assures added options will stay in order
+ """
+ super(GitConfigParser, self).add_section(section)
+ self._sections[section] = OrderedDict()
+
@property
def read_only(self):
"""