Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:59:52 -0700] rev 22538
revset: use `subset &` in bare `p1()`
This takes advantage of the `fullreposet` smartness and yields a nice
speedup.
revset #0: p1()
0) wall 0.003256 comb 0.010000 user 0.010000 sys 0.000000 (best of 527)
1) wall 0.000066 comb 0.000000 user 0.000000 sys 0.000000 (best of 23224)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 11:00:09 -0700] rev 22537
revset: use `subset &` in `rev`
This takes advantage of the `fullreposet` smartness and yields a nice
speedup.
revset #0: rev(25)
0) wall 0.005480 comb 0.000000 user 0.000000 sys 0.000000 (best of 305)
1) wall 0.000052 comb 0.000000 user 0.000000 sys 0.000000 (best of 21891)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 19:52:34 -0700] rev 22536
revset: use `subset &` in `origin`
This takes advantage of the `fullreposet` smartness.
revset #0: origin(tip)
0) wall 0.005353 comb 0.000000 user 0.000000 sys 0.000000 (best of 354)
1) wall 0.003080 comb 0.000000 user 0.000000 sys 0.000000 (best of 446)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:59:16 -0700] rev 22535
revset: use `subset &` in `follow`
This takes advantage of the `fullreposet` smartness.
revset #0: follow(COPYING)
0) wall 0.002446 comb 0.000000 user 0.000000 sys 0.000000 (best of 735)
1) wall 0.000331 comb 0.000000 user 0.000000 sys 0.000000 (best of 5672)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:58:50 -0700] rev 22534
revset: use `subset &` in `filelog`
This takes advantage of the `fullreposet` smartness.
revset #0: file(COPYING)
0) wall 3.179066 comb 3.180000 user 3.140000 sys 0.040000 (best of 3)
1) wall 2.723699 comb 2.730000 user 2.690000 sys 0.040000 (best of 4)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:58:39 -0700] rev 22533
revset: use `subset &` in `divergent`
This takes advantage of the `fullreposet` smartness.
revset #0: divergent()
0) wall 0.002047 comb 0.000000 user 0.000000 sys 0.000000 (best of 813)
1) wall 0.000052 comb 0.000000 user 0.000000 sys 0.000000 (best of 22757)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:57:57 -0700] rev 22532
revset: use `subset &` in `bisect`
This takes advantage of the `fullreposet` smartness.
revset #0: bisect(range)
0) wall 0.014007 comb 0.010000 user 0.010000 sys 0.000000 (best of 115)
1) wall 0.005556 comb 0.010000 user 0.010000 sys 0.000000 (best of 235)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:57:47 -0700] rev 22531
revset: use `subset &` in `ancestorspec`
This takes advantage of the `fullreposet` smartness.
revset #0: tip~25
0) wall 0.004800 comb 0.010000 user 0.010000 sys 0.000000 (best of 259)
1) wall 0.002475 comb 0.000000 user 0.000000 sys 0.000000 (best of 717)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 19:57:09 -0700] rev 22530
revset: use `subset &` in `bookmark`
Speedup, Weeeeeee!
revset #0: bookmark()
0) wall 0.002240 comb 0.000000 user 0.000000 sys 0.000000 (best of 571)
1) wall 0.000132 comb 0.000000 user 0.000000 sys 0.000000 (best of 14059)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:59:40 -0700] rev 22529
revset: use `subset &` in `outgoing`
This should give us the same benefit as elsewhere. Result is simpler (and
"faster").
Outgoing is dominated by the discovery so no benchmark is provided.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 30 Apr 2014 16:56:48 -0700] rev 22528
revset: avoid in loop lookup in _generatorset._consumegen
Python lookups are slow, so do all lookup outside of the for loop.
This provide a small but still significant speedup:
revset #0: 0::
0) wall 0.063258 comb 0.060000 user 0.060000 sys 0.000000 (best of 100)
1) wall 0.057776 comb 0.050000 user 0.050000 sys 0.000000 (best of 100)
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 25 Apr 2014 14:51:24 -0700] rev 22527
revset: reduce dict lookup in lazyset.__contains__
Avoid an extra dict lookup when we have to compute the value. No
visible performance impact but this shaves the yak a few extra
nanometers.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 25 Apr 2014 17:53:58 -0700] rev 22526
revset: do less lookup during spanset.__contains__
Attribute lookup is slow in python. So this version is going to be a bit
faster. This does not have a visible impact since the rest of the stack is much
slower but this shaves the yak a few extra nanometers.
Moreover the new version is more readable so it worth doing this change for code
quality purpose.
This optimisation was approved by a core python dev.
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 23:10:39 -0700] rev 22525
largefiles: simplify iteration over standins
Instead of iterating over all files in the context and ignoring those
that are not standins, pass a standin-matcher to the context and
iterate over only the files matching.
Apart from making the intent clearer, this implementation will also
benefit from any future optimizations done to the manifest walking
code.
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 22:50:38 -0700] rev 22524
largefiles: avoid using 'lfiles' variable for two purposes
The variable 'lfiles' is first used for a set of the names of all the
large files. It is then overwritten with a tuple like the ones
returned from status(). To reduce confusion, let's create a separate
variable for the second use.
Martin von Zweigbergk <martinvonz@gmail.com> [Mon, 22 Sep 2014 13:05:36 -0700] rev 22523
largefiles: remove unnecessary clearing of status fields
At the end of lfilesrepo.status(), we clear the lists of unknown,
ignored and clean files, depending on the values of 'listunknown'
etc. The lists originate from other calls to status(), and it is only
'clean' that may get updated after the calls. Let's remove the need to
clear any of the lists by explicitly only adding to 'clean' when
'listclean' is true.
Mads Kiilerich <madski@unity3d.com> [Wed, 24 Sep 2014 01:39:25 +0200] rev 22522
mq: simplify patchheader handling of the empty line before the diff
Don't try to append empty lines to HG patch headers - instead, add them in str
method.
This minor change removes some apparently redundant code and makes the code
more robust.
Mads Kiilerich <madski@unity3d.com> [Wed, 24 Sep 2014 01:36:44 +0200] rev 22521
mq: write '# Parent ' lines with two spaces like export does (BC)
This aligns "Parent" node IDs with "Node ID" node IDs.
Mads Kiilerich <madski@unity3d.com> [Sat, 20 Sep 2014 17:06:56 +0200] rev 22520
mq: write headers for new HG patches in the same order as export (BC)
Mads Kiilerich <madski@unity3d.com> [Sat, 20 Sep 2014 17:06:56 +0200] rev 22519
mq: correctly make an empty line after description in new patches
There would in some cases be an empty line between headers and the description -
that does not seem right.
There should also be an empty line between description and diff - but that was
missing.
These two mistakes would sometimes make it up for each other so we fix both at
once to just show the improvement.
Instead of writing an extra newline when writing a header line, write an extra
line when it not is written as a part of the description but is necessary
anyway.
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 14:51:56 -0700] rev 22518
largefiles: extract 'orig' method in reposetup.status
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 14:51:25 -0700] rev 22517
largefiles: extract 'orig' method in lfilesctx.filectx
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 14:50:38 -0700] rev 22516
largefiles: extract 'orig' method in lfilesmanifestdict.__contains__
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 14:40:25 -0700] rev 22515
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 11:35:13 -0700] rev 22514
largefiles: remove dead assignment left over from change
1ff42ee98446
Martin von Zweigbergk <martinvonz@gmail.com> [Fri, 19 Sep 2014 13:49:58 -0700] rev 22513
match: simplify brittle predicate construction
In match.__init__(), we create the matchfn predicate by and-ing
together the individual predicates for includes, excludes (negated)
and patterns. Instead of the current set of nested if/else blocks, we
can simplify by adding the predicates to a list and defining the
overall predicate in a generic way based on the components. We can
still optimize it for the 0-length and 1-length cases. This way, there
is no combinatorial explosion to deal with if new component predicates
are added, and there is less risk of getting the overall predicate
wrong.
Siddharth Agarwal <sid0@fb.com> [Tue, 23 Sep 2014 14:45:23 -0700] rev 22512
convert: change default for git rename detection to 50%
This default mirrors the default for 'git diff'. Other commands have slightly
different defaults -- for example, the move/copy detection for 'git blame'
assumes that a hunk is moved if more than 40 alphanumeric characters are the
same, or copied if more than 20 alphanumeric characters are the same. 50% seems
to be the most common default, though.
Siddharth Agarwal <sid0@fb.com> [Tue, 23 Sep 2014 14:40:32 -0700] rev 22511
convert: simplify git.similarity parsing
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 24 Sep 2014 20:11:36 -0700] rev 22510
revset: fast implementation for fullreposet.__and__
"And" operation with something that contains the whole repo should be super
cheap. Check method docstring for details.
This provide massive boost to simple revset that use `subset & xxx`
revset #0: p1(20000)
0) wall 0.002447 comb 0.010000 user 0.010000 sys 0.000000 (best of 767)
1) wall 0.000529 comb 0.000000 user 0.000000 sys 0.000000 (best of 3947)
revset #1: p2(10000)
0) wall 0.002464 comb 0.000000 user 0.000000 sys 0.000000 (best of 913)
1) wall 0.000530 comb 0.000000 user 0.000000 sys 0.000000 (best of 4226)
No other regression spotted.
More performance improvements are expected in the future as more
revset predicate are converted to use `subset & xxx`
The relaxed way `fullreposet` handles "&" operation may cause some trouble for
people comparing smartset from different filter levels. I'm not sure such people
exist and we can improve that aspect in later patches.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 18 Sep 2014 13:04:02 -0700] rev 22509
revset: turn spanset into a factory function
We rename the `spanset` class to `_spanset`. `spanset` is now a function that
builds either a `fullreposet` or a `_spanset` according to the argument passed.
At some point, we may force people to explicitly use the `fullreposet`
constructor, but the current approach makes it easier to ensure we use the new
class whenever possible and focus on the benefits of this class.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 29 Apr 2014 19:06:15 -0700] rev 22508
revert: add a fullreposet class
Every revset evaluation starts from `subset = spanset(repo)` and a lot of
revset predicates build a `spansetrepo` for their internal needs.
`spanset` is a generic class that can handle any situation. As a result a lot
of operation between spanset result in an `orderedlazyset`, a safe object but
suboptimal in may situation.
So we introduce a `fullreposet` class where some of the operation will be
overwritten to produce more interesting results.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 23 Sep 2014 12:21:38 -0700] rev 22507
obsolete: ensure that `getrevs` always return a set
When a set of revisions was empty, we were using an empty tuple. We now return an
empty frozenset to ensure the object could be used in an operation that requires a
set.
Anton Shestakov <engored@ya.ru> [Mon, 22 Sep 2014 23:46:38 +0900] rev 22506
hgweb: fail if an invalid command was supplied in url path (
issue4071)
Traditionally, the way to specify a command for hgweb was to use url query
arguments (e.g. "?cmd=batch"). If the command is unknown to hgweb, it gives an
error (e.g. "400 no such method: badcmd").
But there's also another way to specify a command: as a url path fragment (e.g.
"/graph"). Before, hgweb was made forgiving (looks like it was made in
44c5157474e7) and user could put any unknown command in the url. If hgweb
couldn't understand it, it would just silently fall back to the default
command, which depends on the actual style (e.g. for paper it's shortlog, for
monoblue it's summary). This was inconsistent and was breaking some tools that
rely on http status codes (as noted in the
issue4071). So this patch changes
that behavior to the more consistent one, i.e. hgweb will now return "400 no
such method: badcmd".
So if some tool was relying on having an invalid command return http status
code 200 and also have some information, then it will stop working. That is, if
somebody typed foobar when they really meant shortlog (and the user was lucky
enough to choose a style where the default command is shortlog too), that fact
will now be revealed.
Code-wise, the changed if block is only relevant when there's no "?cmd" query
parameter (i.e. only when command is specified as a url path fragment), and
looks like the removed else branch was there only for falling back to default
command. With that removed, the rest of the code works as expected: it looks at
the command, and if it's not known, raises a proper ErrorResponse exception
with an appropriate message.
Evidently, there were no tests that required the old behavior. But, frankly, I
don't know any way to tell if anyone actually exploited such forgiving behavior
in some in-house tool.
Mike Hommey <mh@glandium.org> [Wed, 24 Sep 2014 15:52:40 +0900] rev 22505
keepalive: fix how md5 is used
The code in keepalive dates from when it was importing the md5 module directly
and uses md5.new. Since then, what 'md5' means has been changed from an import
of the md5 module to being a function using the right module between hashlib
and md5, so the md5.new idiom doesn't work anymore.
Matt Mackall <mpm@selenic.com> [Sat, 27 Sep 2014 13:18:10 -0500] rev 22504
merge with stable
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 23:59:29 -0700] rev 22503
revset: add an optimised baseset.__contains__ (
issue4371)
The baseset class is based on a python list. This means that base.__contains__
was absolutely as crappy as list.__contains__. We now rely on __contains__ from
the underlying set.
This will avoid having to explicitly convert the baseset to a set (using
baseset.set()) whenever one want fast membership test.
Apparently there is already code that forgot to do such conversions since we
observe a massive speedup in some test.
revset #25: roots((0::) - (0::tip))
0) wall 2.079454 comb 2.080000 user 2.080000 sys 0.000000 (best of 5)
1) wall 0.132970 comb 0.130000 user 0.130000 sys 0.000000 (best of 65)
No regression is observed in benchmarks.
This change improve the
issue4371 back to acceptable situation (but are still
slower than manual substraction)
Matt Mackall <mpm@selenic.com> [Mon, 22 Sep 2014 16:14:08 -0500] rev 22502
merge with stable
Matt Mackall <mpm@selenic.com> [Mon, 22 Sep 2014 16:03:07 -0500] rev 22501
commands: deprecate the parents commands
It's replaced by 'hg summary' or hg log -r 'parents(foo)' and
doesn't need to take up space in our command list anymore.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 19:56:59 -0700] rev 22500
revset: remove nullrev from the bookmark computation
Same as for other revset we sanitize the content of the set to be able to rely
on it more.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:58:25 -0700] rev 22499
revset: unify code flow in `bookmark`
We refactor the code of the bookmark revset to have a single return. This will
allow us to sanitize the content of the set.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:59:30 -0700] rev 22498
revset: remove invalid value in the origin set
Same as the parents related revsets, origin had some invalid value in the
computed set. We remove them.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 19:49:26 -0700] rev 22497
revset: remove nullrev from set computed in parents()
The old code relied on the subset contents to get rid of invalid values. We would
like to be able to rely more on the computation in parents() so we filter out
the invalid value.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 19:44:03 -0700] rev 22496
revset: refactor parents() into a single return point
Both paths are doing similar thing in the end. We refactor the function so that
the `ps` set is commonly used at the end.
This will end excluding `nullrev` from this set in a future patch
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 04:40:30 -0700] rev 22495
revset: remove nullrev from set computed in p1() and p2()
The old code relied on the subset contents to get rid of invalid values. We would
like to be able to rely more on the computation in p1() and p2() so we filter out
the invalid value
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 23:42:41 -0700] rev 22494
revset: document the choice made in __generatorset.__iter__
The method code looks a bit ugly but has good reasons to. We document them
to prevent naive refactoring in the future.
Matt Mackall <mpm@selenic.com> [Sun, 21 Sep 2014 10:31:34 -0500] rev 22493
help: mention mode in hg log --removed help (
issue4381)
Matt Mackall <mpm@selenic.com> [Sun, 21 Sep 2014 10:07:06 -0500] rev 22492
commit: catch changed exec bit on files from p1 (
issue4382)
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 02:25:23 +0200] rev 22491
revert: add a `drop` action
This prevents the need for a try except in the `_performrevert` code.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 02:23:25 +0200] rev 22490
revert: explicitly track added but deleted file
Added + deleted file are files that need to be untracked from the dirstate but
that are already missing on disk. The current `_performrevert` code is handling
that with exception catching. We will be able to do better with a dedicated set.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 01 Sep 2014 12:36:48 +0200] rev 22489
revert: have an explicit action for "forget"
The distinction between "remove" and "forget" used to be in special logic
checking for the state of the file in the dirstate. Now that we have dedicated
filtering, we can stop relying on this logic and have two distinct actions.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 18:20:29 +0200] rev 22488
revert: split between newly added file and file added in other changeset
These two kinds of files are handled differently. One is deleted and the other
is just forgotten (the file is untracked but left in place). The distinction is
done in the `_performrevert` code itself and we would like to get ride of this.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 22:55:49 -0700] rev 22487
revset: stop using a baseset instead of a plain list in _revsbetween
The function internal code needs a list. Lets use a list.
anuraggoel <anurag.dsps@gmail.com> [Fri, 19 Sep 2014 07:23:10 +0530] rev 22486
run-tests: added 'cuser', 'csys' time info in report.json file
This patch adds up a 'cuser' and 'csys'(cputime) info in report.json file
which generated when --json is enabled while testing.
Now the new format of report.json file is as below.
testreport ={
"test-success.t": {
"csys": "1.041",
"cuser": "1.041",
"result": "success",
"time": "2.041"
}
"test-failure.t": {
"csys": "1.041",
"cuser": "1.041",
"result": "failure",
"time": "4.430"
}
"test-skip.t": {
"csys": "1.041",
"cuser": "1.041",
"result": "skip",
"time": "3.754"
}
}
Matt Mackall <mpm@selenic.com> [Fri, 19 Sep 2014 14:51:58 -0500] rev 22485
import: let --exact 'work' with --no-commit (
issue4376)
Durham Goode <durham@fb.com> [Tue, 16 Sep 2014 16:03:21 -0700] rev 22484
obsolete: use C code for headrevs calculation
Previously, if there were filtered revs the repository could not use the C fast
path for computing the head revs in the changelog. This slowed down many
operations in large repositories.
This adds the ability to filter revs to the C fast path. This speeds up histedit
on repositories with filtered revs by 30% (13s to 9s). This could be improved
further by sorting the filtered revs and walking the sorted list while we walk
the changelog, but even this initial version that just calls __contains__ is
still massively faster.
The new C api is compatible for both new and old python clients, and the new
python client can call both new and old C apis.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 23:47:34 -0700] rev 22483
revset: simplify orderedlazyset creation in spanset method
We can simply use the `self.isascending` value instead of more complex if/else
clause. This get the code simpler.
Benchmarks show no performances harmed in the process.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 23:37:03 -0700] rev 22482
revset: use spanset.isdescending in multiple simple places
We call the method directly instead of duplicating checks.
Benchmarks show no performances harmed in the process.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 23:34:18 -0700] rev 22481
revset: wider definition of ascending and descending for spanset
Before this patches, empty spanset were seen as neither ascending nor
descending. This is mathematically wrong and create some edges case. We put
`isascending` and `isdescending` back on track so we can use them to simplify
some of the spanset code.
Benchmarks show no performances harmed in the process.
Yuya Nishihara <yuya@tcha.org> [Wed, 17 Sep 2014 23:21:20 +0900] rev 22480
annotate: port to generic templater enabled by hidden -T option
If the selected formatter is other than plainformatter, raw data are passed
to the formatter. In this case, it isn't necessary (and not possible) to
calculate column widths.
Field names are substituted to be the same as "log" command.
There are a few limitations:
- "binary file" message is not included in formatted output.
- no data structure for multiple files. all lines are packed to single list.
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Sep 2014 23:40:24 +0900] rev 22479
annotate: split functions to get data without applying text formatting
This prepares for porting to generic templater API, where raw data should
be passed to the formatter.
makefunc() is necessary to build closure in list comprehension.