[PATCH 5 of 9 STABLE] gpg: make sign acquire wlock before processing

FUJIWARA Katsunori foozy at lares.dti.ne.jp
Tue Dec 1 12:18:43 CST 2015


# HG changeset patch
# User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
# Date 1448993528 -32400
#      Wed Dec 02 03:12:08 2015 +0900
# Branch stable
# Node ID e6dc1867c9b7fb47de43087bdaacbcd148430033
# Parent  c60cb46202d3d6ff082d21ef295edb975ebdfa33
gpg: make sign acquire wlock before processing

Before this patch, "hg sign" of gpg extension executes/evaluates below
without acquisition of wlock.

  - repo.dirstate.parents()
  - '.hgsigs' not in repo.dirstate

It may cause unintentional result, if another command runs parallelly
(see also issue4368).

To avoid this issue, this patch makes "hg sign" of gpg extension
acquire wlock before processing.

diff --git a/hgext/gpg.py b/hgext/gpg.py
--- a/hgext/gpg.py
+++ b/hgext/gpg.py
@@ -9,6 +9,7 @@ import os, tempfile, binascii
 from mercurial import util, commands, match, cmdutil, error
 from mercurial import node as hgnode
 from mercurial.i18n import _
+from mercurial import lock as lockmod
 
 cmdtable = {}
 command = cmdutil.command(cmdtable)
@@ -222,7 +223,14 @@ def sign(ui, repo, *revs, **opts):
 
     See :hg:`help dates` for a list of formats valid for -d/--date.
     """
-
+    wlock = None
+    try:
+        wlock = repo.wlock()
+        return _dosign(ui, repo, *revs, **opts)
+    finally:
+        lockmod.release(wlock)
+
+def _dosign(ui, repo, *revs, **opts):
     mygpg = newgpg(ui, **opts)
     sigver = "0"
     sigmessage = ""


More information about the Mercurial-devel mailing list