Durham Goode <durham@fb.com> [Tue, 10 Feb 2015 20:04:47 -0800] rev 24376
revbranchcache: populate cache incrementally
Previously the cache would populate completely the first time it was accessed.
This could take over a minute on larger repos. This patch changes it to update
incrementally. Only values that are read will be written, and it will only
rewrite as much of the file as strictly necessary.
This adds a magic value of '\0\0\0\0' to represent an empty cache entry. The
probability of this matching an actual commit hash prefix is tiny, so it's ok if
that's always considered a cache miss. This is also BC safe since any existing
entries with '\0\0\0\0' will just be considered misses.
Perf numbers:
Mozilla-central: hg --time log -r 'branch(mobile)' -T.
Cold Cache: 14.7s -> 15.1s (3% worse)
Warm Cache: 1.6s -> 2.1s (30% worse)
Mozilla-cental: hg perfbranchmap
2s -> 2.4s (20% worse)
hg: hg log -r 'branch(stable) & branch(default)'
Cold Cache: 3.1s -> 1.9s (40% better - because the old code missed the cache on
both branch() revset iterations, so it did twice the work)
Warm Cache: 0.2 -> 0.26 (30% worse)
internal huge repo: hg --time log -r 'tip & branch(default)'
Cold Cache: 65.4s -> 0.2s (327x better)
While this change introduces minor regressions when iterating over every commit
in a branch, it massively improves the cold cache time for operations which
touch a single commit. I feel the better O() is worth it in this case.
Durham Goode <durham@fb.com> [Tue, 10 Feb 2015 20:01:08 -0800] rev 24375
revbranchcache: move entry writing to a separate function
This moves the actual writing of entries to the cache to a separate function.
This will allow us to use it in multiple places. Ex: in one place we will write
dummy entries, and in another place we will write real data.
Durham Goode <durham@fb.com> [Tue, 10 Feb 2015 19:57:51 -0800] rev 24374
revbranchcache: store repo on the object
Previously we would instantiate the revbranchcache with a repo object, use it
briefly, then require it be passed in every time we wanted to fetch any
information. This seems unnecessary since it's obviously specific to that repo
(since it was constructed with it).
This patch stores the repo on the revbranchcache object, and removes the repo
parameter from the various functions on that class. This has the other nice
benefit of removing the double-revbranchcache-read that existed before (it was
read once for the branch revset, and once for the repo.revbranchcache).
Durham Goode <durham@fb.com> [Tue, 10 Feb 2015 19:53:48 -0800] rev 24373
revbranchcache: move out of branchmap onto localrepo
Previously the revbranchcache was a field inside the branchmap. This is bad for
a couple reasons:
1) There can be multiple branchmaps per repo (one for each filter level). There
can only be one revbranchcache per repo. In fact, a revbranchcache could only
exist on a branchmap that was for the unfiltered view, so you could have
branchmaps exist for which you couldn't have a revbranchcache. It was funky.
2) The write lifecycle for the revbranchcache is going to be different from
the branchmap (branchmap is greedily written early on, revbranchcache
should be lazily computed and written).
This patch moves the revbranchcache to live as a field on the localrepo
(alongside self._branchmap). This will allow us to handle it's lifecycle
differently, which will let us move it to be lazily computed in future patches.
Durham Goode <durham@fb.com> [Tue, 17 Mar 2015 14:29:56 -0700] rev 24372
revbranchcache: add test for when the cache is not writable
The revbranchecache code already handled the case when the cache file wasn't
writable, but let's add a test as well so future changes don't regress this.
Siddharth Agarwal <sid0@fb.com> [Tue, 17 Mar 2015 13:06:15 -0700] rev 24371
patch.trydiff: add a docstring
It took me a bit to figure out what this function actually does.
Siddharth Agarwal <sid0@fb.com> [Tue, 17 Mar 2015 15:33:34 -0700] rev 24370
keyword: monkeypatch patch.diff more generically
This function doesn't need access to any of the args or kwargs, so make the
monkeypatching more robust. (In upcoming patches we'll introduce another
argument to patch.diff, and this function would break if it weren't for this
patch.)
Siddharth Agarwal <sid0@fb.com> [Tue, 17 Mar 2015 15:52:28 -0700] rev 24369
keyword: rename kw_diff to kwdiff in keeping with Mercurial style rules
In an upcoming patch we'll change this function's signature. If the name is
kept the same, test-check-commit-hg.t complains.
Yuya Nishihara <yuya@tcha.org> [Tue, 17 Mar 2015 20:36:33 +0900] rev 24368
fetch: use an abort hint where appropriate
Yuya Nishihara <yuya@tcha.org> [Tue, 17 Mar 2015 20:41:52 +0900] rev 24367
eol: replace "working copy" with "working directory" in extension help
Yuya Nishihara <yuya@tcha.org> [Tue, 17 Mar 2015 20:50:19 +0900] rev 24366
revset: replace "working copy" with "working directory" in function help
Yuya Nishihara <yuya@tcha.org> [Tue, 17 Mar 2015 21:53:17 +0900] rev 24365
commands: say "working directory" in full spelling
Yuya Nishihara <yuya@tcha.org> [Tue, 17 Mar 2015 22:47:08 +0900] rev 24364
commands: replace "working copy" with "working directory" in help/messages
"working directory" is the standard term, we should use it consistently.
But I didn't touch the hint, "run 'hg update' to get a working copy", because
"get a working directory" sounds a bit odd.
Matt Harbison <matt_harbison@yahoo.com> [Tue, 17 Mar 2015 22:21:09 -0400] rev 24363
test-commit-interactive-curses: #require 'tic'
When run on Windows, this test aborts:
@@ -20,7 +20,8 @@
> X
> EOF
$ hg commit -i -m "a" -d "0 0"
- no changes to record
+ abort: No module named fcntl!
+ [255]
$ hg tip
changeset: -1:
000000000000
tag: tip
Maybe there's another way to get the screen size on Windows (it dies in
crecord.gethw()), but for now, quiet the test noise by skipping it if terminal
info compiler is unavailable.
Matt Harbison <matt_harbison@yahoo.com> [Tue, 17 Mar 2015 21:48:34 -0400] rev 24362
check-code: enforce the usage of 'seq.py' instead of 'seq'