Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 07 Jun 2017 19:21:02 +0100] rev 32754
bookmarks: prefetch 'lookup' outside of the loop
Skipping the attribute lookup up raise a significant speedup.
Example on a repository with about 4000 bookmarks.
Before:
! wall 0.026027 comb 0.020000 user 0.020000 sys 0.000000 (best of 112)
After:
! wall 0.021580 comb 0.020000 user 0.020000 sys 0.000000 (best of 134)
(This is also in its own changeset to clarify the perf win from another coming
changesets)
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 07 Jun 2017 18:22:11 +0100] rev 32753
perf: add a perfbookmarks command
A new command dedicated to benchmark of bookmark initialization.
Pierre-Yves David <pierre-yves.david@octobus.net> [Tue, 23 May 2017 02:27:41 +0200] rev 32752
perfphases: add a flag to also include file access time
The flag purges all phases data so we'll have to read the file from disk again.
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 07 Jun 2017 17:31:30 +0100] rev 32751
perf: have a generic "clearstorecache" function
There are multiple places where we will want to purge some store cache. So we
promote the existing _clearobsstore function to a something reusable.
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 08 Jun 2017 23:23:37 -0700] rev 32750
localrepo: move filtername to __init__
This is obviously an instance attribute, not a type attribute. The
modern Python style is to use __init__ for defining these.
This exposes statichttprepo as inheriting from localrepository
without calling its __init__. As a result, its __init__ defines
a lot of variables that methods on localrepository's methods need.
But factoring the common bits into a separate class is for another
day.
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 08 Jun 2017 21:54:30 -0700] rev 32749
obsolete: move obsstore creation logic from localrepo
This code has more to do with obsolete.py than localrepo.py. Let's
move it there.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 08 Jun 2017 22:18:17 -0700] rev 32748
match: allow pats to be None
match.match already interprets "!bool(patterns)" as matching
everything (but includes and excludes still apply). We might as well
allow None, which lets us simplify some callers a bit.
I originally wrote this patch while trying to change
match.match(patterns=[]) to mean to match no patterns. This patch is
one step towards that goal. I'm not sure it'll be worth the effort to
go all the way there, but I think this patch still makes sense on its
own.
Augie Fackler <augie@google.com> [Tue, 06 Jun 2017 11:16:38 -0400] rev 32747
tests: add a test for installing hg with pip in a virtualenv
Since we're doing so much clever junk in our setup.py, let's have a
test that exercises it.
Thanks to Matt Harbison for testing this on Windows and verifying that
installenv/*/hg would work as a way to work around bin being called
Scripts on Windows.
Augie Fackler <augie@google.com> [Tue, 06 Jun 2017 11:16:10 -0400] rev 32746
hghave: add check for virtualenv
Augie Fackler <augie@google.com> [Tue, 06 Jun 2017 11:02:30 -0400] rev 32745
setup: introduce dummy copies of setuptools flags
Since we're filtering out some egg gunk, we need to emulate these
flags which disable eggs so that pip still works.
Augie Fackler <augie@google.com> [Tue, 06 Jun 2017 10:09:48 -0400] rev 32744
extensions: catch uisetup and extsetup failures and don't let them break hg
Otherwise users of the patience diff extension will be unable to run
anything at all in hg 4.3 until they figure out what's broken.
Augie Fackler <augie@google.com> [Tue, 06 Jun 2017 10:03:16 -0400] rev 32743
tests: add test demonstrating how broken third-party extensions can get
I intend to fix this, but will do the fix as a separate change to make
the behavior change obvious. This was inspired by some users having
the patience diff extension, which broke when we moved bdiff.so so
thoroughly the users can't even run 'hg debuginstall'.
Augie Fackler <augie@google.com> [Thu, 08 Jun 2017 10:44:53 -0400] rev 32742
extensions: move wrapfilecache function from fsmonitor
It makes more sense to put this in core, so other extensions can
trivially get access to it without having to rely on importing
fsmonitor.
Koen Van Hoof <koen.van_hoof@nokia.com> [Wed, 26 Apr 2017 16:05:22 +0200] rev 32741
chmod: create a new file when flags are set on a hardlinked file
For performance reasons we have several repositories where the files in the working
directory of 1 repo are hardlinks to the files of the other repo
When an update in one repo results in a chmod of a such a file, the hardlink
has to be deleted and replaced by a regular file to make sure that the change
does not happen in the other repo
Siddharth Agarwal <sid0@fb.com> [Wed, 07 Jun 2017 21:17:24 -0700] rev 32740
run-tests: make --restart work with output dir
Siddharth Agarwal <sid0@fb.com> [Wed, 07 Jun 2017 21:17:06 -0700] rev 32739
run-tests: output coverage to output dir
There do not appear to be any tests for this, and I've never used either of
these options before, but this works.
Siddharth Agarwal <sid0@fb.com> [Wed, 07 Jun 2017 20:46:43 -0700] rev 32738
run-tests: write JSON reports to output dir
Siddharth Agarwal <sid0@fb.com> [Wed, 07 Jun 2017 20:32:11 -0700] rev 32737
run-tests: write test times to output dir
Siddharth Agarwal <sid0@fb.com> [Wed, 07 Jun 2017 20:30:08 -0700] rev 32736
run-tests: allow specifying an output dir to write .errs to
I'm trying to use run-tests.py on a read-only file system. This series allows
that to happen.
Siddharth Agarwal <sid0@fb.com> [Wed, 07 Jun 2017 15:47:06 -0700] rev 32735
run-tests: add information about skipped tests to XUnit output
The XUnit spec supports skipped tests.
Siddharth Agarwal <sid0@fb.com> [Wed, 07 Jun 2017 15:47:06 -0700] rev 32734
run-tests: wrap failures in an XUnit 'failure' element
This is closer to what most XUnit consumers can understand.
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 07 Jun 2017 10:44:11 +0100] rev 32733
discovery: log discovery result in non-trivial cases
We log the discovery summary, the number of roundtrips and the elapsed time.
This is useful to understand where slow push might come from when lloking at
the blackbox.
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 07 Jun 2017 10:29:39 +0100] rev 32732
discovery: include timing in the debug output
Having such date easily available is useful. It also prepare the inclusion of
some discovery related data in blackbox.
Augie Fackler <raf@durin42.com> [Sun, 28 May 2017 21:33:33 -0400] rev 32731
tests: remove sys.executable from "required tools"
In practice this doesn't appear to have been true for some time - we
reference Python using the $PYTHON variable in all the tests now
(which we have to for PyPy and Python 3), and I've been using
~/.../python.exe to test with tip of the cpython 3.6 release branch
while working on manifest tests in Python 3 and everything seems to be
just fine. The only real observable difference from this change is
that I stop getting a warning about python.exe not being a thing on
$PATH, which seems like an improvement.
Pierre-Yves David <pierre-yves.david@octobus.net> [Mon, 05 Jun 2017 16:24:01 +0100] rev 32730
perfbranchmap: add an option to purge the revbranch cache
The perf extension needs to be able to reflect this reality too. (eg: 4s vs 60s
on a Million-ish revisions repository).
Pierre-Yves David <pierre-yves.david@octobus.net> [Mon, 29 May 2017 05:53:58 +0200] rev 32729
push: add a way to allow concurrent pushes on unrelated heads
Client has a mechanism for the server to check that nothing changed server side
since the client prepared a push. That check is wide and any head changed on
the server will lead to an aborted push. We introduce a way for the client to
send a less strict checking. That logic will check that no heads impacted by
the push have been affected. If other unrelated heads (including named branches
heads) have been affected, the push will proceed.
This is very helpful for repositories with high developers traffic on different
heads, a common setup.
That behavior is currently controlled by an experimental option. The config
should live in the "server" section but bike-shedding of the name will happen
in the next changesets. Servers advertise this capability through a new bundle2
capability 'checkeads', using the value 'related'.
The 'test-push-race.t' is updated to check that new capabilities on the
documented cases.
Pierre-Yves David <pierre-yves.david@octobus.net> [Mon, 29 May 2017 05:52:13 +0200] rev 32728
headsummary: expose the 'discardedheads' set in the headssummary
That information will be useful to detect push race on related part of the
history.
See next changeset for details.
Pierre-Yves David <pierre-yves.david@octobus.net> [Mon, 29 May 2017 05:47:27 +0200] rev 32727
checkheads: perform obsolescence post processing directly in _headssummary
The goal is to have the function directly return something meaningful and
useful for the whole pull.
Note: we skip adding post-processing in '_oldheadssummary' because if a client
is too old for branchmap it will be too old for obsolescence too.
Pierre-Yves David <pierre-yves.david@octobus.net> [Mon, 29 May 2017 10:56:00 +0200] rev 32726
headssummary: directly feed the function with the 'pushop' object
Our goal is to be able to perform the post processing directly into the
'_headssummary' function. However before this patch the '_headsummary' function
only had access to repo, remote, outgoing while the '_postprocessobsolete'
function takes a 'pushop' object. Experience shows that having the 'pushop'
object helps extensions so we update '_headssummary' to take a pushop
object as argument.
Pierre-Yves David <pierre-yves.david@octobus.net> [Mon, 29 May 2017 05:45:59 +0200] rev 32725
checkheads: gather the postprocessing with other obsolescence specific code
We extract this function from the loop and gather it with the rest of the
obsolescence specific code. That will help to clarify the move of the whole logic
inside the "heads summary" computation.
Siddharth Agarwal <sid0@fb.com> [Tue, 06 Jun 2017 14:38:59 -0700] rev 32724
run-tests: add a way to list tests, with JSON and XUnit support
Some test runners are interested in listing tests, so they can do their own
filtering on top (usually based on attributes like historically observed
runtime). Add support for that.
Siddharth Agarwal <sid0@fb.com> [Tue, 06 Jun 2017 13:56:53 -0700] rev 32723
run-tests: install hg after computing tests to run
We're going to add a way to list tests, and we don't need to install hg for
that.
Siddharth Agarwal <sid0@fb.com> [Tue, 06 Jun 2017 13:52:25 -0700] rev 32722
run-tests: make time field optional for xunit report
We're going to use XUnit to list tests, and we don't have a time field in that
case.
Siddharth Agarwal <sid0@fb.com> [Tue, 06 Jun 2017 13:10:55 -0700] rev 32721
run-tests: factor out json write code into another method
We're going to use this code to output a JSON-formatted listing of tests.
Siddharth Agarwal <sid0@fb.com> [Tue, 06 Jun 2017 13:10:55 -0700] rev 32720
run-tests: factor out xunit write code into another method
We're going to use this code to output an XUnit-formatted listing of tests.
David Soria Parra <davidsp@fb.com> [Sat, 27 May 2017 10:25:09 -0700] rev 32719
revset: lookup descendents for negative arguments to ancestor operator
Negative offsets to the `~` operator now search for descendents. The search is
aborted when a node has more than one child as we do not have a definition for
'nth child'. Optionally we can introduce such a notion and take the nth child
ordered by rev number.
The current revset language does provides a short operator for ancestor lookup
but not for descendents. This gives user a simple revset to move to the previous
changeset, e.g. `hg up '.~1'` but not to the 'next' changeset. With this change
userse can now use `.~-1` as a shortcut to move to the next changeset.
This fits better into allowing users to specify revisions via revsets and
avoiding the need for special `hg next` and `hg prev` operations.
The alternative to negative offsets is adding a new operator. We do not have
many operators in ascii left that do not require bash escaping (',', '_', and
'/' come to mind). If we decide that we should add a more convenient short
operator such as ('/', e.g. './1') we can later add it and allow ascendents
lookup via negative numbers.
Pulkit Goyal <7895pulkit@gmail.com> [Tue, 06 Jun 2017 22:17:39 +0530] rev 32718
update: show the commit to which we updated in case of multiple heads (BC)
Currently when we have multiple heads on the same branch, update tells us that
there some more heads for the current branch but does not tells us the head to
which the repository has been updated to. It makes more sense showing the
head we updated to and then telling there are some more heads.
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 19 May 2017 20:29:11 -0700] rev 32717
revlog: skeleton support for version 2 revlogs
There are a number of improvements we want to make to revlogs
that will require a new version - version 2. It is unclear what the
full set of improvements will be or when we'll be done with them.
What I do know is that the process will likely take longer than a
single release, will require input from various stakeholders to
evaluate changes, and will have many contentious debates and
bikeshedding.
It is unrealistic to develop revlog version 2 up front: there
are just too many uncertainties that we won't know until things
are implemented and experiments are run. Some changes will also
be invasive and prone to bit rot, so sitting on dozens of patches
is not practical.
This commit introduces skeleton support for version 2 revlogs in
a way that is flexible and not bound by backwards compatibility
concerns.
An experimental repo requirement for denoting revlog v2 has been
added. The requirement string has a sub-version component to it.
This will allow us to declare multiple requirements in the course
of developing revlog v2. Whenever we change the in-development
revlog v2 format, we can tweak the string, creating a new
requirement and locking out old clients. This will allow us to
make as many backwards incompatible changes and experiments to
revlog v2 as we want. In other words, we can land code and make
meaningful progress towards revlog v2 while still maintaining
extreme format flexibility up until the point we freeze the
format and remove the experimental labels.
To enable the new repo requirement, you must supply an experimental
and undocumented config option. But not just any boolean flag
will do: you need to explicitly use a value that no sane person
should ever type. This is an additional guard against enabling
revlog v2 on an installation it shouldn't be enabled on. The
specific scenario I'm trying to prevent is say a user with a
4.4 client with a frozen format enabling the option but then
downgrading to 4.3 and accidentally creating repos with an
outdated and unsupported repo format. Requiring a "challenge"
string should prevent this.
Because the format is not yet finalized and I don't want to take
any chances, revlog v2's version is currently 0xDEAD. I figure
squatting on a value we're likely never to use as an actual revlog
version to mean "internal testing only" is acceptable. And
"dead" is easily recognized as something meaningful.
There is a bunch of cleanup that is needed before work on revlog
v2 begins in earnest. I plan on doing that work once this patch
is accepted and we're comfortable with the idea of starting down
this path.
Danek Duvall <danek.duvall@oracle.com> [Tue, 06 Jun 2017 08:58:27 -0700] rev 32716
check-code: ban grep's context flags (-A/-B/-C) since they're not on Solaris
David Demelier <demelier.david@gmail.com> [Tue, 06 Jun 2017 08:52:51 +0200] rev 32715
patchbomb: avoid -r and -B options at the same time
Danek Duvall <danek.duvall@oracle.com> [Mon, 05 Jun 2017 16:19:41 -0700] rev 32714
debugbundle: add --part-type flag to emit only named part types
This removes the need in the tests for grep -A, which is not supported on
Solaris.
Matt Harbison <matt_harbison@yahoo.com> [Mon, 05 Jun 2017 20:37:45 -0400] rev 32713
test-obsolete-bundle-strip: add globs for Windows
Jun Wu <quark@fb.com> [Sun, 04 Jun 2017 00:38:11 -0700] rev 32712
obsstore: move header encoding to a separate function
This patch moves encodeheader from encodemarkers. So markers and header
could be encoded separately.
Jun Wu <quark@fb.com> [Sun, 04 Jun 2017 08:49:15 -0700] rev 32711
obsstore: move _version to a propertycache
This makes sure _version is correct even if "_all" is not called.
Jun Wu <quark@fb.com> [Fri, 02 Jun 2017 20:38:01 -0700] rev 32710
obsstore: separate marker parsing from obsstore reading
This allows us to get raw obsstore content without parsing any markers.
Reading obsstore is much cheaper than parsing markers.
Jun Wu <quark@fb.com> [Fri, 02 Jun 2017 19:34:56 -0700] rev 32709
obsstore: move marker version reading to a separate function
This allows us to read marker version without reading markers.
Jun Wu <quark@fb.com> [Fri, 02 Jun 2017 19:32:27 -0700] rev 32708
obsstore: minor optimization for the obsolete revset
Use local variables in a loop.
Yuya Nishihara <yuya@tcha.org> [Sun, 23 Apr 2017 00:31:29 +0900] rev 32707
dispatch: do not close stdout and stderr, just flush() instead
Since 3a4c0905f357 "util: always force line buffered stdout when stdout is
a tty", we have two file objects attached to the same STDOUT_FILENO. If one
is closed, the underlying file descriptor is also closed, and writing to
the other file object would crash the Python interpreter in a hard way, at
least on Windows.
So, it seems safer to not close the standard streams. This also matches
the behavior of the default sys.stdout/stderr.close(), which never close
the FILE* streams in C layer.
https://hg.python.org/cpython/file/v2.7.13/Python/sysmodule.c#l1401
Yuya Nishihara <yuya@tcha.org> [Mon, 05 Jun 2017 23:36:35 +0900] rev 32706
windows: do not close stdout on flush() failure
It's been there since e817c68edfed (2007-02-19), but seems wrong since any
I/O operations to a closed file would raise ValueError, not IOError. We should
keep the file object open even if the underlying file descriptor is half dead.
Yuya Nishihara <yuya@tcha.org> [Mon, 05 Jun 2017 23:23:03 +0900] rev 32705
test-obsolete-bundle-strip: do not include \n in filename (issue5586)
Yuya Nishihara <yuya@tcha.org> [Fri, 19 Aug 2016 18:26:04 +0900] rev 32704
revlog: add support for partial matching of wdir node id
The idea is simple. If the given node id prefix is 'ff...f', add +1 to the
number of matches (e.g. ambiguous if partial + maybewdir > 1).
This patch also fixes id() revset and shortest() template since _partialmatch()
can raise WdirUnsupported exception.
Yuya Nishihara <yuya@tcha.org> [Sat, 20 Aug 2016 18:15:19 +0900] rev 32703
revset: add support for branch(wdir()) and wdir() & branch()
Siddharth Agarwal <sid0@fb.com> [Sun, 04 Jun 2017 16:08:50 -0700] rev 32702
dirstate: add docstring for invalidate
This always confuses me, and we already have a docstring on
localrepo.invalidatedirstate.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 02 Jun 2017 23:05:03 -0700] rev 32701
tests: simplify and clarify test-obsolete-bundle-strip.t a little
Martin von Zweigbergk <martinvonz@google.com> [Fri, 02 Jun 2017 23:29:20 -0700] rev 32700
tests: add missing parens in test-obsolete-bundle-strip.t
The "(not ${revs})" was missing parens around ${revs}, so when revs
was "A + B", it became "(not A + B)" when actually "(not (A + B))" was
intended. Fixing that leads to some more testing of strip.
Similarly, the parens were missing in "${revs}::", making it "A + B::"
instead of "(A + B)::". Thanks to Yuya for noticing this part. This
did not affect any existing tests.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 04 Jun 2017 20:37:32 -0400] rev 32699
test-clonebundles: conditionalize output for Windows
This was the fallout from 9d6031df42c8 (on stable). Now that individual lines
can be conditionalized, it seems better to be explicit, rather than mash all of
this into one regex. "getaddrinfo failed" was added in 4e566f513fd8 to support
Windows.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 04 Jun 2017 20:11:59 -0400] rev 32698
tests: adjust recent output changes for Windows
Matt Harbison <matt_harbison@yahoo.com> [Mon, 22 May 2017 21:45:02 -0400] rev 32697
killdaemons: close pid file before killing processes
With #serve enabled on Windows, I was getting occasional stacktraces like this:
Errored test-hgweb-json.t: Traceback (most recent call last):
File "./run-tests.py", line 724, in run
self.tearDown()
File "./run-tests.py", line 805, in tearDown
killdaemons(entry)
File "./run-tests.py", line 540, in killdaemons
logfn=vlog)
File "...\tests\killdaemons.py", line 94, in killdaemons
os.unlink(pidfile)
WindowsError: [Error 32] The process cannot access the file because it is
being used by another process: '...\\hgtests.zmpqj3\\child80\\daemon.pids'
Adrian suggested using util.posixfile, which works. However, the 'mercurial'
package isn't in sys.path when invoking run-tests.py, and it isn't clear that
hacking[1] it in is a good thing (especially for test-run-tests.t, which uses an
installation in a temp folder).
I tried using ProcessMonitor to figure out what the other process is, but that
monitoring slows things down to such a degree that the issue doesn't occur. I
was ready to blame the virus scanner, but it happens without that too.
Looking at the code, I don't see anything that would have the pid file open.
But I was able to get through about 20 full test runs without an issue with this
minor change, whereas before it was pretty certain to hit this at least once in
two or three runs.
[1] https://www.mercurial-scm.org/pipermail/mercurial-devel/2017-May/097907.html
Matt Harbison <matt_harbison@yahoo.com> [Sun, 21 May 2017 18:58:51 -0400] rev 32696
win32: drop a py26 daemonizing hack
I'm not sure what the referenced hang specifically was, but the whole test suite
(with #serve) still runs on python 2.7.13. Aside from no longer prepending
"cmd.exe /c", this backs out ca6aa8362f33.
I'm trying to track down a rare failure of TerminateProcess() with an access
error, and I've seen random extra python processes hanging around after running
tests sometimes, so this might help.
However, e48cb1c7a902 forces this change. Since the pid object is no longer
converted to a string, the cmd.exe pid was being saved instead of the hg pid,
and none of the daemons were being killed.
Pierre-Yves David <pierre-yves.david@octobus.net> [Mon, 29 May 2017 05:23:30 +0200] rev 32695
checkheads: simplify the code around obsolescence post-processing
The 'discardedheads' return become unused and the relationship between newheads
and newhs can be clarified. Our next goal here is to be able to extract the
_postprocessobsolete call outside of the loop.
We keep returning the 'discardedheads' because we'll start using it again soon
in this series.