Fri, 16 Nov 2018 18:37:26 -0500 subrepo: print the status line before creating the peer for better diagnostics stable
Matt Harbison <matt_harbison@yahoo.com> [Fri, 16 Nov 2018 18:37:26 -0500] rev 40440
subrepo: print the status line before creating the peer for better diagnostics I ran into a problem where I tried updating to a different branch, and the process appeared to hang. It turned out that the subrepo revision wasn't available locally, and I must have originally cloned it from an `hg serve -S` on a machine that currently wasn't serving anything. It took 2+ minutes to timeout, and didn't mention what it was connecting to even then. There are a couple of other issues in this scenario too. - The repo is dirty after the failed checkout because the top level repo is updated first. We should probably make 2 passes- top down to pull everything needed, and then do an update once everything is in place. - Something must be reading .hgsubstate from wdir because if the same merge command is run after the timeout, a prompt is issued that the local and remote subrepo diverged, instead of hanging. But it lists the local version and remote version as having the same hash.
Wed, 14 Nov 2018 11:52:13 -0500 tests: allow for 100% of profiled time in sleep in test-profile.t stable
Augie Fackler <augie@google.com> [Wed, 14 Nov 2018 11:52:13 -0500] rev 40439
tests: allow for 100% of profiled time in sleep in test-profile.t I'm getting an annoying failure in this test on our builder, and I *think* what's happening is that the profiler is taking _just_ long enough to start that we're spending 100% of the profiled time in the sleep function, which was causing the leading space to not be printed since the 100 was in the first column of output. Differential Revision: https://phab.mercurial-scm.org/D5272
Wed, 14 Nov 2018 15:06:21 +0800 copystore: provide unit to ui.makeprogress() stable
Anton Shestakov <av6@dwimlabs.net> [Wed, 14 Nov 2018 15:06:21 +0800] rev 40438
copystore: provide unit to ui.makeprogress()
Wed, 14 Nov 2018 15:07:02 +0800 verify: provide unit to ui.makeprogress() stable
Anton Shestakov <av6@dwimlabs.net> [Wed, 14 Nov 2018 15:07:02 +0800] rev 40437
verify: provide unit to ui.makeprogress()
Tue, 13 Nov 2018 19:47:48 -0500 tests: fix wireproto redirection test on systems without tls1.2 stable
Augie Fackler <augie@google.com> [Tue, 13 Nov 2018 19:47:48 -0500] rev 40436
tests: fix wireproto redirection test on systems without tls1.2 Our automated package builder has some ancient configuration that lacks modern TLS, which is how we noticed this. Tested: the test now passes on both macOS High Sierra (has tls1.2) and Ubuntu Trusty (which does not).
Sat, 10 Nov 2018 22:25:12 -0500 phabricator: ensure the command summaries are available in extension help stable
Matt Harbison <matt_harbison@yahoo.com> [Sat, 10 Nov 2018 22:25:12 -0500] rev 40435
phabricator: ensure the command summaries are available in extension help Previously, `hg help phabricator` listed the 3 supported commands at the bottom of the extension help, but said "no help text available".
Fri, 09 Nov 2018 23:49:39 +0000 hgweb: cast bytearray to bytes stable
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 09 Nov 2018 23:49:39 +0000] rev 40434
hgweb: cast bytearray to bytes PEP-3333 seems to indicate that bytes is the only allowed type that can be used to express the output of a WSGI application. And some WSGI environments seem to enforce this (mod_wsgi does). This commit universally casts bytearray instances to bytes to appease the WSGI specification. I found this because wireprotov2 is emitting bytearray instances. I'd like to keep things that way because the way it builds a data structure, bytearray is more efficient. I'd rather keep the low-level code efficient (and using bytearray) and cast at the edges than impose a performance penalty on code that may run outside WSGI contexts.
Thu, 08 Nov 2018 20:04:07 -0500 help: unjumble the list of default config values for `internals.config` stable
Matt Harbison <matt_harbison@yahoo.com> [Thu, 08 Nov 2018 20:04:07 -0500] rev 40433
help: unjumble the list of default config values for `internals.config`
Mon, 05 Nov 2018 15:01:45 -0800 tweakdefaults: remove commands.resolve.mark-check=abort, it is too broken stable
Kyle Lippincott <spectral@google.com> [Mon, 05 Nov 2018 15:01:45 -0800] rev 40432
tweakdefaults: remove commands.resolve.mark-check=abort, it is too broken See issue6020 for the current case. I don't want to continue attempting to fix this on the stable branch, so I'm removing from tweakdefaults and will send fixes meant for the default branch and 4.9. Differential Revision: https://phab.mercurial-scm.org/D5225
Fri, 02 Nov 2018 11:57:45 -0700 resolve: when resolve.mark-check=abort, downgrade to warning if pats specified stable
Kyle Lippincott <spectral@google.com> [Fri, 02 Nov 2018 11:57:45 -0700] rev 40431
resolve: when resolve.mark-check=abort, downgrade to warning if pats specified Previously, with --config resolve.mark-check=abort, running `hg resolve -m foo` would abort and emit a message saying to use --all. This command does not work, though: `hg resolve -m foo --all`, and it's really weird for --all to be the "--force" flag. My original goal with the option was to make it so that `hg resolve -m` (no filename arguments) was safer, which is why --all is used; in my mind, `hg resolve -m foo` should always mark it as resolved, and `--all` is how you specify "all the files", so that's why I chose `hg resolve -m --all` as the way out of `hg resolve -m` aborting. This commit makes all of this work the way it was meant to in my head :) Differential Revision: https://phab.mercurial-scm.org/D5218
Fri, 02 Nov 2018 14:18:29 -0400 Added signature for changeset a91a2837150b stable
Augie Fackler <raf@durin42.com> [Fri, 02 Nov 2018 14:18:29 -0400] rev 40430
Added signature for changeset a91a2837150b
Fri, 02 Nov 2018 14:18:26 -0400 Added tag 4.8 for changeset a91a2837150b stable
Augie Fackler <raf@durin42.com> [Fri, 02 Nov 2018 14:18:26 -0400] rev 40429
Added tag 4.8 for changeset a91a2837150b
Sun, 28 Oct 2018 21:16:36 +0900 rust: fix signature of rustlazyancestors_init() function stable 4.8
Yuya Nishihara <yuya@tcha.org> [Sun, 28 Oct 2018 21:16:36 +0900] rev 40428
rust: fix signature of rustlazyancestors_init() function Obviously, sizeof(int) != mem::size_of::<usize>() on amd64, though the argument would be passed in 64-bit register anyway.
Fri, 02 Nov 2018 21:25:35 +0900 tests: require SQLite 3.8.3+ as sqlitestore relies on "WITH" clause stable
Yuya Nishihara <yuya@tcha.org> [Fri, 02 Nov 2018 21:25:35 +0900] rev 40427
tests: require SQLite 3.8.3+ as sqlitestore relies on "WITH" clause The test fails on gcc112 because the SQLite is too old. https://sqlite.org/changes.html#version_3_8_3
Fri, 19 Oct 2018 22:09:53 +0800 relnotes: various tweaks for release notes stable
Anton Shestakov <av6@dwimlabs.net> [Fri, 19 Oct 2018 22:09:53 +0800] rev 40426
relnotes: various tweaks for release notes Stop filtering out commits that are expected to be covered by releasenotes extension: now we want two lists, one for WhatsNew and one for ReleaseX.Y. Use `only(stoprev, startrev)` to make `relnotes -h` output be actually true about what revisions are included. More filter rules, mostly obvious. More classifying rules to have less things in "unsorted". Looks like nargs=1 was just making args.startrev and args.stoprev be lists for no reason. BC and API sections are renamed to what we're using on the WhatsNew page, and also just skipped if empty.
Thu, 01 Nov 2018 12:52:16 +0100 delta: skip "empty delta" optimisation for non-general case (issue6006) stable
Boris Feld <boris.feld@octobus.net> [Thu, 01 Nov 2018 12:52:16 +0100] rev 40425
delta: skip "empty delta" optimisation for non-general case (issue6006) Non-general delta repository cannot delta against anything than prev. So even if the delta to prev is empty we should use it. This is similar to the change made in bafa1c4bb7a8. Differential Revision: https://phab.mercurial-scm.org/D5201
Thu, 01 Nov 2018 16:32:16 -0700 narrow: fix copies._fullcopytracing() narrowspec filtering in graft case stable
Martin von Zweigbergk <martinvonz@google.com> [Thu, 01 Nov 2018 16:32:16 -0700] rev 40424
narrow: fix copies._fullcopytracing() narrowspec filtering in graft case I broke this too in 707c3804e607 (narrow: move copies overrides to core, 2018-09-28). Hopefully I'm done fixing things broken by that commit now. Differential Revision: https://phab.mercurial-scm.org/D5213
Thu, 01 Nov 2018 16:28:11 -0700 tests: demonstrate broken copies._fullcopytracing() stable
Martin von Zweigbergk <martinvonz@google.com> [Thu, 01 Nov 2018 16:28:11 -0700] rev 40423
tests: demonstrate broken copies._fullcopytracing() Turns out copies._fullcopytracing() was also broken. Differential Revision: https://phab.mercurial-scm.org/D5212
Thu, 01 Nov 2018 13:20:12 -0700 narrow: make copies.pathcopies() filter with narrowspec again stable
Martin von Zweigbergk <martinvonz@google.com> [Thu, 01 Nov 2018 13:20:12 -0700] rev 40422
narrow: make copies.pathcopies() filter with narrowspec again I broke this in 707c3804e607 (narrow: move copies overrides to core, 2018-09-28). Differential Revision: https://phab.mercurial-scm.org/D5203
Thu, 01 Nov 2018 11:24:45 -0700 tests: demonstrate broken copies.pathcopies() stable
Martin von Zweigbergk <martinvonz@google.com> [Thu, 01 Nov 2018 11:24:45 -0700] rev 40421
tests: demonstrate broken copies.pathcopies() Differential Revision: https://phab.mercurial-scm.org/D5202
Wed, 31 Oct 2018 20:32:42 +0100 setup: explain to distutils how we write rc versions stable
"Paul Morelle <paul.morelle@octobus.net" [Wed, 31 Oct 2018 20:32:42 +0100] rev 40420
setup: explain to distutils how we write rc versions When we use a rc version number (e.g. 4.8rc0), bdist_msi is using distutils.StrictVersion to parse it into a tuple of numbers. By default, StrictVersion.version_re only recognizes [ab] for alpha/beta, where mercurial may use '-rc' or 'rc'. This change makes StrictVersion parse correctly our version numbers, so that bdist_msi doesn't fail on rc versions.
Wed, 31 Oct 2018 12:08:37 -0700 changegroup: restore default node ordering (issue6001) stable
Boris Feld <boris.feld@octobus.net> [Wed, 31 Oct 2018 12:08:37 -0700] rev 40419
changegroup: restore default node ordering (issue6001) Changeset db5501d9 changed the default node ordering from "storage" to "linearize". While the new API is more explicit and cleaner, the "linearize" order is problematic on certain repositories like netbeans where it makes bundling slower the more nodes we bundle. Pushing and pulling 100 changesets was ~20% slower and pushing and pulling 1000 changesets was ~600% slower. A very quick analysis of profile traces showed that the pull operation was taking more time creating the delta. Putting back the old default order seems to be the safe option. With more time during the next cycle, we can understand better the impact of sorting with the DAG order by default, the source of the regression and how to mitigate it. /!\ We are still waiting for the full performance impact but with this patch, bundling and pulling locally (not on the performance workstation) 1000 changesets on the netbeans repository is as fast as before the regression. Differential Revision: https://phab.mercurial-scm.org/D5196
Mon, 29 Oct 2018 17:26:25 +0100 changegroup: introduce an explicit linear sorting stable
Boris Feld <boris.feld@octobus.net> [Mon, 29 Oct 2018 17:26:25 +0100] rev 40418
changegroup: introduce an explicit linear sorting We still need to linearize the revisions in some cases, introduce an explicit `linear` sorting before changing back the default order. Differential Revision: https://phab.mercurial-scm.org/D5195
Wed, 31 Oct 2018 21:16:54 +0900 fix: disable use of thread-based worker stable
Yuya Nishihara <yuya@tcha.org> [Wed, 31 Oct 2018 21:16:54 +0900] rev 40417
fix: disable use of thread-based worker getfixes() accesses to repo, changectx, filectx, etc., so I believe there are code paths triggering data race. Mercurial API isn't thread safe in general.
Wed, 31 Oct 2018 15:27:06 +0300 configitems: rename the config to prevent adding an alias in future stable
Pulkit Goyal <pulkit@yandex-team.ru> [Wed, 31 Oct 2018 15:27:06 +0300] rev 40416
configitems: rename the config to prevent adding an alias in future Right now the config option looks like: [experimental.server] stream-narrow-clones= which does not match how config options are generally defined in core. So let's rename this to: [experimental] server.stream-narrow-clones= before the new release so that we don't have to add an alias in future for this. Differential Revision: https://phab.mercurial-scm.org/D5198
Wed, 31 Oct 2018 11:02:08 +0100 sparse-revlog: only refine delta candidates in the sparse case (issue6006) stable
Boris Feld <boris.feld@octobus.net> [Wed, 31 Oct 2018 11:02:08 +0100] rev 40415
sparse-revlog: only refine delta candidates in the sparse case (issue6006) Starting with 5aef5afa8654, a valid delta parent might be "refined". This allows repository using sparse-revlog to produce better delta chain by using better intermediate snapshot base. However, this refining step was performed in all cases, including for repository not using sparse-revlog. This could produce a strange chain in the general delta case and corrupted repository in the non-general delta case. We now skip this step unless sparse-revlog is in use. In issue 6006, Yuya Nishihara provided a test case using an external repository, so we did not include it. Finding "laboratory" condition to reproduce this case and implementing an efficient test reproducing it is a bit tricky. We do not foresee to have the time to provide one by the release date. Differential Revision: https://phab.mercurial-scm.org/D5197
Mon, 29 Oct 2018 16:23:42 -0400 http: work around custom http client classes that refuse extra attrs stable
Augie Fackler <augie@google.com> [Mon, 29 Oct 2018 16:23:42 -0400] rev 40414
http: work around custom http client classes that refuse extra attrs I have no idea what is going on with our custom http client code at Google, but it chokes on these extra attributes we're tucking on http clients. Since it feels more than a little wrong to just stuff extra data on a client, let's degrade gracefully when the client class refuses the attributes.
Thu, 25 Oct 2018 21:33:43 +0800 crecord: make nextsametype() check that parent item exists (issue6009) stable
Anton Shestakov <av6@dwimlabs.net> [Thu, 25 Oct 2018 21:33:43 +0800] rev 40413
crecord: make nextsametype() check that parent item exists (issue6009) Items that represent files in curses interface don't have parents.
Wed, 24 Oct 2018 10:05:13 -0400 help: describe what ui.tweakdefaults changes, concretely stable
Valentin Gatien-Baron <vgatien-baron@janestreet.com> [Wed, 24 Oct 2018 10:05:13 -0400] rev 40412
help: describe what ui.tweakdefaults changes, concretely Currently, one has to look at the code. A couple things are suboptimal: - probably not translatable - lines don't get wrapped (a couple are a bit too long) but it seems to better this way than without help at all. Differential Revision: https://phab.mercurial-scm.org/D5187
Thu, 25 Oct 2018 00:22:42 -0400 logexchange: convert paths to unix when detecting the active path stable
Matt Harbison <matt_harbison@yahoo.com> [Thu, 25 Oct 2018 00:22:42 -0400] rev 40411
logexchange: convert paths to unix when detecting the active path This fixes the problem in the tests[1] where Windows was showing the whole path as the remotename for local repositories. Somebody with a better understanding of this extension should probably take a deeper look. There may be other cases that need to be converted- specifically the `elif not instance` and the missing `else` cases in activepath(). I also noticed when adding debug prints that the absolute path is stored in the file, probably not normalized. (It's wrapped up in $TESTTMP.) [1] https://buildbot.mercurial-scm.org/builders/Win7%20x86_64%20hg%20tests/builds/1042/steps/run-tests.py%20%28python%202.7.13%29/logs/stdio
Wed, 24 Oct 2018 22:40:48 -0400 help: update the default value specified for `profiling.time-track` stable
Matt Harbison <matt_harbison@yahoo.com> [Wed, 24 Oct 2018 22:40:48 -0400] rev 40410
help: update the default value specified for `profiling.time-track` I tried conditionalizing this in a `.. container::` block, but that seemed to add an extra blank line between the main text and the parenthetical.
Wed, 24 Oct 2018 22:24:10 -0400 profiling: revert the default mode back to 'cpu' on Windows stable
Matt Harbison <matt_harbison@yahoo.com> [Wed, 24 Oct 2018 22:24:10 -0400] rev 40409
profiling: revert the default mode back to 'cpu' on Windows On Windows, os.times() only returns user and system times. Real elapsed time is 0. That results in no actual times reported, an end wall time of 0.000000, and seemingly randomly sorted stack frames. This at least provides test stability in test-profile.t. I kind of think that `default=pycompat.iswindows and 'cpu' or 'real'` would be a better way to set the default in configitems, but I didn't see any other examples of this, and thought maybe there's a reason for that. That might allow plugging the value into the help text automatically- the documented default wasn't updated in db0dba2d157d.
Wed, 17 Oct 2018 14:47:01 +0200 phase: add an archived phase stable
Boris Feld <boris.feld@octobus.net> [Wed, 17 Oct 2018 14:47:01 +0200] rev 40408
phase: add an archived phase This phase allows for hidden changesets in the "user space". It differs from the "internal" phase which is intended for internal by-product only. There have been discussions at the 4.8 sprint to use such phase to speedup cleanup after history rewriting operation. Shipping it in the same release as the 'internal-phase' groups the associated `requires` entry. The important bit is to have support for this phase in the earliest version of mercurial possible. Adding the UI to manipulate this new phase later seems fine. The current plan for archived usage and user interface are as follow. On a repository with internal-phase on and evolution off: * history rewriting command set rewritten changeset in the archived phase. (This mean updating the cleanupnodes method). * keep `hg unbundle .hg/strip-backup/X.hg` as a way to restore changeset for now (backup bundle need to contains phase data) * [maybe] add a `hg strip --soft` advance flag (a light way to expose the feature without getting in the way of a better UI) Mercurial 4.8 freeze is too close to get the above in by then. We don't introduce a new repository `requirement` as we reuse the one introduced with the 'archived' phase during the 4.8 cycle.
Tue, 23 Oct 2018 20:46:21 +0900 exewrapper: apply clang-format to silence test-check-clang-format.t stable
Yuya Nishihara <yuya@tcha.org> [Tue, 23 Oct 2018 20:46:21 +0900] rev 40407
exewrapper: apply clang-format to silence test-check-clang-format.t
Mon, 22 Oct 2018 14:48:14 -0400 Added signature for changeset 956ec6f1320d stable
Augie Fackler <raf@durin42.com> [Mon, 22 Oct 2018 14:48:14 -0400] rev 40406
Added signature for changeset 956ec6f1320d
Mon, 22 Oct 2018 14:48:11 -0400 Added tag 4.8rc0 for changeset 956ec6f1320d stable
Augie Fackler <raf@durin42.com> [Mon, 22 Oct 2018 14:48:11 -0400] rev 40405
Added tag 4.8rc0 for changeset 956ec6f1320d
Mon, 22 Oct 2018 14:46:06 -0400 merge to stable for 4.8 release freeze stable 4.8rc0
Augie Fackler <augie@google.com> [Mon, 22 Oct 2018 14:46:06 -0400] rev 40404
merge to stable for 4.8 release freeze
Mon, 22 Oct 2018 11:34:35 -0700 shortest: never emit 0-length prefix even if unique
Martin von Zweigbergk <martinvonz@google.com> [Mon, 22 Oct 2018 11:34:35 -0700] rev 40403
shortest: never emit 0-length prefix even if unique It turned out that the pure version of our code for finding the shortest unique nodeid prefix would return a 0-length string if that was unique (because there was at most one revision in the disambiguation set). That's kind of correct, but it can't be used as input, so we shouldn't return it. Let's just adjust the given minlength up to at least 1. This fixes test-template-functions.t, which was failing in pure mode. Differential Revision: https://phab.mercurial-scm.org/D5181
Mon, 22 Oct 2018 15:51:01 +0200 logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net> [Mon, 22 Oct 2018 15:51:01 +0200] rev 40402
logtoprocess: sends the canonical command name to the subprocess One of the use-case of logtoprocess is to monitor command duration. With the current code, we only get whatever command name the user typed (either abbreviated or aliased). This makes analytics on the collected data more difficult. Stores the canonical command name in the request object. Pass the stored canonical name in the `req.ui.log("commandfinish", ...)` call as keyword argument to not break potential string formatting. Pass the value as the environment variable named `LTP_COMMAND` to the called script. Differential Revision: https://phab.mercurial-scm.org/D4820
Mon, 22 Oct 2018 15:47:30 +0200 logtoprocess: fix message formatting
Boris Feld <boris.feld@octobus.net> [Mon, 22 Oct 2018 15:47:30 +0200] rev 40401
logtoprocess: fix message formatting The logtoprocess used to try formatting the message using keyword options instead of always using the rest of the arguments. Update it to match blackbox behavior. Differential Revision: https://phab.mercurial-scm.org/D5180
Sat, 18 Aug 2018 01:44:38 +0200 profiling: move default mode to "real" time
Boris Feld <boris.feld@octobus.net> [Sat, 18 Aug 2018 01:44:38 +0200] rev 40400
profiling: move default mode to "real" time Mercurial operations involve a lot of disks or network access. These impact command runtime significantly and it seems important to report them in our default profiling output. Having the right default means that we don't forget them when asking people to produces profiling traces or when doing profiling ourselves. Moving to "real time" by default will remove the need to think about activating it on most occasions. The "CPU" time-based profiling is still accessible when necessary.
Fri, 05 Oct 2018 23:40:12 +0800 streamclone: abort when client needs to handle obsmarkers, but doesn't
Anton Shestakov <av6@dwimlabs.net> [Fri, 05 Oct 2018 23:40:12 +0800] rev 40399
streamclone: abort when client needs to handle obsmarkers, but doesn't When client doesn't have any of obsolescence markers exchange capabilities, then it's safe to say it can't handle obsmarkers. However, if it understands even one format version, then stream clones are fine -- client can use "obsmarkers" bundle2 part.
Fri, 05 Oct 2018 23:27:17 +0800 streamclone: include obsstore file into stream bundle if client can read it
Anton Shestakov <av6@dwimlabs.net> [Fri, 05 Oct 2018 23:27:17 +0800] rev 40398
streamclone: include obsstore file into stream bundle if client can read it
Fri, 19 Oct 2018 18:34:42 -0400 setup: build exewrapper with Unicode support on py3
Matt Harbison <matt_harbison@yahoo.com> [Fri, 19 Oct 2018 18:34:42 -0400] rev 40397
setup: build exewrapper with Unicode support on py3 I didn't see a compiler switch documented anywhere, but I diffed the command line for full VC++ project when toggling between MBCS and Unicode. This is all they do.
Fri, 19 Oct 2018 18:32:13 -0400 exewrapper: convert to _tcsxxx functions for Unicode compatability
Matt Harbison <matt_harbison@yahoo.com> [Fri, 19 Oct 2018 18:32:13 -0400] rev 40396
exewrapper: convert to _tcsxxx functions for Unicode compatability This fixes more than 50 tests on py3 on Windows when enabled, mostly hooks and such that invoked `hg` directly. 187 left to go. I skipped doing the abort printing with Unicode because of apparent issues with MinGW [1]. It may be moot though, as MinGW isn't listed as a supported compiler after 3.4 [2]. [1] https://stackoverflow.com/questions/17700797/printf-wprintf-s-s-ls-char-and-wchar-errors-not-announced-by-a-compil [2] https://wiki.python.org/moin/WindowsCompilers
Fri, 19 Oct 2018 18:23:14 -0400 exewrapper: drop an unused variable
Matt Harbison <matt_harbison@yahoo.com> [Fri, 19 Oct 2018 18:23:14 -0400] rev 40395
exewrapper: drop an unused variable
Thu, 18 Oct 2018 21:14:22 +0900 commands: restore compatibility for "^cmd" registration (issue6005)
Yuya Nishihara <yuya@tcha.org> [Thu, 18 Oct 2018 21:14:22 +0900] rev 40394
commands: restore compatibility for "^cmd" registration (issue6005) This is done at loading time, where ui is available.
Fri, 19 Oct 2018 12:30:49 +0200 exchangev2: support fetching shallow files history
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 19 Oct 2018 12:30:49 +0200] rev 40393
exchangev2: support fetching shallow files history This commit teaches the exchangev2 client code to handle fetching shallow files data. Only shallow fetching of files data is supported: shallow fetching of changeset and manifest data is explicitly not yet supported. Previously, we would fetch file revisions for changesets that were received by the current pull operation. In the new model, we calculate the set of "relevant" changesets given the pull depth and only fetch files data for those changesets. We also teach the "filesdata" command invocation to vary parameters as needed. The implementation here is far from complete or optimal. Subsequent pulls will end up re-fetching a lot of files data. But the application of this data should mostly be a no-op on the client, so it isn't a big deal. Depending on the order file revisions are fetched in, revisions could get inserted with the wrong revision number relationships. I think the best way to deal with this is to remove revision numbers from storage and to either dynamically derive them (by reconstructing a DAG from nodes/parents) or remove revision numbers from the file storage interface completely. A missing API that we'll likely want to write pretty soon is "ensure files for revision(s) are present." We can kind of cajole exchangev2.pull() to do this. But it isn't very efficient. For example, in simple cases like widening the store to obtain data for a single revision, it is probably more efficient to walk the manifest and find exactly which file revisions are missing and to make explicit requests for just their data. In more advanced cases, asking the server for all files data may be more efficient, even though it requires sending data the client already has. There is tons of room for future experimentation here. And TBH I'm not sure what the final state will be. Anyway, this commit gets us pretty close to being able to have shallow and narrow checkouts with exchangev2/sqlite storage. Close enough that a minimal extension should be able to provide fill in the gaps until the code in core stabilizes and there is a user-facing way to trigger the narrow/shallow bits from `hg clone` without also implying using of the narrow extension... Differential Revision: https://phab.mercurial-scm.org/D5169
Wed, 17 Oct 2018 17:32:15 +0200 sqlitestore: support for storing revisions without their parents
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 17 Oct 2018 17:32:15 +0200] rev 40392
sqlitestore: support for storing revisions without their parents This commit kinda/sorta implements the equivalent of ellipsis nodes for the SQLite storage backend. Without implementing full blown ellipsis nodes (and the necessary support for them in the wire protocol), we instead teach the store to rewrite the p1 and p2 nodes to nullid when the incoming parent isn't in the local store. This allows servers to remain dumb and send the real parent and have the clients deal with the missing parent problem. This obviously isn't ideal because a benefit of ellipsis nodes is we can insert a fake parent to ellide missing changesets. But neither solution is ideal because it drops the original parent from storage. We could probably teach the SQLite store to retain the original parent and handle missing parents at read time. However, parent revisions are stored as integers and it isn't trivial to store an "empty" revision in the store yet, which would be necessary to represent the "missing" parent. The store is somewhat intelligent in trying to remove the missing parents metadata when the revision is re-added. But, revision numbers will be all messed up in that case, so I'm not sure it is worth it. At some point we'll likely want to remove the concept of revision numbers from the database and have the store invent them at index generation time. Or even better, we can do away with revision numbers from the file storage interface completely. We'll get there eventually... Differential Revision: https://phab.mercurial-scm.org/D5168
Fri, 19 Oct 2018 15:38:25 +0200 wireprotov2: support exposing linknode of file revisions
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 19 Oct 2018 15:38:25 +0200] rev 40391
wireprotov2: support exposing linknode of file revisions When supporting shallow file storage, clients may fetch file revisions by changeset. But they may not readily know which changeset introduced a specific file revision. The "linknode" is used to record which changeset introduces which file revision. This commit teaches the "filedata" and "filesdata" wire protocol commands to expose the linknode for file revisions. The implementation is likely wrong when hidden changesets are in play, since the linknode may refer to a hidden changeset. We can deal with this problem later. Differential Revision: https://phab.mercurial-scm.org/D5167
Fri, 19 Oct 2018 14:59:03 +0200 localrepo: support marking repos as having shallow file storage
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 19 Oct 2018 14:59:03 +0200] rev 40390
localrepo: support marking repos as having shallow file storage Various operations against repositories need to know if repository storage is full or partial. For example, a checkout (including possibly a widening of a sparse checkout), needs to know if it can assume all file revisions are available or whether to look for missing revisions first. This commit lays the plumbing for doing that. We define a repo creation option that indicates that shallow file storage is desired. The SQLite store uses this creation option to add an extra repo requirement indicating file storage is shallow. A new repository feature has been added to indicate that file storage is shallow. The SQLite store adds this feature when the shallow file store requirement is present. Code can now look at repo.features to determine if repo file storage may be shallow and take additional actions if so. While we're here, we also teach the SQLite store to handle the narrow repo requirement, which gets added when making narrow clones. Differential Revision: https://phab.mercurial-scm.org/D5166
Wed, 26 Sep 2018 14:41:15 -0700 repository: teach addgroup() to receive data with missing parents
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 26 Sep 2018 14:41:15 -0700] rev 40389
repository: teach addgroup() to receive data with missing parents The way the narrow extension works today, the server rewrites outgoing changegroup data to lie about parents when the parents data is missing. It adds the ellipsis flag to the revision so it can be recorded as such in the revlog. In the new wire protocol, such rewriting does not occur on the server (at least not yet anyway). Instead, it is up to the client to recognize when it has received a revision without its parents. This means rewriting will be performed on the client. Furthermore, the mechanism for storing a shallow revision may differ from store to store. For example, the revlog store uses the ellipsis flag to denote a revision's parents have been rewritten. But a non-revlog store may wish to store things differently. And, some stores may not even support receiving shallow revision data! Therefore, it makes sense for the store itself to be making decisions about what to do when they receive revision data without their parents. This commit teaches the addgroup() bulk insert method to accept a boolean argument that indicates whether the incoming data may lack parent revisions. This flag can be set when receiving "shallow" data from a remote. The revlog implementation of this method has been taught to rewrite the missing parent(s) to nullid and to add the ellipsis flag to the revision when a missing parent is encountered. But it only does this if ellipsis flags are enabled on the repo and the incoming data is marked as possibly shallow. An error occurs otherwise. Differential Revision: https://phab.mercurial-scm.org/D5165
Fri, 19 Oct 2018 13:44:25 +0200 commands: support passing depth to hg.clone()
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 19 Oct 2018 13:44:25 +0200] rev 40388
commands: support passing depth to hg.clone() This will allow extensions to add --depth or other arguments to control depth fetching. Differential Revision: https://phab.mercurial-scm.org/D5164
Wed, 03 Oct 2018 14:57:29 -0700 filelog: add a hasnode() method (API)
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 03 Oct 2018 14:57:29 -0700] rev 40387
filelog: add a hasnode() method (API) Missing in the file storage interface is the ability to query whether a specified value is a known node. This commit defines that interface member and implements it on the revlog and sqlite file stores. Storage unit tests have been added. The revlog implementation is a bit more complicated because index lookups don't consistently raise the same exception. For SQLite, we can simply look for a key in a dict. Differential Revision: https://phab.mercurial-scm.org/D5163
Sun, 21 Oct 2018 22:26:00 -0400 lfs: consult the narrow matcher when extracting pointers from ctx (issue5794)
Matt Harbison <matt_harbison@yahoo.com> [Sun, 21 Oct 2018 22:26:00 -0400] rev 40386
lfs: consult the narrow matcher when extracting pointers from ctx (issue5794) I added a testcase for lfs to all narrow tests, and the following failed: test-narrow-acl.t test-narrow-exchange.t test-narrow-patterns.t test-narrow-strip.t test-narrow-trackedcmd.t test-narrow-widen.t test-narrow.t The first two still have errors in the pretxnchangegroup on clone and (receiving a) push, which I'm still looking into (4d63f3bc1e1a fixed something in this area already). These two modified tests seem to cover the things that failed in the remaining narrow tests, i.e. `hg tracked` and `hg strip`, so I didn't bother enabling the testcases elsewhere. Maybe we should, but it's 68 tests total.
Sat, 20 Oct 2018 20:25:56 +0900 statprof: fix overflow while skipping boilerplate parts
Yuya Nishihara <yuya@tcha.org> [Sat, 20 Oct 2018 20:25:56 +0900] rev 40385
statprof: fix overflow while skipping boilerplate parts I got IndexError randomly because of stack[i] where i = len(stack).
Sat, 20 Oct 2018 20:15:48 +0900 statprof: fix indent level of fp.write() (issue6004)
Yuya Nishihara <yuya@tcha.org> [Sat, 20 Oct 2018 20:15:48 +0900] rev 40384
statprof: fix indent level of fp.write() (issue6004) It was changed at 9d3034348c4f by mistake.
Fri, 19 Oct 2018 22:31:47 -0400 py3: stringify setupversion on Windows
Matt Harbison <matt_harbison@yahoo.com> [Fri, 19 Oct 2018 22:31:47 -0400] rev 40383
py3: stringify setupversion on Windows This was stringified a few lines above for non Windows platforms, but `version` remains bytes. The old code effectively undid the conversion, and triggered a warning in setuptools when building.
Fri, 19 Oct 2018 23:47:38 -0400 tests: add coverage for some untested areas of hgweb
Matt Harbison <matt_harbison@yahoo.com> [Fri, 19 Oct 2018 23:47:38 -0400] rev 40382
tests: add coverage for some untested areas of hgweb The fact that these mimetype guesses weren't blowing up anywhere on py3 prior to 9310037f0636 was the giveaway. The annotate function is a bit unusual in that it renders the page with a 500 in the middle, so I left the HTML output. For the other functions, checking the access log is enough.
Fri, 19 Oct 2018 23:30:56 +0300 statprof: update the name as the i increases (issue6003)
Pulkit Goyal <pulkit@yandex-team.ru> [Fri, 19 Oct 2018 23:30:56 +0300] rev 40381
statprof: update the name as the i increases (issue6003) 2864f8d3fcd6 while working on py3 fix, take out the name building out of the loop so we were not building the new stack-name for each i, rather we were using the first one again and again. The test changes shows the profile is now working. Differential Revision: https://phab.mercurial-scm.org/D5172
Fri, 19 Oct 2018 23:18:29 +0300 test: show more profile lines in test-profile.t
Pulkit Goyal <pulkit@yandex-team.ru> [Fri, 19 Oct 2018 23:18:29 +0300] rev 40380
test: show more profile lines in test-profile.t This shows that we don't output anything after the first line and demonstrate issue6003. Differential Revision: https://phab.mercurial-scm.org/D5171
Fri, 19 Oct 2018 11:45:51 -0400 keepalive: use getattr to avoid AttributeErrors when vcr is in use
Augie Fackler <augie@google.com> [Fri, 19 Oct 2018 11:45:51 -0400] rev 40379
keepalive: use getattr to avoid AttributeErrors when vcr is in use Fixes test-phabricator.t. Differential Revision: https://phab.mercurial-scm.org/D5160
Fri, 19 Oct 2018 11:45:25 -0400 phabricator: do more of the VCR work in demandimport.deactivated()
Augie Fackler <augie@google.com> [Fri, 19 Oct 2018 11:45:25 -0400] rev 40378
phabricator: do more of the VCR work in demandimport.deactivated() If I don't do this, VCR gets confused looking for pycurl and other libraries. I have no idea how this ever worked. Differential Revision: https://phab.mercurial-scm.org/D5159
Fri, 19 Oct 2018 11:28:29 -0400 tests: sleep longer in test-logtoprocess.t
Augie Fackler <augie@google.com> [Fri, 19 Oct 2018 11:28:29 -0400] rev 40377
tests: sleep longer in test-logtoprocess.t We should probably write some sort of helper that can wait N seconds for all specified values to appear in a file or something, but for now this will fix the FreeBSD buildbot. Differential Revision: https://phab.mercurial-scm.org/D5157
Fri, 19 Oct 2018 11:31:18 -0400 tests: fix pyflakes warning in test-duplicateoptions.py
Augie Fackler <augie@google.com> [Fri, 19 Oct 2018 11:31:18 -0400] rev 40376
tests: fix pyflakes warning in test-duplicateoptions.py Differential Revision: https://phab.mercurial-scm.org/D5158
Fri, 19 Oct 2018 16:34:45 +0200 branchmap: avoid changelog and attribute lookups in replacecache()
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 19 Oct 2018 16:34:45 +0200] rev 40375
branchmap: avoid changelog and attribute lookups in replacecache() This should make things faster. I'm not sure which operations would benefit from it though. Maybe branchmap application on clone? Differential Revision: https://phab.mercurial-scm.org/D5162
Fri, 19 Oct 2018 16:16:17 +0200 branchmap: pass changelog into branchmap functions
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 19 Oct 2018 16:16:17 +0200] rev 40374
branchmap: pass changelog into branchmap functions As part of building the branchmap, we loop over revs and call branchmap() or _branchmap(). Previously, these functions were accessing repo.changelog. We know from past experience that repo.changelog in loops is bad for performance. This commit teaches the branchmap code to pass a changelog instance into branchmap() and _branchmap() so we don't need to pay this penalty. On my MBP, this appears to show a speedup on a clone of the mozilla-unified repo: $ hg perfbranchmap --clear-revbranch ! base ! wall 21.078160 comb 21.070000 user 20.920000 sys 0.150000 (best of 3) ! wall 20.574682 comb 20.560000 user 20.400000 sys 0.160000 (best of 3) $ hg perfbranchmap ! base ! wall 4.880413 comb 4.870000 user 4.860000 sys 0.010000 (best of 3) ! wall 4.573968 comb 4.560000 user 4.550000 sys 0.010000 (best of 3) Differential Revision: https://phab.mercurial-scm.org/D5161
Thu, 18 Oct 2018 16:36:10 -0400 fuzz: move many initialization steps into LLVMFuzzerInitialize
Augie Fackler <augie@google.com> [Thu, 18 Oct 2018 16:36:10 -0400] rev 40373
fuzz: move many initialization steps into LLVMFuzzerInitialize Doing this means that things we intentionally leak (eg type objects) no longer confuse AddressSanitizer, so now we can run the fuzzer MUCH longer. Differential Revision: https://phab.mercurial-scm.org/D5154
Thu, 17 Nov 2016 15:51:33 -0800 bundle2: fix broken compression engine assertion
Martin von Zweigbergk <martinvonz@google.com> [Thu, 17 Nov 2016 15:51:33 -0800] rev 40372
bundle2: fix broken compression engine assertion bundletype() is a function, so it needs to be called, and it is documented to return a 2-tuple. This code is untested, so that's why we haven't noticed the bad assertion. Differential Revision: https://phab.mercurial-scm.org/D5155
Thu, 18 Oct 2018 17:54:07 -0400 tests: glob over a difference between Windows 7 and Window 10
Matt Harbison <matt_harbison@yahoo.com> [Thu, 18 Oct 2018 17:54:07 -0400] rev 40371
tests: glob over a difference between Windows 7 and Window 10 The error value is 11001 on Windows 10. I have no idea why it changed, but it seems unimportant.
Thu, 18 Oct 2018 18:11:16 -0400 py3: fix module imports in test-highlight.t
Matt Harbison <matt_harbison@yahoo.com> [Thu, 18 Oct 2018 18:11:16 -0400] rev 40370
py3: fix module imports in test-highlight.t The hash changes are because the *.py file is committed to the repo.
Wed, 17 Oct 2018 23:33:43 -0400 py3: fix module imports in tests, as flagged by test-check-module-imports.t
Matt Harbison <matt_harbison@yahoo.com> [Wed, 17 Oct 2018 23:33:43 -0400] rev 40369
py3: fix module imports in tests, as flagged by test-check-module-imports.t I have no idea why these aren't flagged with python2. I excluded test-highlight.t for now to make this easier to review- the changed code is committed to a repo, which has cascading changes on the rest of the test. There's a mix of bytes and str in the imports dict of contrib/import-checker.py that crashed it half way through listing out these errors. I couldn't figure out how to fix that properly, so I was lazy and applied this on py3, to find the rest of the errors: diff --git a/contrib/import-checker.py b/contrib/import-checker.py --- a/contrib/import-checker.py +++ b/contrib/import-checker.py @@ -626,7 +626,12 @@ def find_cycles(imports): top.foo -> top.qux -> top.foo """ cycles = set() - for mod in sorted(imports.keys()): + def sort(v): + if isinstance(v, bytes): + return v.decode('ascii') + return v + + for mod in sorted(imports.keys(), key=sort): try: checkmod(mod, imports) except CircularImport as e:
Thu, 18 Oct 2018 21:55:47 -0400 lfs: don't add extension to hgrc after conversion (BC)
Matt Harbison <matt_harbison@yahoo.com> [Thu, 18 Oct 2018 21:55:47 -0400] rev 40368
lfs: don't add extension to hgrc after conversion (BC) This is in the spirit of bcf72d7b1524.
Thu, 18 Oct 2018 21:00:07 +0900 addremove: add "ui." prefix to message color keys
Yuya Nishihara <yuya@tcha.org> [Thu, 18 Oct 2018 21:00:07 +0900] rev 40367
addremove: add "ui." prefix to message color keys I don't like fully-colorized status/warning messages, and I want to disable them at all. If we'd supported a syntax like 'color.ui.*=none', I could easily turn addremove.added/removed off as well as ui.error. This patch is just for that. Since addremove colors aren't released yet, which were added at ddc1da134772, there are no compatibility concerns.
Thu, 09 Feb 2017 09:17:40 -0800 update: clarify update() call sites by specifying argument names
Martin von Zweigbergk <martinvonz@google.com> [Thu, 09 Feb 2017 09:17:40 -0800] rev 40366
update: clarify update() call sites by specifying argument names merge.update() takes a lot of parameters and I get confused all the time which is which. Differential Revision: https://phab.mercurial-scm.org/D5153
Thu, 18 Oct 2018 10:11:08 -0700 debugcommands: avoid stack trace from debugindexstats in pure mode
Martin von Zweigbergk <martinvonz@google.com> [Thu, 18 Oct 2018 10:11:08 -0700] rev 40365
debugcommands: avoid stack trace from debugindexstats in pure mode This has been broken since I added it in d71e0ba34d9b (debugcommands: add a debugindexstats command, 2018-08-08). This patch also fixes the test. Differential Revision: https://phab.mercurial-scm.org/D5152
Thu, 18 Oct 2018 11:24:20 -0400 tests: fix up pure case of test-sqlitestore.t
Augie Fackler <augie@google.com> [Thu, 18 Oct 2018 11:24:20 -0400] rev 40364
tests: fix up pure case of test-sqlitestore.t This is clearly what the line should read based on the "force to zlib" section below, so I'm guessing it just got overlooked during development. Differential Revision: https://phab.mercurial-scm.org/D5151
Thu, 18 Oct 2018 11:14:04 -0400 tests: don't emit false failures when sqlite3 is missing
Augie Fackler <augie@google.com> [Thu, 18 Oct 2018 11:14:04 -0400] rev 40363
tests: don't emit false failures when sqlite3 is missing I'm honestly surprised we have buildbot coverage for this, but we do! Differential Revision: https://phab.mercurial-scm.org/D5150
Tue, 16 Oct 2018 08:48:23 +0200 py3: get around IOError variants in test-commandserver.t
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Oct 2018 08:48:23 +0200] rev 40362
py3: get around IOError variants in test-commandserver.t
Tue, 16 Oct 2018 08:41:58 +0200 py3: don't use traceback.print_exc() in commandserver.py
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Oct 2018 08:41:58 +0200] rev 40361
py3: don't use traceback.print_exc() in commandserver.py It doesn't support a bytes stream on Python 3. This makes a traceback being sent by one frame, but that shouldn't matter.
Tue, 16 Oct 2018 08:29:24 +0200 py3: invalidate repository cache with system-string keys
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Oct 2018 08:29:24 +0200] rev 40360
py3: invalidate repository cache with system-string keys # skip-blame just a few r'' prefixes
Tue, 16 Oct 2018 08:20:03 +0200 py3: system-stringify file mode in commandserver.py
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Oct 2018 08:20:03 +0200] rev 40359
py3: system-stringify file mode in commandserver.py # skip-blame just r'' prefixes
Tue, 16 Oct 2018 07:57:40 +0200 py3: alias next to __next__ in commandserver.py
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Oct 2018 07:57:40 +0200] rev 40358
py3: alias next to __next__ in commandserver.py
Tue, 16 Oct 2018 07:57:05 +0200 py3: system-stringify list of attributes to be forwarded from commandserver.py
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Oct 2018 07:57:05 +0200] rev 40357
py3: system-stringify list of attributes to be forwarded from commandserver.py # skip-blame just some r'' prefixes
Tue, 16 Oct 2018 07:52:56 +0200 py3: import StringIO from test utility to test-commandserver.t
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Oct 2018 07:52:56 +0200] rev 40356
py3: import StringIO from test utility to test-commandserver.t
Tue, 16 Oct 2018 07:38:31 +0200 py3: use bprint() helper in test-commandserver.t
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Oct 2018 07:38:31 +0200] rev 40355
py3: use bprint() helper in test-commandserver.t
Tue, 16 Oct 2018 07:35:29 +0200 py3: byte-stringify most literals in test-commandserver.t
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Oct 2018 07:35:29 +0200] rev 40354
py3: byte-stringify most literals in test-commandserver.t print() calls will be replaced by bprint(). # skip-blame just tons of b'' prefixes.
Sun, 14 Oct 2018 09:50:21 -0400 localrepo: ensure we properly %-format int in exception throw
Augie Fackler <augie@google.com> [Sun, 14 Oct 2018 09:50:21 -0400] rev 40353
localrepo: ensure we properly %-format int in exception throw I'm not thrilled with this, but it'll do. Differential Revision: https://phab.mercurial-scm.org/D5107
Thu, 18 Oct 2018 14:41:14 +0300 py3: add a r'' prefix in mercurial/exchange.py
Pulkit Goyal <pulkit@yandex-team.ru> [Thu, 18 Oct 2018 14:41:14 +0300] rev 40352
py3: add a r'' prefix in mercurial/exchange.py # skip-blame because just r'' prefix This fixes test-narrow-acl.t on py3 which was broken by one of the earlier patches. Differential Revision: https://phab.mercurial-scm.org/D5149
Thu, 18 Oct 2018 14:37:38 +0300 py3: add 5 new passing tests to whitelist caught by buildbot
Pulkit Goyal <pulkit@yandex-team.ru> [Thu, 18 Oct 2018 14:37:38 +0300] rev 40351
py3: add 5 new passing tests to whitelist caught by buildbot Thanks to everyone who is putting efforts in making hg py3 compatible. Differential Revision: https://phab.mercurial-scm.org/D5148
Wed, 17 Oct 2018 21:54:49 -0400 py3: fix test-import-context.t
Matt Harbison <matt_harbison@yahoo.com> [Wed, 17 Oct 2018 21:54:49 -0400] rev 40350
py3: fix test-import-context.t
Mon, 15 Oct 2018 22:02:10 -0400 py3: restore perfstartup() prior to b456b2e0ad9f on Windows
Matt Harbison <matt_harbison@yahoo.com> [Mon, 15 Oct 2018 22:02:10 -0400] rev 40349
py3: restore perfstartup() prior to b456b2e0ad9f on Windows Otherwise the test errors out with: --- c:/Users/Matt/projects/hg_py3/tests/test-contrib-perf.t +++ c:/Users/Matt/projects/hg_py3/tests/test-contrib-perf.t.err @@ -184,6 +184,8 @@ $ hg perfrevrange $ hg perfrevset 'all()' $ hg perfstartup + 'b'c:' is not recognized as an internal or external command, + operable program or batch file. $ hg perfstatus $ hg perftags $ hg perftemplating
Wed, 17 Oct 2018 21:05:43 -0400 help: document the server capabilities added by the LFS extension
Matt Harbison <matt_harbison@yahoo.com> [Wed, 17 Oct 2018 21:05:43 -0400] rev 40348
help: document the server capabilities added by the LFS extension I didn't bother marking these experimental because it references the extension that is already marked experimental.
Thu, 27 Sep 2018 21:54:13 -0400 py3: fix test-propertycache.py on Windows
Matt Harbison <matt_harbison@yahoo.com> [Thu, 27 Sep 2018 21:54:13 -0400] rev 40347
py3: fix test-propertycache.py on Windows
Wed, 17 Oct 2018 21:00:36 +0800 commands: adjust metavariables as appropriate
Anton Shestakov <av6@dwimlabs.net> [Wed, 17 Oct 2018 21:00:36 +0800] rev 40346
commands: adjust metavariables as appropriate Apart from looking better in hg help command, these strings are also helpful when generating shell completions programmatically.
Sun, 14 Oct 2018 11:16:22 -0400 match: fix up a repr to not crash on Python 3
Augie Fackler <augie@google.com> [Sun, 14 Oct 2018 11:16:22 -0400] rev 40345
match: fix up a repr to not crash on Python 3 Differential Revision: https://phab.mercurial-scm.org/D5120
Fri, 05 Oct 2018 11:07:34 -0700 narrow: when widening, don't include manifests the client already has
Martin von Zweigbergk <martinvonz@google.com> [Fri, 05 Oct 2018 11:07:34 -0700] rev 40344
narrow: when widening, don't include manifests the client already has When widening, we already don't include the changelog (since f1844a10ee19) and files that the client already has (since c73c7653dfb9). However, we still include all manifests needed for the new narrowspec. When using flat manifests, that means we resend all the manifests even though the client necessarily has all of them. For tree manifests, we unnecessarily resend the root manifests and any subdirectory manifests that the client already has. This patch makes it so we no longer resend manifests that the client already has. It does so by passing an extra matcher to the changegroup packer and it uses that for filtering out directories matching the old matcher's visitdir(). For consistency between directories and files, it also makes the filtering of files look at both old and new matcher rather than passing in a diff matcher as we did before. Differential Revision: https://phab.mercurial-scm.org/D4895
Wed, 17 Oct 2018 09:30:07 -0700 tests: add test for widening from an empty clone
Martin von Zweigbergk <martinvonz@google.com> [Wed, 17 Oct 2018 09:30:07 -0700] rev 40343
tests: add test for widening from an empty clone Narrow clones that track no paths currently don't even include the root manifest (which is the only manifest when using flat manifests). That means that when we widen from such a clone, we need to make sure that we send the root manifest (and other manifests if using tree manifests). That currently works because we always resend all manifest that match the new narrowspec. However, we're about to stop resending manifests that the client already has and there's a risk of this breaking then, so let's add a test. Differential Revision: https://phab.mercurial-scm.org/D5143
Wed, 17 Oct 2018 11:43:39 -0700 subrepo: access status members by name instead of by position
Martin von Zweigbergk <martinvonz@google.com> [Wed, 17 Oct 2018 11:43:39 -0700] rev 40342
subrepo: access status members by name instead of by position Taking my first Mercurial project closer to completion. Differential Revision: https://phab.mercurial-scm.org/D5144
Tue, 16 Oct 2018 07:21:00 -0700 revisions: when using prefixhexnode, ensure we prefix "0"
Kyle Lippincott <spectral@google.com> [Tue, 16 Oct 2018 07:21:00 -0700] rev 40341
revisions: when using prefixhexnode, ensure we prefix "0" Previously, if using `experimental.revisions.disambiguatewithin` (and it didn't include rev0), and '0' was the shortest identifier in that disambiguation set, we printed it as the shortest *without* a prefix. This was because we had logic to determine "if the prefix is a pure integer, but starts with 0, we don't need to prefix with 'x': 01 is not a synonym for revision #1", but didn't handle the case where prefix == 0 (which is a pure integer, and starts with 0... but it *is* "rev0"). Differential Revision: https://phab.mercurial-scm.org/D5113
Wed, 03 Oct 2018 16:45:24 +0300 store: pass matcher to store.datafiles()
Pulkit Goyal <pulkit@yandex-team.ru> [Wed, 03 Oct 2018 16:45:24 +0300] rev 40340
store: pass matcher to store.datafiles() To get narrow stream clones working, we need a way to filter the storage files using a matcher. This patch adds matcher as an argument to store.walk() and store.datafiles() so that we can filter the files returned according to the matcher. Differential Revision: https://phab.mercurial-scm.org/D4850
Wed, 03 Oct 2018 17:59:05 +0300 streamclone: pass narrowing related info in _walkstreamfiles()
Pulkit Goyal <pulkit@yandex-team.ru> [Wed, 03 Oct 2018 17:59:05 +0300] rev 40339
streamclone: pass narrowing related info in _walkstreamfiles() This patch build a matcher using the include and exclude arguments we have in generatev2() and pass that matcher into _walkstreamfiles(). This will help us in filtering files we stream depending on the includes and excludes passed in by the user. Differential Revision: https://phab.mercurial-scm.org/D4851
Wed, 26 Sep 2018 17:20:04 +0300 streamclone: new server config and some API changes for narrow stream clones
Pulkit Goyal <pulkit@yandex-team.ru> [Wed, 26 Sep 2018 17:20:04 +0300] rev 40338
streamclone: new server config and some API changes for narrow stream clones This patch introduces a new server config `experimental.server.stream-narrow-clones` which if set to True will advertise that the server supports narrow stream clones. This patch also pass on the includes and excludes from getbundle command to streamclone generation code. There is a test added to show that the includepats and excludepats are correctly passed. Upcoming patches will implement storage layer filtering for streamclones and then we can remove the temporary error and plug in the whole logic together to make narrow stream clones working. Differential Revision: https://phab.mercurial-scm.org/D5137
Wed, 10 Oct 2018 17:36:59 +0300 narrow: only send the narrowspecs back if ACL in play
Pulkit Goyal <pulkit@yandex-team.ru> [Wed, 10 Oct 2018 17:36:59 +0300] rev 40337
narrow: only send the narrowspecs back if ACL in play I am unable to think why we need to send narrowspecs back from the server. The current state adds a 'narrow:spec' part to each changegroup which is generated when narrow extension is enabled. So we are sending narrowspecs on pull also. There is a problem with sending the narrowspecs the way we are doing it right now. We add include and exclude as parameter of the 'narrow:spec' bundle2 part. The the len of include or exclude string increase 255 which is obvious while working on large repos, bundle2 generation code breaks. For more on that refer issue5952 on bugzilla. I was thinking why we need to send the narrowspecs back, and deleted the 'narrow:spec' bundle2 part generation code and found that only narrow-acl test has some failure. With this patch, we will only send the 'narrow:spec' bundle2 part if ACL is enabled because the original narrowspecs in those cases can be a subset of narrowspecs user requested. There are phase related output change in couple of tests. The output change shows that we are now dealing in public phases completely. So maybe sending the narrow:spec bundle2 part was preventing phases being exchanged or phase bundle2 data being applied. Differential Revision: https://phab.mercurial-scm.org/D4931
Wed, 17 Oct 2018 22:32:50 +0800 zsh_completion: add -l/--list flag for hg bookmarks completion
Anton Shestakov <av6@dwimlabs.net> [Wed, 17 Oct 2018 22:32:50 +0800] rev 40336
zsh_completion: add -l/--list flag for hg bookmarks completion Flags in parentheses are mutually exclusive. Logic is taken from commands.py: selactions = [k for k in ['delete', 'rename', 'list'] if opts.get(k)] if len(selactions) > 1: raise error.Abort(_('--%s and --%s are incompatible') % tuple(selactions[:2])) ... if rev and action in {'delete', 'rename', 'list'}: raise error.Abort(_("--rev is incompatible with --%s") % action) if inactive and action in {'delete', 'list'}: raise error.Abort(_("--inactive is incompatible with --%s") % action) Differential Revision: https://phab.mercurial-scm.org/D5142
Wed, 17 Oct 2018 22:31:34 +0800 zsh_completion: fix a couple of flags still not being perfect
Anton Shestakov <av6@dwimlabs.net> [Wed, 17 Oct 2018 22:31:34 +0800] rev 40335
zsh_completion: fix a couple of flags still not being perfect Differential Revision: https://phab.mercurial-scm.org/D5141
Wed, 17 Oct 2018 22:27:10 +0800 zsh_completion: use $_hg_remote_opts after it is defined
Anton Shestakov <av6@dwimlabs.net> [Wed, 17 Oct 2018 22:27:10 +0800] rev 40334
zsh_completion: use $_hg_remote_opts after it is defined Before this patch, zsh wouldn't complete --ssh, --remotecmd or --insecure for hg clone. While at it, replace --uncompressed by --stream. Differential Revision: https://phab.mercurial-scm.org/D5140
Wed, 17 Oct 2018 11:56:03 -0700 tests: fix "running x tests using y ... " output in a few more places
Martin von Zweigbergk <martinvonz@google.com> [Wed, 17 Oct 2018 11:56:03 -0700] rev 40333
tests: fix "running x tests using y ... " output in a few more places These seem to have been missed by 1039404c5e1d (run-tests: print number of tests and parallel process count, 2018-10-13). Differential Revision: https://phab.mercurial-scm.org/D5145
Sun, 14 Oct 2018 09:34:21 +0000 py3: fix test-hardlinks.t
Mark Thomas <mbthomas@fb.com> [Sun, 14 Oct 2018 09:34:21 +0000] rev 40332
py3: fix test-hardlinks.t Differential Revision: https://phab.mercurial-scm.org/D5096
Fri, 14 Sep 2018 14:56:13 -0700 exchange: support declaring pull depth
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 14 Sep 2018 14:56:13 -0700] rev 40331
exchange: support declaring pull depth Upcoming commits will teach exchangev2 how to perform a shallow clone. This commit teaches hg.clone(), exchange.pull(), and exchange.pulloperation to recognize a request for a shallow clone by having the caller specify a numeric depth of the maximum number of ancestor changesets to fetch. There are certainly other ways we could control shallow-ness. But this one is simple to implement and is also how the narrow extension controls things. So it seems to make sense to start here. Differential Revision: https://phab.mercurial-scm.org/D5136
Wed, 17 Oct 2018 10:10:05 +0200 exchangev2: support for calling rawstorefiledata to retrieve raw files
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 17 Oct 2018 10:10:05 +0200] rev 40330
exchangev2: support for calling rawstorefiledata to retrieve raw files This is somewhat hacky. For that I apologize. At the 4.8 Sprint, we decided we wanted to land support in wireprotov2 for doing a partial clone with changelog and manifestlog bootstrapped from a "stream clone" like primitive. This commit implements the client-side bits necessary to facilitate that. If the new server-side command for obtaining raw files data is available, we call it to get the raw files for the changelog and manifestlog. Then we fall through to an incremental pull. But when fetching files data, instead of using the list of a changesets and manifests that we fetched via the "changesetdata" command, we do a linear scan of the repo and resolve the changeset and manifest nodes along with the manifest linkrevs. Differential Revision: https://phab.mercurial-scm.org/D5135
Tue, 16 Oct 2018 21:31:21 +0200 wireprotov2: implement command for retrieving raw store files
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 16 Oct 2018 21:31:21 +0200] rev 40329
wireprotov2: implement command for retrieving raw store files Implementing shallow clone of the changelog is hard. We want the 4.8 release to have a fast implementation of partial clone in wireprotov2. In order to achieve fast, we can't use deltas for transferring changelog and manifestlog data. Per discussions at the 4.8 sprint, this commit implements a somwwhat hacky and likely-to-be-changed-drastically-or-dropped command in wireprotov2 that facilitates access to raw store files, namely the changelog and manifestlog. Using this command, clients can perform a "stream clone" of sorts for just the changelog and manifestlog. This will allow clients to fetch the changelog and manifest revlogs, stream them to disk (which should be fast), then follow up filesdata requests for files revision data for a particular changeset. Differential Revision: https://phab.mercurial-scm.org/D5134
Tue, 16 Oct 2018 21:35:33 +0200 wireprotov2: add response type that serializes to indefinite length bytestring
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 16 Oct 2018 21:35:33 +0200] rev 40328
wireprotov2: add response type that serializes to indefinite length bytestring This will be needed in a future patch. Differential Revision: https://phab.mercurial-scm.org/D5133
Wed, 26 Sep 2018 14:38:43 -0700 exchangev2: recognize narrow patterns when pulling
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 26 Sep 2018 14:38:43 -0700] rev 40327
exchangev2: recognize narrow patterns when pulling pulloperation instances were recently taught to record file include and exclude patterns to facilitate narrow file transfer. Teaching the exchangev2 code to transfer a subset of files is as simple as constructing a narrow matcher from these patterns and filtering all seen file paths through it. Keep in mind that this change only influences file data: we're still fetching all changeset and manifest data. So, there's still a ton of "partial clone" to implement in exchangev2. On a personal note, I derive gratification that this feature requires very few lines of new code to implement. To test this, we implemented a minimal extension which allows us to specify --include/--exclude to clone. While the narrow extension provides these arguments, I explicitly wanted to test this functionality without the narrow extension enabled, as that extension monkeypatches various things and I want to isolate the behavior of core Mercurial. Differential Revision: https://phab.mercurial-scm.org/D5132
Tue, 09 Oct 2018 08:50:13 -0700 sqlitestore: file storage backend using SQLite
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 09 Oct 2018 08:50:13 -0700] rev 40326
sqlitestore: file storage backend using SQLite This commit provides an extension which uses SQLite to store file data (as opposed to revlogs). As the inline documentation describes, there are still several aspects to the extension that are incomplete. But it's a start. The extension does support basic clone, checkout, and commit workflows, which makes it suitable for simple use cases. One notable missing feature is support for "bundlerepos." This is probably responsible for the most test failures when the extension is activated as part of the test suite. All revision data is stored in SQLite. Data is stored as zstd compressed chunks (default if zstd is available), zlib compressed chunks (default if zstd is not available), or raw chunks (if configured or if a compressed delta is not smaller than the raw delta). This makes things very similar to revlogs. Unlike revlogs, the extension doesn't yet enforce a limit on delta chain length. This is an obvious limitation and should be addressed. This is somewhat mitigated by the use of zstd, which is much faster than zlib to decompress. There is a dedicated table for storing deltas. Deltas are stored by the SHA-1 hash of their uncompressed content. The "fileindex" table has columns that reference the delta for each revision and the base delta that delta should be applied against. A recursive SQL query is used to resolve the delta chain along with the delta data. By storing deltas by hash, we are able to de-duplicate delta storage! With revlogs, the same deltas in different revlogs would result in duplicate storage of that delta. In this scheme, inserting the duplicate delta is a no-op and delta chains simply reference the existing delta. When initially implementing this extension, I did not have content-indexed deltas and deltas could be duplicated across files (just like revlogs). When I implemented content-indexed deltas, the size of the SQLite database for a full clone of mozilla-unified dropped: before: 2,554,261,504 bytes after: 2,488,754,176 bytes Surprisingly, this is still larger than the bytes size of revlog files: revlog files: 2,104,861,230 bytes du -b: 2,254,381,614 I would have expected storage to be smaller since we're not limiting delta chain length and since we're using zstd instead of zlib. I suspect the SQLite indexes and per-column overhead account for the bulk of the differences. (Keep in mind that revlog uses a 64-byte packed struct for revision index data and deltas are stored without padding. Aside from the 12 unused bytes in the 32 byte node field, revlogs are pretty efficient.) Another source of overhead is file name storage. With revlogs, file names are stored in the filesystem. But with SQLite, we need to store file names in the database. This is roughly equivalent to the size of the fncache file, which for the mozilla-unified repository is ~34MB. Since the SQLite database isn't append-only and since delta chains can reference any delta, this opens some interesting possibilities. For example, we could store deltas in reverse, such that fulltexts are stored for newer revisions and deltas are applied to reconstruct older revisions. This is likely a more optimal storage strategy for version control, as new data tends to be more frequently accessed than old data. We would obviously need wire protocol support for transferring revision data from newest to oldest. And we would probably need some kind of mechanism for "re-encoding" stores. But it should be doable. This extension is very much experimental quality. There are a handful of features that don't work. It probably isn't suitable for day-to-day use. But it could be used in limited cases (e.g. read-only checkouts like in CI). And it is also a good proving ground for alternate storage backends. As we continue to define interfaces for all things storage, it will be useful to have a viable alternate storage backend to see how things shake out in practice. test-storage.py passes on Python 2 and introduces no new test failures on Python 3. Having the storage-level unit tests has proved to be insanely useful when developing this extension. Those tests caught numerous bugs during development and I'm convinced this style of testing is the way forward for ensuring alternate storage backends work as intended. Of course, test coverage isn't close to what it needs to be. But it is a start. And what coverage we have gives me confidence that basic store functionality is implemented properly. Differential Revision: https://phab.mercurial-scm.org/D4928
Tue, 16 Oct 2018 15:36:19 +0200 storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 16 Oct 2018 15:36:19 +0200] rev 40325
storageutil: extract most of peek_censored from revlog This function is super hacky and isn't correct 100% of the time. I'm going to need this functionality on a future non-revlog store. Let's copy things to storageutil so this code only exists once. Differential Revision: https://phab.mercurial-scm.org/D5118
Thu, 20 Sep 2018 17:27:01 -0700 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com> [Thu, 20 Sep 2018 17:27:01 -0700] rev 40324
lfs: autoload the extension when cloning from repo with lfs enabled This is based on a patch by Gregory Szorc. I made small adjustments to clean up the messaging when the server has the extension enabled, but the client has it disabled (to prevent autoloading). Additionally, I added a second server capability to distinguish between the server having the extension enabled, and the server having LFS commits. This helps prevent unnecessary requirement propagation- the client shouldn't add a requirement that the server doesn't have, just because the server had the extension loaded. The TODO I had about advertising a capability when the server can natively serve up blobs isn't relevant anymore (we've had 2 releases that support this), so I dropped it. Currently, we lazily add the "lfs" requirement to a repo when we first encounter LFS data. Due to a pretxnchangegroup hook that looks for LFS data, this can happen at the end of clone. Now that we have more control over how repositories are created, we can do better. This commit adds a repo creation option to add the "lfs" requirement. hg.clone() sets this creation option if the remote peer is advertising lfs usage (as opposed to just support needed to push). So, what this change effectively does is have cloned repos automatically inherit the "lfs" requirement. Differential Revision: https://phab.mercurial-scm.org/D5130
Tue, 16 Oct 2018 16:24:46 +0200 testing: switch to inserting deltas
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 16 Oct 2018 16:24:46 +0200] rev 40323
testing: switch to inserting deltas As the comment in the test specifies, this was relying on storage backend implementation details. We switch to inserting a raw delta, skipping the regular insert path to ensure we have the desired outcome. This required implementing support for handling deltas in the revlog testing code. Differential Revision: https://phab.mercurial-scm.org/D5116
Tue, 16 Oct 2018 15:24:06 +0200 testing: remove expectation of error on bad node insert
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 16 Oct 2018 15:24:06 +0200] rev 40322
testing: remove expectation of error on bad node insert addgroup() doesn't necessarily validate the hashes of each incoming revision. This is an optimization that allows delta group application to complete faster. The fact that revlog raises in this particular test is an implementation detail due to the way revlogs are testing multiple deltas. Differential Revision: https://phab.mercurial-scm.org/D5115
Tue, 16 Oct 2018 17:45:39 +0200 storageutil: convert fileid to bytes to avoid cast to %s
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 16 Oct 2018 17:45:39 +0200] rev 40321
storageutil: convert fileid to bytes to avoid cast to %s test-storage.py manages to trigger this on Python 3. Differential Revision: https://phab.mercurial-scm.org/D5117
(0) -30000 -10000 -3000 -1000 -120 +120 +1000 +3000 +10000 tip