Mercurial > hg
view tests/test-demandimport.py @ 27464:c39ecb2b86b3
fileset: detect unintentional existing() invocation at runtime
A fileset predicate can invoke 'matchctx.existing()' successfully,
even if it isn't marked as "existing caller". It is aborted only in
some corner cases: e.g. there were one deleted file in the working
directory (see 8a0513bf030a for detail).
This patch makes 'matchctx.existing()' invocation abort if not
'_existingenabled', which is true only while "existing caller"
running.
After this changes, non-"existing caller" predicate function is
aborted immediately, whenever it invokes 'matchctx.existing()'. This
prevent developer from forgetting to mark a predicate as "existing
caller".
BTW, unintentional 'matchctx.status()' invocation can be detected
easily without any additional trick like this patch, because it
returns 'None' if a predicate isn't marked as "status caller", and
referring field (e.g. '.modified') of it is always aborted.
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Mon, 21 Dec 2015 22:31:16 +0900 |
parents | 2205d00b6d2b |
children | 0d0f4070f6d7 |
line wrap: on
line source
from mercurial import demandimport demandimport.enable() import os if os.name != 'nt': try: import distutils.msvc9compiler print ('distutils.msvc9compiler needs to be an immediate ' 'importerror on non-windows platforms') distutils.msvc9compiler except ImportError: pass import re rsub = re.sub def f(obj): l = repr(obj) l = rsub("0x[0-9a-fA-F]+", "0x?", l) l = rsub("from '.*'", "from '?'", l) l = rsub("'<[a-z]*>'", "'<whatever>'", l) return l import os print "os =", f(os) print "os.system =", f(os.system) print "os =", f(os) from mercurial import util print "util =", f(util) print "util.system =", f(util.system) print "util =", f(util) print "util.system =", f(util.system) import re as fred print "fred =", f(fred) import sys as re print "re =", f(re) print "fred =", f(fred) print "fred.sub =", f(fred.sub) print "fred =", f(fred) print "re =", f(re) print "re.stderr =", f(re.stderr) print "re =", f(re) demandimport.disable() os.environ['HGDEMANDIMPORT'] = 'disable' demandimport.enable() from mercurial import node print "node =", f(node)