components/mercurial/patches/issue4646.patch
author boris.chiu@oracle.com
Fri, 17 Jul 2015 12:11:28 -0700
changeset 4661 353f8a998732
parent 4263 078df530ebdb
permissions -rw-r--r--
PSARC 2015/310 IBTF and OFUV updates 20735273 libibverbs must support AH interfaces for PSIF 21055860 ib_write_bw/ib_send_bw not sending inline data for non-hermon hcas 20889536 remove some compiler warnings in libibverbs 21351609 Some sol_uverbs <-> libibverbs cmd/resp API structs not 64 bit aligned 20888202 remove Mellanox specific code from libibverbs 20449637 Open Fabrics tools/utilities should be LP64 only 20549008 open-fabrics should move from gcc3 to gcc4 21218536 qperf randomly cores when compiled with gcc 4.8.2

# HG changeset patch
# User Gregory Szorc <[email protected]>
# Date 1430931130 25200
#      Wed May 06 09:52:10 2015 -0700
# Branch stable
# Node ID 44b054c3a46eac63d5fed06ffb8fffc38d5668f6
# Parent  41cd8171e58f991373dcd0b4897dc1e5978d42dd
extensions: clear aftercallbacks after execution (issue4646)

It was reported that enabling pager without color could cause a hang.
Inserting print statements revealed that the callbacks in
extensions._aftercallbacks were being invoked twice.

extensions.loadall can be called multiple times. If entries in
extensions._aftercallbacks linger between calls, this could result
in double execution of the callbacks. This can lead to unwanted
behavior.

The reproduce steps in the bug seem to only occur when the output of
a command is less than the size of the current screen. This is not
something that can easily be tested. I verified the test case works
with this patch and that pager and color interaction continues to
work. Since we have no existing automated tests for pager, this sadly
appears to be the best testing I can do.

diff --git a/mercurial/extensions.py b/mercurial/extensions.py
--- a/mercurial/extensions.py
+++ b/mercurial/extensions.py
@@ -133,8 +133,12 @@ def loadall(ui):
 
         for fn in _aftercallbacks[shortname]:
             fn(loaded=False)
 
+    # loadall() is called multiple times and lingering _aftercallbacks
+    # entries could result in double execution. See issue4646.
+    _aftercallbacks.clear()
+
 def afterloaded(extension, callback):
     '''Run the specified function after a named extension is loaded.
 
     If the named extension is already loaded, the callback will be called
_______________________________________________
Mercurial-devel mailing list
[email protected]
http://selenic.com/mailman/listinfo/mercurial-devel