diff options
author | Sebastian Thiel <byronimo@gmail.com> | 2009-10-22 22:22:00 +0200 |
---|---|---|
committer | Sebastian Thiel <byronimo@gmail.com> | 2009-10-22 22:22:00 +0200 |
commit | b2a14e4b96a0ffc5353733b50266b477539ef899 (patch) | |
tree | ce48feb6d2da2bed92240c0fbd2350e05f7b7519 /lib/git/config.py | |
parent | 20c34a929a8b2871edd4fd44a38688e8977a4be6 (diff) | |
parent | ea33fe8b21d2b02f902b131aba0d14389f2f8715 (diff) | |
download | gitpython-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.py | 78 |
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 |