From 54844a90b97fd7854e53a9aec85bf60564362a02 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Thu, 10 Dec 2009 21:05:57 +0100 Subject: index: TempFileMover now handles the case that the file to move does not exist more gracefully Added BlockingLockFile which may be used to wait for the lock according to some criteria --- lib/git/index.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'lib/git/index.py') diff --git a/lib/git/index.py b/lib/git/index.py index 64a25a70..991c77da 100644 --- a/lib/git/index.py +++ b/lib/git/index.py @@ -57,7 +57,11 @@ class _TemporaryFileSwap(object): def __init__(self, file_path): self.file_path = file_path self.tmp_file_path = self.file_path + tempfile.mktemp('','','') - os.rename(self.file_path, self.tmp_file_path) + # 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): @@ -556,6 +560,7 @@ class IndexFile(LazyMixin, diff.Diffable): repo.git.read_tree(*arg_list, **kwargs) index = cls(repo, tmp_index) index.entries # force it to read the file as we will delete the temp-file + del(index_handler) # release as soon as possible finally: if os.path.exists(tmp_index): os.remove(tmp_index) @@ -763,9 +768,6 @@ class IndexFile(LazyMixin, diff.Diffable): Returns Tree object representing this index """ - index_path = self._index_path() - tmp_index_mover = _TemporaryFileSwap(index_path) - # IMPORTANT: If we have TREE extension data, it will actually # ignore the index and write the stored tree instead. Hence we # temporarily forget about it, and in fact I don't know what git @@ -776,9 +778,14 @@ class IndexFile(LazyMixin, diff.Diffable): self._extension_data = '' # END extension data special handling + index_path = self._index_path() + tmp_index_mover = _TemporaryFileSwap(index_path) + self.write(index_path) tree_sha = self.repo.git.write_tree(missing_ok=missing_ok) + del(tmp_index_mover) # as soon as possible + if stored_ext_data: self._extension_data = stored_ext_data # END reset stored exstension data -- cgit v1.2.1