Wed, 17 Sep 2014 19:52:34 -0700 revset: use `subset &` in `origin`
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)
Wed, 17 Sep 2014 10:59:16 -0700 revset: use `subset &` in `follow`
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)
Wed, 17 Sep 2014 10:58:50 -0700 revset: use `subset &` in `filelog`
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)
Wed, 17 Sep 2014 10:58:39 -0700 revset: use `subset &` in `divergent`
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)
Wed, 17 Sep 2014 10:57:57 -0700 revset: use `subset &` in `bisect`
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)
Wed, 17 Sep 2014 10:57:47 -0700 revset: use `subset &` in `ancestorspec`
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)
Wed, 17 Sep 2014 19:57:09 -0700 revset: use `subset &` in `bookmark`
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)
Wed, 17 Sep 2014 10:59:40 -0700 revset: use `subset &` in `outgoing`
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.
Wed, 30 Apr 2014 16:56:48 -0700 revset: avoid in loop lookup in _generatorset._consumegen
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)
Fri, 25 Apr 2014 14:51:24 -0700 revset: reduce dict lookup in lazyset.__contains__
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.
Fri, 25 Apr 2014 17:53:58 -0700 revset: do less lookup during spanset.__contains__
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.
Tue, 16 Sep 2014 23:10:39 -0700 largefiles: simplify iteration over standins
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.
Tue, 16 Sep 2014 22:50:38 -0700 largefiles: avoid using 'lfiles' variable for two purposes
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.
Mon, 22 Sep 2014 13:05:36 -0700 largefiles: remove unnecessary clearing of status fields
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.
Wed, 24 Sep 2014 01:39:25 +0200 mq: simplify patchheader handling of the empty line before the diff
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.
Wed, 24 Sep 2014 01:36:44 +0200 mq: write '# Parent ' lines with two spaces like export does (BC)
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.
Sat, 20 Sep 2014 17:06:56 +0200 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 22520
mq: write headers for new HG patches in the same order as export (BC)
Sat, 20 Sep 2014 17:06:56 +0200 mq: correctly make an empty line after description in new patches
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.
Tue, 16 Sep 2014 14:51:56 -0700 largefiles: extract 'orig' method in reposetup.status
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 14:51:56 -0700] rev 22518
largefiles: extract 'orig' method in reposetup.status
Tue, 16 Sep 2014 14:51:25 -0700 largefiles: extract 'orig' method in lfilesctx.filectx
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 14:51:25 -0700] rev 22517
largefiles: extract 'orig' method in lfilesctx.filectx
Tue, 16 Sep 2014 14:50:38 -0700 largefiles: extract 'orig' method in lfilesmanifestdict.__contains__
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 14:50:38 -0700] rev 22516
largefiles: extract 'orig' method in lfilesmanifestdict.__contains__
Tue, 16 Sep 2014 14:40:25 -0700 largefiles: reduce indentation by dropping 'else' block after 'return'
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'
Tue, 16 Sep 2014 11:35:13 -0700 largefiles: remove dead assignment left over from change 1ff42ee98446
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
Fri, 19 Sep 2014 13:49:58 -0700 match: simplify brittle predicate construction
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.
Tue, 23 Sep 2014 14:45:23 -0700 convert: change default for git rename detection to 50%
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.
Tue, 23 Sep 2014 14:40:32 -0700 convert: simplify git.similarity parsing
Siddharth Agarwal <sid0@fb.com> [Tue, 23 Sep 2014 14:40:32 -0700] rev 22511
convert: simplify git.similarity parsing
Wed, 24 Sep 2014 20:11:36 -0700 revset: fast implementation for fullreposet.__and__
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.
Thu, 18 Sep 2014 13:04:02 -0700 revset: turn spanset into a factory function
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.
Tue, 29 Apr 2014 19:06:15 -0700 revert: add a fullreposet 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.
Tue, 23 Sep 2014 12:21:38 -0700 obsolete: ensure that `getrevs` always return a set
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.
(0) -10000 -3000 -1000 -300 -100 -50 -30 +30 +50 +100 +300 +1000 +3000 +10000 tip