# HG changeset patch # User FUJIWARA Katsunori # Date 2015-12-08 23:28:53 # Node ID c9ceea3f2d8e352efe13b1b6e5d98f84bdf19b2f # Parent 528cf1a73ae54454c946d21c2a27090b61cf02f8 shelve: widen wlock scope of unshelve for consistency while processing Before this patch, "hg unshelve" of shelve extension executes below before acquisition of wlock: - cmdutil.checkunfinished() - examine existence of (specified) shelve file It may cause unintentional result, if another command runs parallelly (see also issue4368). This patch widens wlock scope of "hg unshelve" of shelve extension for consistency while processing. diff --git a/hgext/shelve.py b/hgext/shelve.py --- a/hgext/shelve.py +++ b/hgext/shelve.py @@ -616,6 +616,13 @@ def unshelve(ui, repo, *shelved, **opts) than ``maxbackups`` backups are kept, if same timestamp prevents from deciding exact order of them, for safety. """ + wlock = repo.wlock() + try: + return _dounshelve(ui, repo, *shelved, **opts) + finally: + lockmod.release(wlock) + +def _dounshelve(ui, repo, *shelved, **opts): abortf = opts['abort'] continuef = opts['continue'] if not abortf and not continuef: @@ -656,11 +663,10 @@ def unshelve(ui, repo, *shelved, **opts) raise error.Abort(_("shelved change '%s' not found") % basename) oldquiet = ui.quiet - wlock = lock = tr = None + lock = tr = None forcemerge = ui.backupconfig('ui', 'forcemerge') try: ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'unshelve') - wlock = repo.wlock() lock = repo.lock() tr = repo.transaction('unshelve', report=lambda x: None) @@ -755,7 +761,7 @@ def unshelve(ui, repo, *shelved, **opts) ui.quiet = oldquiet if tr: tr.release() - lockmod.release(lock, wlock) + lockmod.release(lock) ui.restoreconfig(forcemerge) @command('shelve',