subrepo: ensure "lock.release()" execution at the end of "storeclean()"
Before this patch, "lock.release()" for "self._repo" in "storeclean()"
of "hgsubrepo" may not be executed, if unexpected exception is raised,
because it isn't executed in "finally" clause.
This patch ensures "lock.release()" execution at the end of
"storeclean()" by moving it into "finally" clause.
This patch chooses moving almost all lines in "storeclean()" into
"_storeclean()" instead of indenting them for "try/finally" clauses,
to keep diff simple for review-ability.
--- a/mercurial/subrepo.py Mon Jul 07 18:45:46 2014 +0900
+++ b/mercurial/subrepo.py Fri Jun 20 00:21:19 2014 +0900
@@ -525,8 +525,14 @@
self._initrepo(r, state[0], create)
def storeclean(self, path):
+ lock = self._repo.lock()
+ try:
+ return self._storeclean(path)
+ finally:
+ lock.release()
+
+ def _storeclean(self, path):
clean = True
- lock = self._repo.lock()
itercache = self._calcstorehash(path)
try:
for filehash in self._readstorehashcache(path):
@@ -543,7 +549,6 @@
clean = False
except StopIteration:
pass
- lock.release()
return clean
def _calcstorehash(self, remotepath):