summaryrefslogtreecommitdiff
path: root/lib/git/index/util.py
diff options
context:
space:
mode:
authorSebastian Thiel <byronimo@gmail.com>2010-06-14 16:04:30 +0200
committerSebastian Thiel <byronimo@gmail.com>2010-06-14 16:04:30 +0200
commitaf32b6e0ad4ab244dc70a5ade0f8a27ab45942f8 (patch)
tree376afbb533280e6787a42c15f11d658e27c28eb8 /lib/git/index/util.py
parentd9240918aa03e49feabe43af619019805ac76786 (diff)
downloadgitpython-af32b6e0ad4ab244dc70a5ade0f8a27ab45942f8.tar.gz
index: split index file into multiple files of a single package. This didn't reduce the file size as much as I would have liked, but certainly is a start for further 'outsourcing'
Diffstat (limited to 'lib/git/index/util.py')
-rw-r--r--lib/git/index/util.py70
1 files changed, 70 insertions, 0 deletions
diff --git a/lib/git/index/util.py b/lib/git/index/util.py
new file mode 100644
index 00000000..cf09b095
--- /dev/null
+++ b/lib/git/index/util.py
@@ -0,0 +1,70 @@
+"""Module containing index utilities"""
+import struct
+import tempfile
+import os
+
+__all__ = ( 'TemporaryFileSwap', 'clear_cache', 'default_index' )
+
+#{ Aliases
+pack = struct.pack
+unpack = struct.unpack
+
+
+#} END aliases
+
+class TemporaryFileSwap(object):
+ """Utility class moving a file to a temporary location within the same directory
+ and moving it back on to where on object deletion."""
+ __slots__ = ("file_path", "tmp_file_path")
+
+ def __init__(self, file_path):
+ self.file_path = file_path
+ self.tmp_file_path = self.file_path + tempfile.mktemp('','','')
+ # it may be that the source does not exist
+ try:
+ os.rename(self.file_path, self.tmp_file_path)
+ except OSError:
+ pass
+
+ def __del__(self):
+ if os.path.isfile(self.tmp_file_path):
+ if os.name == 'nt' and os.path.exists(self.file_path):
+ os.remove(self.file_path)
+ os.rename(self.tmp_file_path, self.file_path)
+ # END temp file exists
+
+
+#{ Decorators
+
+def clear_cache(func):
+ """Decorator for functions that alter the index using the git command. This would
+ invalidate our possibly existing entries dictionary which is why it must be
+ deleted to allow it to be lazily reread later.
+
+ :note:
+ This decorator will not be required once all functions are implemented
+ natively which in fact is possible, but probably not feasible performance wise.
+ """
+ def clear_cache_if_not_raised(self, *args, **kwargs):
+ rval = func(self, *args, **kwargs)
+ self._delete_entries_cache()
+ return rval
+
+ # END wrapper method
+ clear_cache_if_not_raised.__name__ = func.__name__
+ return clear_cache_if_not_raised
+
+def default_index(func):
+ """Decorator assuring the wrapped method may only run if we are the default
+ repository index. This is as we rely on git commands that operate
+ on that index only. """
+ def check_default_index(self, *args, **kwargs):
+ if self._file_path != self._index_path():
+ raise AssertionError( "Cannot call %r on indices that do not represent the default git index" % func.__name__ )
+ return func(self, *args, **kwargs)
+ # END wrpaper method
+
+ check_default_index.__name__ = func.__name__
+ return check_default_index
+
+#} END decorators