Martin von Zweigbergk <martinvonz@google.com> [Wed, 25 Mar 2015 17:18:48 -0700] rev 24468
test-manifest.py: don't test .text() with present node suffix
When m.text() is called after setting a nodeid with a suffix (such as
'+'), manifestdict uses the suffix-less nodeid for the text, while
treemanifest includes the suffix. It would perhaps make most sense to
raise an exception so the bug is found, but since the two
implementations behave differently, let's just not test the behavior
for now.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 26 Mar 2015 09:42:21 -0700] rev 24467
treemanifest: drop 22nd byte for consistency with manifestdict
When assigning a 22-byte hash to a nodeid in a manifest, manifestdict
drops the 22nd byte, while treemanifest keeps it. Let's make
treemanifest drop the 22nd byte as well.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 25 Mar 2015 14:13:46 -0700] rev 24466
test-manifest.py: rewrite tests in terms of manifestdict
By rewriting test-manifest.py in terms of manifestdict instead of
_lazymanifest, the tests can be run on treemanifests too. There are
still a few tests that fail on treemanifests. They will be addressed
in the next few patches.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 25 Mar 2015 14:21:34 -0700] rev 24465
test-manifest.py: separate out test for double-free after copy()
The test that we don't double-free anything after creating a copy is
currently mixed with the __setitem__ test. Let's separate them.
Matt Harbison <matt_harbison@yahoo.com> [Wed, 25 Mar 2015 22:20:44 -0400] rev 24464
revert: evaluate subrepos to revert against the working directory
Reverting to a revision where the subrepo didn't exist will now abort, and
matching subrepos against the working directory is consistent with how filesets
are evaluated since
5b85a5bc5bbb.
Matt Harbison <matt_harbison@yahoo.com> [Wed, 25 Mar 2015 21:54:47 -0400] rev 24463
revert: handle subrepos missing in the given --rev
The list of subrepos to revert is currently based on the given --rev, so there
is currently no way for this to fail. Using the --rev context is wrong though,
because if the subrepo doesn't exist in --rev, it is skipped, so it won't be
changed. This change makes it so that the revert aborts, which is what happens
if a plain file is reverted to -1. Finding matches based on --rev is also
inconsistent with evaluating files against the working directory (
5b85a5bc5bbb).
This change is made now, so as to not cause breakage when the context is
switched in an upcoming patch.
Siddharth Agarwal <sid0@fb.com> [Wed, 25 Mar 2015 16:21:58 -0700] rev 24462
osutil: mark end of string with null char, not 0
Noticed this while working on other stuff in the area.
Siddharth Agarwal <sid0@fb.com> [Wed, 25 Mar 2015 15:55:31 -0700] rev 24461
osutil: use getdirentriesattr on OS X if possible
This is a significant win for large repositories on OS X, especially with a
cold cache. Unfortunately we need to keep the lstat-based implementation around
for two reasons:
- Not all filesystems support this call.
- There's an edge case in which it's best to fall back to avoid a retry loop.
More about this in the comments.
The below tests are all performed on a Mac with an SSD running OS X 10.9, on a
repository with over 200k files. The results are best of 5 with simulated
best-effort conditions.
The gains with a hot cache are pretty impressive: 'hg status' goes from 5.18
seconds to 3.79 seconds.
However, a repository that large will probably already be using something like
hgwatchman [1], which helps much more (for this repo, 'hg status' with
hgwatchman is approximately 1 second). Where this really helps is when the
cache is cold [2]: hg status goes from 31.0 seconds to 9.66.
See http://lists.apple.com/archives/filesystem-dev/2014/Dec/msg00002.html for
some more discussion about this function.
This is based on a patch by Sean Farley <sean@farley.io>.
[1] https://bitbucket.org/facebook/hgwatchman
[2] There appears to be no easy way to clear the file cache (aka "vnodes") on
OS X short of rebooting. purge(8) purportedly does that but in my testing had
little effect. The workaround I came up with was to assume that vnode eviction
was LRU, make sure the kern.maxvnodes sysctl is smaller than the size of the
repository, then make sure we'd always miss the cache by running 'hg status' in
another clone of the repository before running it in the test repository.
Siddharth Agarwal <sid0@fb.com> [Wed, 25 Mar 2015 16:43:29 -0700] rev 24460
osutil._listdir: rename to _listdir_stat
In upcoming patches we'll add another implementation of listdir on OS X. That
implementation will have to fall back to this one under some circumstances,
though. We'll make _listdir be able to detect those circumstances and use the
right function as appropriate.
Yuya Nishihara <yuya@tcha.org> [Mon, 16 Mar 2015 17:11:25 +0900] rev 24459
revset: optimize "x & fullreposet" case
If self is a smartset and other is a fullreposet, nothing should be necessary.
A small win for trivial query in mozilla-central repo:
revset #0: (0:100000)
0) wall 0.017211 comb 0.020000 user 0.020000 sys 0.000000 (best of 163)
1) wall 0.001324 comb 0.000000 user 0.000000 sys 0.000000 (best of 2160)
Yuya Nishihara <yuya@tcha.org> [Mon, 16 Mar 2015 18:36:53 +0900] rev 24458
debugrevspec: show nesting structure of smartsets if verbose
This shows how smartsets are constructed from the query. It will be somewhat
useful to track problems such as stack overflow.
Yuya Nishihara <yuya@tcha.org> [Mon, 16 Mar 2015 18:15:06 +0900] rev 24457
revset: add __repr__ to all smartset classes
This is sometimes useful for debugging.
Yung-Jin (Joey) Hu <yungjinhu@gmail.com> [Wed, 18 Mar 2015 20:40:02 -0700] rev 24456
status: add relative directory help text (
issue3835)
Previously, it was difficult to find out how to display the status of files
relative to your current working directory. This patch adds that knowledge to
the help text.
Sean Farley <sean@farley.io> [Wed, 25 Mar 2015 11:55:15 -0700] rev 24455
diff: rename --relative option to --root
The diff output format is unable to express files outside the directory so it
makes sense to name this option --root instead of --relative.
Mike Edgar <adgar@google.com> [Wed, 25 Mar 2015 15:58:31 -0400] rev 24454
revlog: make converting from inline to non-line work after a strip
The checkinlinesize function, which converts inline revlogs to non-inline,
uses the current transaction's "data" field to determine how to update the
transaction after the conversion.
This change works around the missing data field, which is not in the
transaction after a strip.
Laurent Charignon <lcharignon@fb.com> [Tue, 24 Mar 2015 12:52:53 -0700] rev 24453
check-code: in C code, prevent space before closing parenthesis
Yuya Nishihara <yuya@tcha.org> [Sat, 17 Jan 2015 12:39:44 +0900] rev 24452
match: remove unused assignment of ctx
ctx is consumed in __init__ to build match patterns and never used after that.
Yuya Nishihara <yuya@tcha.org> [Sat, 17 Jan 2015 14:22:21 +0900] rev 24451
revert: comment that filesets are always evaluated against workingctx
Martin von Zweigbergk <martinvonz@google.com> [Tue, 24 Mar 2015 15:47:57 -0700] rev 24450
revert: take fast path also when not reverting to '.'
This speeds up 'hg revert -r .^ --all --dry-run' on the Mozilla repo
from 4.081s to 0.826s. Note that 'hg revert -r .^ .' does not get any
faster, since '.' does not make match.always() True.
I can't think of a reason it would break anything, and if it does,
it's clearly not covered by tests.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 24 Mar 2015 13:56:51 -0700] rev 24449
revert: define 'wctx' a little earlier and use it more
Martin von Zweigbergk <martinvonz@google.com> [Wed, 29 Oct 2014 08:43:39 -0700] rev 24448
match: add isexact() method to hide internals
Comparing a function reference seems bad.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 19 Nov 2014 15:56:58 -0800] rev 24447
matcher: make e.g. 'relpath:.' lead to fast paths
Several commands take the fast path when match.always() is
true. However, when the user passes "." on the command line, that
results in a matcher for which match.always() == False. Let's make it
so such matchers return True, and have an empty list of .files(). This
makes e.g. "hg log ." as fast as "hg log" and "hg revert ." as fast as
"hg revert --all" (when run from repo root).
Matt Harbison <matt_harbison@yahoo.com> [Wed, 25 Mar 2015 14:56:54 -0400] rev 24446
revset: add the 'subrepo' symbol
This returns the csets where matching subrepos have changed with respect to the
containing repo's first parent. The second parent shouldn't matter, because it
is either syncing up to the first parent (i.e. it hasn't changed from the
current branch's POV), or the merge changed it with respect to the first parent
(which already adds it to the set).
There's already a 'subrepo' fileset, but it is prefixed with 'set:', so there
should be no ambiguity (in code anyway). The only test I see for it is to
revert subrepos named by a glob pattern (in test-subrepo.t, line 58). Since it
doesn't return a tracked file, neither 'log "set:subrepo()"' nor
'files "set:subrepo()"' print anything. Therefore, it seems useful to have a
revset that will return something for log (and can be added to a revsetalias to
be chained with 'file' revsets.)
It might be nice to be able to filter for added, modified and removed
separately, but add/remove should be rare. It might also be nice to be able to
do a 'contains' check, in addition to this mutated check. Maybe it is possible
to get those with the existing 'adds', 'contains', 'modifies' and 'removes' by
teaching them to chase explicit paths into subrepos.
I'm not sure if this should be added to the 'modifies adds removes' line in
revset.optimize() (since it is doing an AMR check on .hgsubstate), or if it is
OK to put into 'safesymbols' (things like 'file' are on the list, and that takes
a regex, among other patterns).
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 24 Mar 2015 20:28:39 -0700] rev 24445
tags: improve documentation
The documentation for tags.py was making comprehension difficult.
This patch rewrites most of the comments in the file to make it easier
for mere mortals to understand what's going on.
Laurent Charignon <lcharignon@fb.com> [Fri, 20 Mar 2015 11:14:27 -0700] rev 24444
phase: default to C implementation for phase computation
Laurent Charignon <lcharignon@fb.com> [Tue, 24 Mar 2015 11:00:09 -0700] rev 24443
phase: compute phases in C
Previously, the phase computation would grow much slower as the oldest draft
commit in the repository grew older (which is very common in repos with evolve
on) and the number of commits increase.
By rewriting the computation in C we can speed it up from 700ms to 7ms on
a large repository whose oldest draft commit is a year old.
Matt Mackall <mpm@selenic.com> [Wed, 25 Mar 2015 14:16:10 -0500] rev 24442
manifest: move C bool polyfill into util.h
Matt Mackall <mpm@selenic.com> [Wed, 25 Mar 2015 14:13:11 -0500] rev 24441
manifest: use util.h to get Py_ssize_t
Augie Fackler <augie@google.com> [Fri, 13 Mar 2015 18:28:11 -0400] rev 24440
clone: add progress support to hardlink clones (
issue3059)
Augie Fackler <augie@google.com> [Thu, 19 Mar 2015 10:24:22 -0400] rev 24439
util: add progress callback support to copyfiles
Martin von Zweigbergk <martinvonz@google.com> [Mon, 23 Mar 2015 23:04:51 -0700] rev 24438
revert: evaluate filesets against working directory (
issue4497)
As the failing revert tests in test-fileset-generated.t show,
Revert currently creates one matcher for matching files in the working
copy and another matcher for matching files in the target
revision. The two matchers are created with different contexts, which
means filesets are evaluated differently. Then the union of the sets
of files matching the matchers in the two contexts are reverted. It
doesn't seem to make sense to use two different matchers; only the
context they're applied to should be different.
It seems very likely that the user wants the filesets to be evaluated
against the working directory, which the tests
test-fileset-generated.t also assume, so let's make it so.
I willingly admit that the largefiles code was modified by trial and
error (according to tests).
Martin von Zweigbergk <martinvonz@google.com> [Tue, 24 Mar 2015 10:27:56 -0700] rev 24437
largefiles: extract and reuse 'standin' variable in overriderevert()
Martin von Zweigbergk <martinvonz@google.com> [Fri, 20 Mar 2015 10:05:31 -0700] rev 24436
largefiles: override cmdutil.revert() instead of comands.revert()
By overriding the cmdutil method we don't need to override both the
function and the command. Also, we get access to the 'ctx' and
'parents' variables, which will soon prove useful.
Rename the 'ctx' argument to overridematch() to 'mctx' rather than
letting it shadow new 'ctx'.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 21 Mar 2015 12:01:05 -0400] rev 24435
test-commit-interactive-curses: backout
852801178a63
Now that the imports have been fixed up, and the platform EOL difference
eliminated, this test runs on Windows.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 21 Mar 2015 11:56:43 -0400] rev 24434
test-interactive: use stable EOL in various file generating routines
The seq.py and shell echo redirected to a file ends up with platform
specific EOL, which throws off the hash when the file is committed to
the test repo on Windows. The other option is to glob the hashes, but
the ability to see if they have changed might point out problems that
would otherwise be missed.
Siddharth Agarwal <sid0@fb.com> [Tue, 17 Mar 2015 15:46:36 -0700] rev 24433
patch.diff: restrict matcher to relative root in certain cases
Previously we'd request all results, then filter by relative root. This is
clearly inefficient, so we now restrict the matcher to the relative root for
certain easy cases.
The particular case here is when the matcher matches all files. In that case we
can simply create a matcher by the relative root.
This is purely an optimization and has no impact on correctness.
Siddharth Agarwal <sid0@fb.com> [Tue, 17 Mar 2015 15:46:30 -0700] rev 24432
commands.diff: add support for diffs relative to a subdirectory
Previous patches added all the backend support for this. This exposes this
option in the UI.
Siddharth Agarwal <sid0@fb.com> [Tue, 17 Mar 2015 15:06:40 -0700] rev 24431
cmdutil.diffordiffstat: add support for diffs relative to a subdirectory
It's possible that some of the match patterns are outside the relative root. We
warn in that case. In upcoming patches we'll add tests for this.
Siddharth Agarwal <sid0@fb.com> [Sun, 22 Mar 2015 19:19:16 -0700] rev 24430
test-fileset.t: remove 'bar ' and 'baz\' from tested filenames
This test is guarded by a '#if no-windows', but they can't be written out on
vfat on Linux either. con.xml can, and for testing that's good enough.
Also clean up a stray 'ls' that I mistakenly left in while writing the test.
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 23 Mar 2015 18:21:01 -0700] rev 24429
commands.push: abort when revisions evaluate to empty set (BC)
If the "-r" argument is specified to "hg push," the user has expressed
an intent for a specific changeset to be present on the remote. If that
expression cannot be mapped to a known changeset, the user's intent is
ambiguous and cannot be acted upon without making assumptions.
Previously, if arguments to `push -r <rev>` evaluated to an empty set
(perhaps the user specified a revset that didn't evaluate to anything),
the empty "revs" list would be passed down to "exchange.push" where
it appears the empty list was being interpreted as "push everything."
This patch adds validation to the "-r" argument to the push command. If
the argument is specified but doesn't resolve to a changeset, the
command will abort instead of doing something potentially unexpected.
This patch is technically breaking backwards compatibility. I believe
this is justified because the new behavior closes a crack that could
result in undefined or under-defined behavior. Also, this patch doesn't
drop client capabilities because if users really wanted to push all
changesets, they can simply omit the "-r" argument from push completely.
Martin von Zweigbergk <martinvonz@google.com> [Mon, 23 Mar 2015 17:07:25 -0700] rev 24428
largefiles: fix typo with s/__class/__class__/
Commit
f78252429e0a (largefiles: don't create chain of __contains__
calls, 2015-03-11) introduced a typo with __class instead of
__class__. Let's fix it.
There are (obviously) no tests covering this code path, and I could
not figure out a way to trigger it, so it remains untested.
Spotted by Drew Gottlieb.
Paul Fisher <pfish@google.com> [Mon, 23 Mar 2015 14:47:35 -0400] rev 24427
hgweb: pull line numbers out of main flow of source content
Pulls the autogenerated line number boxes outside of the padding box
of the main content of .sourcelines, allowing the first tab
to be properly sized and the line numbers to be outside
the main source's margin when text is wrapped.
Matt Mackall <mpm@selenic.com> [Mon, 23 Mar 2015 15:41:43 -0500] rev 24426
merge with stable
Matt Harbison <matt_harbison@yahoo.com> [Fri, 20 Mar 2015 23:35:13 -0400] rev 24425
crecord: don't abort on Windows when curses isn't available
This is the hack portion of the previous patch, which can be backed out once we
figure out how to deal with curses. Without this, the tests affected by the
import problem mentioned in the previous patch fail in exactly the same way, but
with the nicer 'module not available' error.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 21 Mar 2015 01:24:17 -0400] rev 24424
test-fileset: forget non-portable files to avoid failures on Windows
The 3 deleted lines appeared on Windows, because the files were never created in
the first place.
Matt Harbison <matt_harbison@yahoo.com> [Fri, 20 Mar 2015 23:32:00 -0400] rev 24423
crecord: conditionalize the imports that are not available on Windows
'fcntl', 'termios' and 'wcurses' are not available on the default Windows python
installation, and importing them caused widespread carnage in the test suite.
There were 29 different changed test files (on top of unrelated errors), mostly
in the form of an ImportError.
The failures weren't related to actual crecord use, and followed the import
chain:
'localrepo' -> 'subrepo' -> 'cmdutil' -> 'crecord' -> 'fcntl'
Matt Harbison <matt_harbison@yahoo.com> [Fri, 20 Mar 2015 21:55:11 -0400] rev 24422
cmdutil: drop a duplicate import of crecord
It looks like this crept in with
69538481ea9f.
Yuya Nishihara <yuya@tcha.org> [Sat, 16 Aug 2014 17:50:55 +0900] rev 24421
annotate: add option to annotate working-directory files
Working revision or node is displayed with "+" suffix in plain output, but
null/None in machine-readable format.
Yuya Nishihara <yuya@tcha.org> [Thu, 19 Mar 2015 23:31:53 +0900] rev 24420
committablefilectx: override linkrev() to point to the associated changectx
This is necessary to annotate workingctx revision. basefilectx.linkrev() can't
be used because committablefilectx has no filelog.
committablefilectx looks for parents() from self._changectx. That means fctx
is linked to self._changectx, so linkrev() can simply be aliased to rev().
Yuya Nishihara <yuya@tcha.org> [Sat, 16 Aug 2014 13:44:16 +0900] rev 24419
revset: add wdir() function to specify workingctx revision by command
The main purpose of wdir() is to annotate working-directory files.
Currently many commands and revsets cannot handle workingctx and may raise
exception. For example, -r ":wdir()" results in TypeError. This problem will
be addressed by future patches.
We could add "wdir" symbol instead, but it would conflict with the existing
tag, bookmark or branch. So I decided not to.
List of commands that will potentially support workingctx revision:
command default remarks
-------- ------- -----------------------------------------------------
annotate p1 useful
archive p1 might be useful
cat p1 might be useful on Windows (no cat)
diff p1:wdir (default)
export p1 might be useful if wctx can have draft commit message
files wdir (default)
grep tip:0 might be useful
identify wdir (default)
locate wdir (default)
log tip:0 might be useful with -p or -G option
parents wdir (default)
status wdir (default)
This patch includes minimal test of "hg status" that should be able to handle
the workingctx revision.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 22 Mar 2015 19:08:13 -0400] rev 24418
win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
WinError is a function that creates an Error, not an Error itself. This is a
partial backout of
e34106fa0dc3.
Siddharth Agarwal <sid0@fb.com> [Tue, 17 Mar 2015 13:41:24 -0700] rev 24417
patch.diff: add support for diffs relative to a subdirectory
For now this implementation is pretty naive -- it filters out files right
before passing them into trydiff. In upcoming patches we'll add some more
smarts.
Siddharth Agarwal <sid0@fb.com> [Tue, 17 Mar 2015 12:59:41 -0700] rev 24416
patch.trydiff: add support for stripping a relative root
This assumes that if relroot is not None, all the files in modified, added and
removed start with it. In upcoming patches we'll follow that.
Matt Mackall <mpm@selenic.com> [Fri, 20 Mar 2015 17:30:38 -0500] rev 24415
merge with stable
Matt Mackall <mpm@selenic.com> [Fri, 20 Mar 2015 16:39:07 -0500] rev 24414
obsolete: mark warning for translation
No good reason not to.
Matt Harbison <matt_harbison@yahoo.com> [Wed, 18 Mar 2015 23:03:41 -0400] rev 24413
subrepo: add basic support to hgsubrepo for the files command
Paths into the subrepo are not yet supported.
The need to use the workingctx in the subrepo will likely be used more in the
future, with the proposed working directory revset symbol. It is also needed
with archive, if that code is to be reused to support 'extdiff -S'.
Unfortunately, it doesn't seem possible to put the smarts in subrepo.subrepo(),
as it breaks various status and diff tests.
I opted not to pass the desired revision into the subrepo method explicitly,
because the only ones that do pass an explicit revision are methods like status
and diff, which actually operate on two contexts- the subrepo state and the
explicitly passed revision.