Gregory Szorc <gregory.szorc@gmail.com> [Sun, 20 Dec 2015 18:56:05 -0800] rev 27468
revlog: refactor delta chain computation into own function
This code is already written in multiple locations.
While this code needs to be fast and extracting it to its own function
adds overhead, code paths reading delta chains typically read,
decompress, and do binary patching on revlog data from the delta chain.
This other work (especially zlib decompression) almost certainly
accounts for a lot more time than the overhead of introducing a Python
function call. So I'm not worried about the performance impact of this
change.
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 20 Dec 2015 17:57:44 -0800] rev 27467
perf: call clearcaches() in perfmanifest
The old code only partially cleared the caches. Now that we have a
comprehensive method for wiping all caches, let's call it.
This appears to introduce a marginal regression in `hg perfmanifest`
on mozilla-central. This is good because the new result is more
accurate since caches aren't being used.
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 20 Dec 2015 19:31:46 -0800] rev 27466
manifest: implement clearcaches()
The manifest implements its own caches in addition to revlog's. Extend
the base clearcaches() to wipe these as well.
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 20 Dec 2015 17:48:20 -0800] rev 27465
revlog: make clearcaches() more effective
clearcaches() was added several years ago in
e8d37b78acfb as part
of implementing a perf command. Since revlog instances have many caches
and since the spirit of this mostly unused method is to facilitate
performance testing, I think it's appropriate for all the revlog's
caches to get cleared when it is called.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 21 Dec 2015 22:31:16 +0900] rev 27464
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.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 21 Dec 2015 22:31:16 +0900] rev 27463
fileset: use set instead of list to mark predicates for efficiency (API)
This reduces cost of examining whether given predicate calls
'matchctx.status()' or 'matchctx.existing()' in 'getfileset()' at
runtime.
This kind of examination is used also in subsequent patch, which
detects unintentional 'matchctx.existing()' invocation per each
predicate evaluation.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 21 Dec 2015 22:31:16 +0900] rev 27462
fileset: use decorator to mark a predicate as "existing caller"
This can localize changes for adding (or removing) an "existing
caller" predicate function in source code.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 21 Dec 2015 22:31:16 +0900] rev 27461
fileset: use decorator to mark a predicate as "status caller"
Before this patch, predicates calling 'matchctx.status()' are listed
up by immediate list value in 'getfileset()'.
This prevents 3rd party extensions from adding specific predicate
calling 'matchctx.status()'.
This uses decorator to mark a predicate as "status caller".
This can also localize changes for adding (or removing) a "status
caller" predicate function in source code.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 21 Dec 2015 22:31:16 +0900] rev 27460
fileset: use decorator to mark a function as fileset predicate
Using decorator can localize changes for adding (or removing) a
fileset predicate function in source code.
It is also useful to pick predicates up for specific purpose. For
example, subsequent patches marks predicates as "call status" or "use
existing" via decorator.
To avoid (1) redundancy between "predicate name" and (the beginning
of) help document, and (2) accidental typo of help document, this
patch also makes decorator put predicate declration into the beginning
of help.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 21 Dec 2015 22:31:16 +0900] rev 27459
fileset: treat encoding and eol as the predicate calling _existing
Before this patch, predicate function 'encoding' and 'eol' aren't
listed up in '_existingcallers', even though they invoke 'existing()'.
This causes unexpected failure of these predicate, if there is a
(manually) deleted file in the working directory.
8a0513bf030a and
3ce3f2b059a1 seem to overlook putting already
existing 'encoding' or newly introduced 'eol' into '_existingcallers'.
This patch also changes order of fileset "eol(unix)" output in test,
because "existing caller" predicates show "A(dded)" files before
"C(lean)" ones.