Mercurial > public > mercurial-scm > hg-stable
diff mercurial/debugcommands.py @ 35402:12055fb3ba30
debuglocks: allow setting a lock
author | Paul Morelle <paul.morelle@octobus.net> |
---|---|
date | Sun, 12 Nov 2017 15:34:46 +0100 |
parents | a43b2dd95e4f |
children | dffc35a5be9f |
line wrap: on
line diff
--- a/mercurial/debugcommands.py Sun Nov 12 15:34:19 2017 +0100 +++ b/mercurial/debugcommands.py Sun Nov 12 15:34:46 2017 +0100 @@ -1275,7 +1275,10 @@ @command('debuglocks', [('L', 'force-lock', None, _('free the store lock (DANGEROUS)')), ('W', 'force-wlock', None, - _('free the working state lock (DANGEROUS)'))], + _('free the working state lock (DANGEROUS)')), + ('s', 'set-lock', None, _('set the store lock until stopped')), + ('S', 'set-wlock', None, + _('set the working state lock until stopped'))], _('[OPTION]...')) def debuglocks(ui, repo, **opts): """show or modify state of locks @@ -1294,6 +1297,10 @@ instance, on a shared filesystem). Removing locks may also be blocked by filesystem permissions. + Setting a lock will prevent other commands from changing the data. + The command will wait until an interruption (SIGINT, SIGTERM, ...) occurs. + The set locks are removed when the command exits. + Returns 0 if no locks are held. """ @@ -1305,6 +1312,24 @@ if opts.get(r'force_lock') or opts.get(r'force_wlock'): return 0 + locks = [] + try: + if opts.get(r'set_wlock'): + try: + locks.append(repo.wlock(False)) + except error.LockHeld: + raise error.Abort(_('wlock is already held')) + if opts.get(r'set_lock'): + try: + locks.append(repo.lock(False)) + except error.LockHeld: + raise error.Abort(_('lock is already held')) + if len(locks): + ui.promptchoice(_("ready to release the lock (y)? $$ &Yes")) + return 0 + finally: + release(*locks) + now = time.time() held = 0