subrepo: ensure "lock.release()" execution at the end of "_cachestorehash()"
Before this patch, "lock.release()" for "self._repo" in
"_cachestorehash()" 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
"_cachestorehash()" by moving it into "finally" clause.
--- a/mercurial/subrepo.py Fri Jun 20 00:21:19 2014 +0900
+++ b/mercurial/subrepo.py Fri Jun 20 00:21:19 2014 +0900
@@ -586,14 +586,16 @@
'''
cachefile = self._getstorehashcachepath(remotepath)
lock = self._repo.lock()
- storehash = list(self._calcstorehash(remotepath))
- cachedir = os.path.dirname(cachefile)
- if not os.path.exists(cachedir):
- util.makedirs(cachedir, notindexed=True)
- fd = open(cachefile, 'w')
- fd.writelines(storehash)
- fd.close()
- lock.release()
+ try:
+ storehash = list(self._calcstorehash(remotepath))
+ cachedir = os.path.dirname(cachefile)
+ if not os.path.exists(cachedir):
+ util.makedirs(cachedir, notindexed=True)
+ fd = open(cachefile, 'w')
+ fd.writelines(storehash)
+ fd.close()
+ finally:
+ lock.release()
@annotatesubrepoerror
def _initrepo(self, parentrepo, source, create):