summaryrefslogtreecommitdiff
path: root/lib/git/config.py
diff options
context:
space:
mode:
authorSebastian Thiel <byronimo@gmail.com>2009-10-22 22:22:00 +0200
committerSebastian Thiel <byronimo@gmail.com>2009-10-22 22:22:00 +0200
commitb2a14e4b96a0ffc5353733b50266b477539ef899 (patch)
treece48feb6d2da2bed92240c0fbd2350e05f7b7519 /lib/git/config.py
parent20c34a929a8b2871edd4fd44a38688e8977a4be6 (diff)
parentea33fe8b21d2b02f902b131aba0d14389f2f8715 (diff)
downloadgitpython-b2a14e4b96a0ffc5353733b50266b477539ef899.tar.gz
Merge branch 'index' into improvements
* index: Index: Is now diffable and appears to properly implement diffing against other items as well as the working tree default index writing now writes the index of the current repository in a fashion comparable to the native implementation Added test for ConcurrentWriteOperation utils: Added LockFile including test Index now behaves more like the default index if no explicit stream is given. It will lazily read its data on first access
Diffstat (limited to 'lib/git/config.py')
-rw-r--r--lib/git/config.py78
1 files changed, 10 insertions, 68 deletions
diff --git a/lib/git/config.py b/lib/git/config.py
index 6f979c73..ccfbae48 100644
--- a/lib/git/config.py
+++ b/lib/git/config.py
@@ -11,10 +11,12 @@ configuration files
import re
import os
import ConfigParser as cp
-from git.odict import OrderedDict
import inspect
import cStringIO
+from git.odict import OrderedDict
+from git.utils import LockFile
+
class _MetaParserBuilder(type):
"""
Utlity class wrapping base-class methods into decorators that assure read-only properties
@@ -70,7 +72,7 @@ def _set_dirty_and_flush_changes(non_const_func):
-class GitConfigParser(cp.RawConfigParser, object):
+class GitConfigParser(cp.RawConfigParser, LockFile):
"""
Implements specifics required to read git style configuration files.
@@ -100,6 +102,7 @@ class GitConfigParser(cp.RawConfigParser, object):
# list of RawConfigParser methods able to change the instance
_mutating_methods_ = ("add_section", "remove_section", "remove_option", "set")
+ __slots__ = ("_sections", "_defaults", "_file_or_files", "_read_only","_is_initialized")
def __init__(self, file_or_files, read_only=True):
"""
@@ -120,7 +123,6 @@ class GitConfigParser(cp.RawConfigParser, object):
self._file_or_files = file_or_files
self._read_only = read_only
- self._owns_lock = False
self._is_initialized = False
@@ -129,10 +131,11 @@ class GitConfigParser(cp.RawConfigParser, object):
raise ValueError("Write-ConfigParsers can operate on a single file only, multiple files have been passed")
# END single file check
- self._file_name = file_or_files
- if not isinstance(self._file_name, basestring):
- self._file_name = file_or_files.name
- # END get filename
+ if not isinstance(file_or_files, basestring):
+ file_or_files = file_or_files.name
+ # END get filename from handle/stream
+ # initialize lock base - we want to write
+ LockFile.__init__(self, file_or_files)
self._obtain_lock_or_raise()
# END read-only check
@@ -155,67 +158,6 @@ class GitConfigParser(cp.RawConfigParser, object):
finally:
self._release_lock()
- def _lock_file_path(self):
- """
- Return
- Path to lockfile
- """
- return "%s.lock" % (self._file_name)
-
- def _has_lock(self):
- """
- Return
- True if we have a lock and if the lockfile still exists
-
- Raise
- AssertionError if our lock-file does not exist
- """
- if not self._owns_lock:
- return False
-
- lock_file = self._lock_file_path()
- try:
- fp = open(lock_file, "r")
- pid = int(fp.read())
- fp.close()
- except IOError:
- raise AssertionError("GitConfigParser has a lock but the lock file at %s could not be read" % lock_file)
-
- if pid != os.getpid():
- raise AssertionError("We claim to own the lock at %s, but it was not owned by our process: %i" % (lock_file, os.getpid()))
-
- return True
-
- def _obtain_lock_or_raise(self):
- """
- Create a lock file as flag for other instances, mark our instance as lock-holder
-
- Raise
- IOError if a lock was already present or a lock file could not be written
- """
- if self._has_lock():
- return
-
- lock_file = self._lock_file_path()
- if os.path.exists(lock_file):
- raise IOError("Lock for file %r did already exist, delete %r in case the lock is illegal" % (self._file_name, lock_file))
-
- fp = open(lock_file, "w")
- fp.write(str(os.getpid()))
- fp.close()
-
- self._owns_lock = True
-
- def _release_lock(self):
- """
- Release our lock if we have one
- """
- if not self._has_lock():
- return
-
- os.remove(self._lock_file_path())
- self._owns_lock = False
-
def optionxform(self, optionstr):
"""
Do not transform options in any way when writing