Sat, 14 Apr 2018 09:23:48 -0700 registrar: replace "cmdtype" with an intent-based mechanism (API)
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 14 Apr 2018 09:23:48 -0700] rev 37716
registrar: replace "cmdtype" with an intent-based mechanism (API) Commands perform varied actions and repositories vary in their capabilities. Historically, the .hg/requires file has been used to lock out clients lacking a requirement. But this is a very heavy-handed approach and is typically reserved for cases where the on-disk storage format changes and we want to prevent incompatible clients from operating on a repo. Outside of the .hg/requires file, we tend to deal with things like optional, extension-provided features via checking at call sites. We'll either have checks in core or extensions will monkeypatch functions in core disabling incompatible features, enabling new features, etc. Things are somewhat tolerable today. But once we introduce alternate storage backends with varying support for repository features and vastly different modes of behavior, the current model will quickly grow unwieldy. For example, the implementation of the "simple store" required a lot of hacks to deal with stripping and verify because various parts of core assume things are implemented a certain way. Partial clone will require new ways of modeling file data retrieval, because we can no longer assume that all file data is already local. In this new world, some commands might not make any sense for certain types of repositories. What we need is a mechanism to affect the construction of repository (and eventually peer) instances so the requirements/capabilities needed for the current operation can be taken into account. "Current operation" can almost certainly be defined by a command. So it makes sense for commands to declare their intended actions. This commit introduces the "intents" concept on the command registrar. "intents" captures a set of strings that declare actions that are anticipated to be taken, requirements the repository must possess, etc. These intents will be passed into hg.repo(), which will pass them into localrepository, where they can be used to influence the object being created. Some use cases for this include: * For read-only intents, constructing a repository object that doesn't expose methods that can mutate the repository. Its VFS instances don't even allow opening a file with write access. * For read-only intents, constructing a repository object without cache invalidation logic. If the repo never changes during its lifetime, nothing ever needs to be invalidated and we don't need to do expensive things like verify the changelog's hidden revisions state is accurate every time we access repo.changelog. * We can automatically hide commands from `hg help` when the current repository doesn't provide that command. For example, an alternate storage backend may not support `hg commit`, so we can hide that command or anything else that would perform local commits. We already kind of had an "intents" mechanism on the registrar in the form of "cmdtype." However, it was never used. And it was limited to a single value. We really need something that supports multiple intents. And because intents may be defined by extensions and at this point are advisory, I think it is best to define them in a set rather than as separate arguments/attributes on the command. Differential Revision: https://phab.mercurial-scm.org/D3376
Sat, 14 Apr 2018 11:20:38 -0400 cleanup: polyfill assertRaisesRegex so we can avoid assertRaisesRegexp
Augie Fackler <augie@google.com> [Sat, 14 Apr 2018 11:20:38 -0400] rev 37715
cleanup: polyfill assertRaisesRegex so we can avoid assertRaisesRegexp The latter is deprecated on Python 3.7 and causes our tests to fail due to the warning. Differential Revision: https://phab.mercurial-scm.org/D3375
Sat, 14 Apr 2018 11:07:24 -0400 tests: add b prefixes to test-hg-parseurl.py
Augie Fackler <augie@google.com> [Sat, 14 Apr 2018 11:07:24 -0400] rev 37714
tests: add b prefixes to test-hg-parseurl.py Now passes on Python 3. Differential Revision: https://phab.mercurial-scm.org/D3374
Sat, 14 Apr 2018 11:04:58 -0400 tests: port test-hg-parseurl.py to unittest
Augie Fackler <augie@google.com> [Sat, 14 Apr 2018 11:04:58 -0400] rev 37713
tests: port test-hg-parseurl.py to unittest Differential Revision: https://phab.mercurial-scm.org/D3373
Sat, 14 Apr 2018 01:12:55 -0400 hgwebdir: un-bytes the env dict before re-parsing env
Augie Fackler <augie@google.com> [Sat, 14 Apr 2018 01:12:55 -0400] rev 37712
hgwebdir: un-bytes the env dict before re-parsing env Not the most elegant, but it restores test-subrepo-deep-nested-change.t to passing on Python 3. Differential Revision: https://phab.mercurial-scm.org/D3367
Sat, 14 Apr 2018 16:36:15 -0700 cborutil: implement support for streaming encoding, bytestring decoding
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 14 Apr 2018 16:36:15 -0700] rev 37711
cborutil: implement support for streaming encoding, bytestring decoding The vendored cbor2 package is... a bit disappointing. On the encoding side, it insists that you pass it something with a write() to send data to. That means if you want to emit data to a generator, you have to construct an e.g. io.BytesIO(), write() to it, then get the data back out. There can be non-trivial overhead involved. The encoder also doesn't support indefinite types - bytestrings, arrays, and maps that don't have a known length. Again, this is really unfortunate because it requires you to buffer the entire source and destination in memory to encode large things. On the decoding side, it supports reading indefinite length types. But it buffers them completely before returning. More sadness. This commit implements "streaming" encoders for various CBOR types. Encoding emits a generator of hunks. So you can efficiently stream encoded data elsewhere. It also implements support for emitting indefinite length bytestrings, arrays, and maps. On the decoding side, we only implement support for decoding an indefinite length bytestring from a file object. It will emit a generator of raw chunks from the source. I didn't want to reinvent so many wheels. But profiling the wire protocol revealed that the overhead of constructing io.BytesIO() instances to temporarily hold results has a non-trivial overhead. We're talking >15% of execution time for operations like "transfer the fulltexts of all files in a revision." So I can justify this effort. Fortunately, CBOR is a relatively straightforward format. And we have a reference implementation in the repo we can test against. Differential Revision: https://phab.mercurial-scm.org/D3303
Sun, 15 Apr 2018 22:28:03 -0400 configitems: register server.zstdlevel
Matt Harbison <matt_harbison@yahoo.com> [Sun, 15 Apr 2018 22:28:03 -0400] rev 37710
configitems: register server.zstdlevel Somehow, I managed to trigger a devel-warn running `hg serve` outside the test suite on one of the repos generated by running test-lfs-serve-access.t --keep. (I'm not hitting it now after doing a `make local`.) The only reference to this in all of the history is the help text added in e75463e3179f, and the translations. (It looks like the string is built dynamically with '%slevel', which is probably how this was missed. I wonder if this isn't getting routed to error.log for some reason.) In any event, server.zliblevel is registered, and that's required to pick up the documented default.
Sat, 14 Apr 2018 00:13:08 -0700 scmutil: make shortesthexnodeidprefix() take a full binary nodeid
Martin von Zweigbergk <martinvonz@google.com> [Sat, 14 Apr 2018 00:13:08 -0700] rev 37709
scmutil: make shortesthexnodeidprefix() take a full binary nodeid The shortest() template function depended on the behavior of revlog._partialmatch() for these types of inputs: * non-hex strings * ambiguous strings * too long strings revlog._partialmatch() seems to return the input unchanged in these cases, but we shouldn't depend on such a low-level function to match the behavior we want in the user-facing template function. Instead, let's handle these cases in the template function and always pass a binary nodeid to _partialmatch(). Differential Revision: https://phab.mercurial-scm.org/D3371
Fri, 13 Apr 2018 10:36:03 -0700 scmutil: make shortesthexnodeidprefix() use unfiltered repo
Martin von Zweigbergk <martinvonz@google.com> [Fri, 13 Apr 2018 10:36:03 -0700] rev 37708
scmutil: make shortesthexnodeidprefix() use unfiltered repo Both callers were doing this, and resolvehexnodeidprefix() was also working on the unfiltered repo, so it makes more sense to have it all in one place. Differential Revision: https://phab.mercurial-scm.org/D3313
Sun, 15 Apr 2018 19:41:34 +0800 templates: adjust white space amount in the output of {whyunstable}
Anton Shestakov <av6@dwimlabs.net> [Sun, 15 Apr 2018 19:41:34 +0800] rev 37707
templates: adjust white space amount in the output of {whyunstable} There used to be 2 spaces between divergent nodes (when not using custom template for divergentnodes) because divergentnodes is a hybrid list, which means it gets ' '.join()ed, but formatnode() already had a space. Now it doesn't, which requires extra effort in writing custom templates for whyunstable, but at least it looks correctly by default. Test output needs to be sorted for stability.
Sun, 15 Apr 2018 19:28:01 +0800 tests: split long templates that use {whyunstable} and put them in hgrc
Anton Shestakov <av6@dwimlabs.net> [Sun, 15 Apr 2018 19:28:01 +0800] rev 37706
tests: split long templates that use {whyunstable} and put them in hgrc
Sun, 15 Apr 2018 18:37:22 +0800 tests: make custom templates that use {whyunstable} terser
Anton Shestakov <av6@dwimlabs.net> [Sun, 15 Apr 2018 18:37:22 +0800] rev 37705
tests: make custom templates that use {whyunstable} terser These templates demonstrate that {whyunstable} is fully template-friendly, but they don't need to produce such long lines of output.
Sun, 15 Apr 2018 18:27:49 +0800 tests: hg log shouldn't need --hidden to show whyunstable template keyword
Anton Shestakov <av6@dwimlabs.net> [Sun, 15 Apr 2018 18:27:49 +0800] rev 37704
tests: hg log shouldn't need --hidden to show whyunstable template keyword
Sat, 14 Apr 2018 15:39:57 +0200 makefile: add Ubuntu Bionic docker targets (.deb and ppa)
Antonio Muci <a.mux@inwind.it> [Sat, 14 Apr 2018 15:39:57 +0200] rev 37703
makefile: add Ubuntu Bionic docker targets (.deb and ppa) Bionic Beaver is an LTS release, supported until 2023-04.
Sat, 14 Apr 2018 18:23:57 +0200 makefile: reformat .PHONY targets
Antonio Muci <a.mux@inwind.it> [Sat, 14 Apr 2018 18:23:57 +0200] rev 37702
makefile: reformat .PHONY targets The list of make targets is likely to evolve over time. This reformats streamlines future patches.
Sat, 14 Apr 2018 15:57:55 +0200 makefile: mkdir is not needed on templatized docker builds
Antonio Muci <a.mux@inwind.it> [Sat, 14 Apr 2018 15:57:55 +0200] rev 37701
makefile: mkdir is not needed on templatized docker builds This imitates e63dfbbdbd07 and is a small addition to 231690dba9b4 and 5c1283713293
Sun, 01 Apr 2018 23:50:34 +0900 hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org> [Sun, 01 Apr 2018 23:50:34 +0900] rev 37700
hgweb: convert _siblings to a factory function of mappinggenerator IIUC, only reason it was a class is to make the generator restartable, which is now served by the mappinggenerator.
Sun, 01 Apr 2018 23:47:43 +0900 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org> [Sun, 01 Apr 2018 23:47:43 +0900] rev 37699
hgweb: extract a generator function of _siblings class _siblings will be converted to a plain function.
Sun, 01 Apr 2018 23:40:08 +0900 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org> [Sun, 01 Apr 2018 23:40:08 +0900] rev 37698
hgweb: wrap {changenav} and {nav} with mappinglist
Sun, 01 Apr 2018 23:34:29 +0900 hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org> [Sun, 01 Apr 2018 23:34:29 +0900] rev 37697
hgweb: make revnav.gen() simply build a list of mappings by one pass There was actually no lazy stuff.
Sun, 01 Apr 2018 23:12:37 +0900 hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org> [Sun, 01 Apr 2018 23:12:37 +0900] rev 37696
hgweb: lift {sessionvars} to a wrapped type Since a sessionvars object is updated in-place, we can't simply wrap it by mappinglist.
Sun, 01 Apr 2018 23:03:58 +0900 hgweb: make sessionvars class less dense
Yuya Nishihara <yuya@tcha.org> [Sun, 01 Apr 2018 23:03:58 +0900] rev 37695
hgweb: make sessionvars class less dense
Sun, 01 Apr 2018 23:03:02 +0900 hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org> [Sun, 01 Apr 2018 23:03:02 +0900] rev 37694
hgweb: prefix private variables of sessionvars with '_'
Fri, 13 Apr 2018 16:32:33 -0400 lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com> [Fri, 13 Apr 2018 16:32:33 -0400] rev 37693
lfs: update the HTTP status codes in error cases I'm not bothering with validating PUT requests (for now), because the spec doesn't explicitly call out a Content-Type (though the example transcript does use the sensible 'application/octet-stream').
(0) -30000 -10000 -3000 -1000 -300 -100 -50 -24 +24 +50 +100 +300 +1000 +3000 +10000 tip