Gregory Szorc <gregory.szorc@gmail.com> [Wed, 04 Apr 2018 11:44:38 -0700] rev 37346
tests: disallow using simple store repo with bundlerepo
bundlerepo is... going to be difficult to port to an alternate
store because it assumes revlogs for storage and essentially
overlays the contents of a bundle onto a fake revlog-like
primitive. It will be a good test case for our eventual new
storage interface.
Refactoring bundlerepo to make it work with non-revlog storage is
going to be a bit of work. So for now, let's refuse to use the
simple store repo when a bundlerepo is in play.
A new test requirement advertising support for treating bundle
files as repo instances has been added. Some tests have been
made conditional on this feature. Additional tests will be
annotated in subsequent commits.
Having positive opt-in to repo features will be simpler in the
long run because it will allow multiple storage backends to
declare feature support and we won't have to annotate each test
with the set of repo backends that are supported. Again, we'll
probably want better integration between repo features and
tests. But this is the easiest we can do at the moment.
Differential Revision: https://phab.mercurial-scm.org/D3060
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 04 Apr 2018 11:31:35 -0700] rev 37345
tests: disable test-revlog-v2 when using simple store
Because the simple store has nothing to do with revlogs.
Differential Revision: https://phab.mercurial-scm.org/D3056
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 03 Apr 2018 18:16:04 -0700] rev 37344
tests: skip filelog damage tests when not using revlogs
Differential Revision: https://phab.mercurial-scm.org/D3042
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 03 Apr 2018 10:04:30 -0700] rev 37343
tests: skip some tests when using simple store
generaldelta is a revlog implementation detail. We don't need to
test it with the simple store.
union repos are heavily revlog based. It should be possible to
run them with alternate stores. But it's not worth the trouble
at this juncture.
Differential Revision: https://phab.mercurial-scm.org/D3040
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 04 Apr 2018 13:21:34 -0700] rev 37342
tests: conditionalize tests based on presence of custom extensions
The test harness supports injecting extensions via --extra-config-opt.
However, if you do this, various tests that print state about loaded
extensions fail.
This commit teaches the test harness to recognize when custom
extensions are loaded so that tests can use feature sniffing to
conditionalize tests based on that.
Differential Revision: https://phab.mercurial-scm.org/D3039
Augie Fackler <augie@google.com> [Wed, 04 Apr 2018 12:16:50 -0700] rev 37341
simplestorerepo: avoid shadowing dict in list comprehension over dict
Caught by pyflakes.
Differential Revision: https://phab.mercurial-scm.org/D3077
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 03 Apr 2018 09:54:20 -0700] rev 37340
narrow: pass node into revlog.revision()
This is one of the few (possibly only) places where we pass an int in
for filelogs. Other revlogs (notably changelog) are very heavy on int
usage. But filelogs are surprisingly node centric. I'd like to
formalize the interface around the use of nodes (at least for
filelogs). So let's switch to a node.
We can't inline revlog.node() because of a check-code rule. I think
that rule is suspect. But it may be for performance reasons with
changelog code. I'd rather not touch it at this time.
Differential Revision: https://phab.mercurial-scm.org/D3043
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 03 Apr 2018 10:15:21 -0700] rev 37339
changegroup: remove "revlog" from error message
The previous message leaked an implementation detail.
Differential Revision: https://phab.mercurial-scm.org/D3041
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 03 Apr 2018 18:15:24 -0700] rev 37338
tests: conditionalize tests based on presence of revlogs for files
~85 tests don't like our non-revlog file store for various reasons.
This commit introduces hghave functionality for declaring and querying
repository features. By default, we assume repositories have
revlog-based file storage. But if the HGREPOFEATURES environment
variable is set, we can override the default set of repository
features. If you run the test harness with our simplestorerepo
extension and an environment variable set to the proper value, you
can override the hghave defaults to agree with simplestorerepo's
version of reality.
Various tests have been modified so behavior dependent on revlog-based
file storage is marked as such.
This fixes a handful of test failures with our custom file storage
extension. But dozens remain. The point of this commit is to demonstrate
how tests will need to be modified to account for custom storage
implementations.
TBH, I'm not convinced hghave is the proper layer for repository
feature detection. I /think/ we'll eventually want something in
run-tests.py itself. But that would require inventing a new primitive
in the test harness. This is all very alpha at the moment. So I think
hghave is an acceptable place to hang this feature detection. I think
the right time to be thinking about integrating this into run-tests.py
is *after* we have a stable alternate storage implementation in core.
For now, let's try to make progress towards the idea of an alternate
storage backend.
Differential Revision: https://phab.mercurial-scm.org/D3030
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 04 Apr 2018 11:37:07 -0700] rev 37337
tests: add test extension implementing custom filelog storage
In order to better support partial clones, we'll need alternate
repository storage mechanisms that aren't based on revlogs.
Today, the interface for repository storage isn't very well defined.
And there are various layering violations and assumptions made
throughout the code that storage is backed by revlogs.
In order to support alternate storage mechanisms, we'll need to
formally declare and adhere to interfaces for storage. This will
be a long, arduous process.
This commit creates an extension that implements non-revlog storage
for files. It defines a custom type that quacks like the existing
revlog/filelog API but isn't backed by a revlog. The backing storage
is - for simplicity reasons - a CBOR index and per-node files
representing fulltext data.
The localrepository class is modified so file(f) returns instances of
this class instead of filelog instances.
The purpose of this extension is to tease out what the actual filelog
interface is - based on running the test harness - so we can formalize
that interface and then implement a *real* alternate storage backend.
Using `run-tests.py --extra-config-opt` to run the test harness
with this extension enabled yields 83 failures out of 634 ran
tests.
The most common test failures are due to:
* Issues with `hg verify`
* LFS and largefiles (probably flags processing related)
* Narrow.
* Any test touching or inspecting individual filelog paths.
* help and error output that is confused by the presence of an
extension.
* `hg debug*` commands doing low-level, revlog-y things.
An 88% pass rate is pretty good for an initial implementation if you
ask me!
There is a bit of duplicate code in the new extension. That's by
design: a point of this code is to tease out dependencies on revlog.
That being said, there is opportunity to consolidate code by moving
things out of the revlog API. For example, DAG traversal operations
don't necessarily need to be implemented at the storage level. (Although
for performance reasons they probably do.) Once we have a more
well-defined interface, we could probably define the default
implementations in terms of the base interface, pull those in via
class inheritance, and have implementations override with faster
versions if they so choose. (Or something like that.) But for now,
the duplicate code should be acceptable.
Differential Revision: https://phab.mercurial-scm.org/D3029
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 03 Apr 2018 13:56:09 -0700] rev 37336
tests: use `hg unbundle` instead of `hg pull` in some tests
`hg pull <bundle>` uses the special "bundlerepo" repository. The
bundlerepo code makes many assumptions about the storage of
repositories. It will be difficult to teach bundlerepo to use
non-revlog storage before a better storage interface is established.
Many test failures using our "simple store" are related to
bundlerepo: the simple store just isn't compatible with bundlerepo
because of storage assumptions in bundlerepo.
In order to mitigate the impact of bundlerepo on our code base,
this commit changes various tests to use `hg unbundle` instead
of `hg pull`. This bypasses the bundlerepo code.
Tests exercising exchange functionality have not been altered, as
they should be using `hg pull` and going through the bundlerepo
code paths.
Differential Revision: https://phab.mercurial-scm.org/D3059
Martin von Zweigbergk <martinvonz@google.com> [Wed, 04 Apr 2018 09:41:18 -0700] rev 37335
hgweb: use revsymbol() for creating context from changeid
These seem to be for looking up a revision that can come from the
user, so revsymbol() is the right method to call (
0194dac7 has more
information about my plans for repo[x]).
Differential Revision: https://phab.mercurial-scm.org/D3075
Martin von Zweigbergk <martinvonz@google.com> [Tue, 03 Apr 2018 23:00:41 -0700] rev 37334
hgweb: inline changeidctx()
Differential Revision: https://phab.mercurial-scm.org/D3074
Martin von Zweigbergk <martinvonz@google.com> [Tue, 03 Apr 2018 21:50:42 -0700] rev 37333
hgweb: drop support for "manifest" parameter
AFAICT (but note that this is the first time I look at hgweb code),
the "mercurial" query parameter was removed from rendered pages in
36fa5db79dd5 (hgweb: convert gitweb to NWI, 2006-10-05). Search for
"manifest=" in that diff to see why I think it was removed. It's about
time we stop looking for the parameter in requests.
Differential Revision: https://phab.mercurial-scm.org/D3073
Martin von Zweigbergk <martinvonz@google.com> [Wed, 04 Apr 2018 10:32:48 -0700] rev 37332
rebase: use single transaction when running in memory
rebase.singletransaction make rebase noticeably faster (~20% in a test
I just ran). It is not enabled by default because it risks losing
information if it aborts (see `hg help rebase`). When running rebase
with the experimental in-memory option on, rebase is first attempted
in memory, and if any conflicts occur, it restarts, this time writing
to disk. Thus, it should be safe to turn on single-transaction mode
for the in-memory phase.
Differential Revision: https://phab.mercurial-scm.org/D3076