Handle locking exceptions if streaming clone can't lock the repo. (Issue324)
--- a/mercurial/localrepo.py Mon Nov 20 19:36:28 2006 +0100
+++ b/mercurial/localrepo.py Mon Nov 20 19:41:49 2006 +0100
@@ -1825,8 +1825,12 @@
except ValueError:
raise util.UnexpectedOutput(
_('Unexpected response from remote server:'), l)
- if resp != 0:
+ if resp == 1:
raise util.Abort(_('operation forbidden by server'))
+ elif resp == 2:
+ raise util.Abort(_('locking the remote repository failed'))
+ elif resp != 0:
+ raise util.Abort(_('the server sent an unknown error code'))
self.ui.status(_('streaming all changes\n'))
l = fp.readline()
try:
--- a/mercurial/streamclone.py Mon Nov 20 19:36:28 2006 +0100
+++ b/mercurial/streamclone.py Mon Nov 20 19:41:49 2006 +0100
@@ -7,7 +7,7 @@
from demandload import demandload
from i18n import gettext as _
-demandload(globals(), "os stat util")
+demandload(globals(), "os stat util lock")
# if server supports streaming clone, it advertises "stream"
# capability with value that is version+flags of repo it is serving.
@@ -65,18 +65,23 @@
fileobj.write('1\n')
return
- fileobj.write('0\n')
-
# get consistent snapshot of repo. lock during scan so lock not
# needed while we stream, and commits can happen.
- lock = repo.lock()
+ try:
+ repolock = repo.lock()
+ except (lock.LockHeld, lock.LockUnavailable), inst:
+ repo.ui.warn('locking the repository failed: %s\n' % (inst,))
+ fileobj.write('2\n')
+ return
+
+ fileobj.write('0\n')
repo.ui.debug('scanning\n')
entries = []
total_bytes = 0
for name, size in walkrepo(repo.path):
entries.append((name, size))
total_bytes += size
- lock.release()
+ repolock.release()
repo.ui.debug('%d files, %d bytes to transfer\n' %
(len(entries), total_bytes))