Thu, 01 Feb 2018 08:17:11 -0800 testrunner: on error, color the "(case xxx)" part the same as filename
Martin von Zweigbergk <martinvonz@google.com> [Thu, 01 Feb 2018 08:17:11 -0800] rev 35848
testrunner: on error, color the "(case xxx)" part the same as filename When using #testcases, the lines that read something like ERROR: test-split.t (case obsstore-off) output changed get colored red and the filename gets highlighted with a brighter red. This makes it harder to notice the "case obsstore-off" part, but it does seem important, so let's highlight it. Differential Revision: https://phab.mercurial-scm.org/D1959
Thu, 18 Jan 2018 10:08:23 -0500 python3: whitelist an additional 23 passing tests
Augie Fackler <augie@google.com> [Thu, 18 Jan 2018 10:08:23 -0500] rev 35847
python3: whitelist an additional 23 passing tests Differential Revision: https://phab.mercurial-scm.org/D1908
Thu, 18 Jan 2018 09:58:40 -0500 tests: fix a missed b prefix in a test extension in test-strip.t
Augie Fackler <augie@google.com> [Thu, 18 Jan 2018 09:58:40 -0500] rev 35846
tests: fix a missed b prefix in a test extension in test-strip.t # skip-blame just a bytes prefix Differential Revision: https://phab.mercurial-scm.org/D1907
Thu, 18 Jan 2018 09:14:30 -0500 revlog: correct type in check to verify rawtext is immutable
Augie Fackler <augie@google.com> [Thu, 18 Jan 2018 09:14:30 -0500] rev 35845
revlog: correct type in check to verify rawtext is immutable This fixes far more failures than I feel like it has any right to, so there's clearly some subtle interaction between self._cache and other parts of this code. :( Differential Revision: https://phab.mercurial-scm.org/D1906
Wed, 17 Jan 2018 22:05:37 -0500 mq: use bytes() instead of str() to encode statusentries for writing
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 22:05:37 -0500] rev 35844
mq: use bytes() instead of str() to encode statusentries for writing Differential Revision: https://phab.mercurial-scm.org/D1903
Wed, 17 Jan 2018 22:05:02 -0500 mq: open status file et al in bytes mode
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 22:05:02 -0500] rev 35843
mq: open status file et al in bytes mode Differential Revision: https://phab.mercurial-scm.org/D1902
Wed, 17 Jan 2018 22:04:34 -0500 mq: fix up statusentry to be both repr()-able and bytes()-able
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 22:04:34 -0500] rev 35842
mq: fix up statusentry to be both repr()-able and bytes()-able Differential Revision: https://phab.mercurial-scm.org/D1901
Wed, 17 Jan 2018 22:07:09 -0500 python3: whitelist another 7 passing tests
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 22:07:09 -0500] rev 35841
python3: whitelist another 7 passing tests Differential Revision: https://phab.mercurial-scm.org/D1900
Wed, 17 Jan 2018 21:48:37 -0500 localrepo: pass transaction kwargs as strings, not bytes
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 21:48:37 -0500] rev 35840
localrepo: pass transaction kwargs as strings, not bytes Differential Revision: https://phab.mercurial-scm.org/D1899
Thu, 01 Feb 2018 12:38:04 -0800 localrepo: consistently use native str when __dict__ is involved
Augie Fackler <augie@google.com> [Thu, 01 Feb 2018 12:38:04 -0800] rev 35839
localrepo: consistently use native str when __dict__ is involved Differential Revision: https://phab.mercurial-scm.org/D1898
Wed, 17 Jan 2018 21:46:29 -0500 smartset: use native string when peeking in __dict__
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 21:46:29 -0500] rev 35838
smartset: use native string when peeking in __dict__ # skip-blame just an r prefix on a string literal Differential Revision: https://phab.mercurial-scm.org/D1897
Wed, 17 Jan 2018 21:46:09 -0500 obsolete: use native string when peeking in __dict__
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 21:46:09 -0500] rev 35837
obsolete: use native string when peeking in __dict__ # skip-blame just an r prefix on a few string literals Differential Revision: https://phab.mercurial-scm.org/D1896
Wed, 17 Jan 2018 21:45:15 -0500 lsprof: use native string when peeking in __dict__
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 21:45:15 -0500] rev 35836
lsprof: use native string when peeking in __dict__ # skip-blame just an r prefix on a string literal Differential Revision: https://phab.mercurial-scm.org/D1895
Wed, 17 Jan 2018 21:44:15 -0500 dirstate: use native strings when peeking in __dict__
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 21:44:15 -0500] rev 35835
dirstate: use native strings when peeking in __dict__ # skip-blame because we're just adding a prefix on a string prefix Differential Revision: https://phab.mercurial-scm.org/D1894
Wed, 17 Jan 2018 21:43:46 -0500 context: use native string when peeking in __dict__
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 21:43:46 -0500] rev 35834
context: use native string when peeking in __dict__ # skip-blame because we're just adding a prefix on a string constant Differential Revision: https://phab.mercurial-scm.org/D1893
Wed, 17 Jan 2018 21:42:56 -0500 bundlerepo: use native str when peeking in __dict__
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 21:42:56 -0500] rev 35833
bundlerepo: use native str when peeking in __dict__ # skip-blame since it's just a string constant prefix Differential Revision: https://phab.mercurial-scm.org/D1892
Wed, 17 Jan 2018 20:41:51 -0500 transaction: fix hg version check when loading journal
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 20:41:51 -0500] rev 35832
transaction: fix hg version check when loading journal Differential Revision: https://phab.mercurial-scm.org/D1891
Wed, 17 Jan 2018 20:38:10 -0500 branchmap: make error messages consistent between Python 2 and 3
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 20:38:10 -0500] rev 35831
branchmap: make error messages consistent between Python 2 and 3 Differential Revision: https://phab.mercurial-scm.org/D1890
Wed, 17 Jan 2018 20:37:17 -0500 tests: bytestring-ify all the adhoc extensions in test-strip.t
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 20:37:17 -0500] rev 35830
tests: bytestring-ify all the adhoc extensions in test-strip.t # skip-blame because we're just adding b'' Differential Revision: https://phab.mercurial-scm.org/D1889
Wed, 17 Jan 2018 20:09:52 -0500 filemerge: fix regular expression pattern to be bytes
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 20:09:52 -0500] rev 35829
filemerge: fix regular expression pattern to be bytes # skip-blame just a bytes prefix Differential Revision: https://phab.mercurial-scm.org/D1888
Wed, 17 Jan 2018 20:09:10 -0500 tags: explicitly grab list of dict keys
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 20:09:10 -0500] rev 35828
tags: explicitly grab list of dict keys Differential Revision: https://phab.mercurial-scm.org/D1887
Wed, 17 Jan 2018 20:08:40 -0500 commands: replace map() with list comprehension
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 20:08:40 -0500] rev 35827
commands: replace map() with list comprehension This will work identically on Python 2 and 3. Differential Revision: https://phab.mercurial-scm.org/D1886
Wed, 17 Jan 2018 20:07:53 -0500 commands: rewrite legacy ternary operator hack using modern syntax
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 20:07:53 -0500] rev 35826
commands: rewrite legacy ternary operator hack using modern syntax Differential Revision: https://phab.mercurial-scm.org/D1885
Wed, 17 Jan 2018 20:07:25 -0500 strip: use %d for known-int string interpolation
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 20:07:25 -0500] rev 35825
strip: use %d for known-int string interpolation Differential Revision: https://phab.mercurial-scm.org/D1884
Thu, 18 Jan 2018 10:22:41 -0500 strip: use in-place revset formatspec instead of %-formatting ourselves
Augie Fackler <augie@google.com> [Thu, 18 Jan 2018 10:22:41 -0500] rev 35824
strip: use in-place revset formatspec instead of %-formatting ourselves Caught by Yuya during review of D1884. Differential Revision: https://phab.mercurial-scm.org/D1905
Wed, 17 Jan 2018 19:11:51 -0500 tests: get run-tests to reliably hand shellquote a string and not a bytes
Augie Fackler <augie@google.com> [Wed, 17 Jan 2018 19:11:51 -0500] rev 35823
tests: get run-tests to reliably hand shellquote a string and not a bytes Differential Revision: https://phab.mercurial-scm.org/D1883
Thu, 01 Feb 2018 14:59:38 -0500 revsetlang: fix a doctest example on Python 3
Augie Fackler <augie@google.com> [Thu, 01 Feb 2018 14:59:38 -0500] rev 35822
revsetlang: fix a doctest example on Python 3 # skip-blame because it's just some bytes prefixes Differential Revision: https://phab.mercurial-scm.org/D1964
Thu, 01 Feb 2018 14:28:45 -0500 merge with stable
Augie Fackler <augie@google.com> [Thu, 01 Feb 2018 14:28:45 -0500] rev 35821
merge with stable
Thu, 01 Feb 2018 14:13:41 -0500 Added signature for changeset d334afc585e2 stable
Augie Fackler <raf@durin42.com> [Thu, 01 Feb 2018 14:13:41 -0500] rev 35820
Added signature for changeset d334afc585e2
Thu, 01 Feb 2018 14:13:40 -0500 Added tag 4.5 for changeset d334afc585e2 stable
Augie Fackler <raf@durin42.com> [Thu, 01 Feb 2018 14:13:40 -0500] rev 35819
Added tag 4.5 for changeset d334afc585e2
Thu, 01 Feb 2018 14:11:18 -0500 merge with i18n stable 4.5
Augie Fackler <augie@google.com> [Thu, 01 Feb 2018 14:11:18 -0500] rev 35818
merge with i18n
Wed, 31 Jan 2018 19:41:34 -0200 i18n-pt_BR: synchronized with 373fb3f5922c stable
Wagner Bruna <wbruna@softwareexpress.com.br> [Wed, 31 Jan 2018 19:41:34 -0200] rev 35817
i18n-pt_BR: synchronized with 373fb3f5922c
Sun, 28 Jan 2018 14:08:59 -0500 revset: evaluate filesets against each revision for 'file()' (issue5778) stable
Matt Harbison <matt_harbison@yahoo.com> [Sun, 28 Jan 2018 14:08:59 -0500] rev 35816
revset: evaluate filesets against each revision for 'file()' (issue5778) After f2aeff8a87b6, the fileset was evaluated to a set of files against the working directory, and then those files were applied against each revision. The result was nonsense. For example, `hg log -r 'file("set:exec()")'` on the Mercurial repo listed revision 0 because it has the `hg` script, which is currently +x. But that bit wasn't applied until revision 280 (which 'contains()' properly indicates). This technique was borrowed from checkstatus(), which services adds(), modifies(), and removes(), so it seems safe enough. The 'r:' case is explicitly assigned to wdirrev, freeing up rev=None to mean "re-evaluate at each revision". The distinction is important to avoid behavior changes with `hg log set:...` (test-largefiles-misc.t and test-fileset-generated.t drop current log output without this). I'm not sure what the right behavior for that is (1fd352aa08fc explicitly enabled this behavior for graphlog), but the day before the release isn't the time to experiment.
Wed, 31 Jan 2018 23:01:44 -0500 test-bookmarks-pushpull: stabilize for Windows stable
Matt Harbison <matt_harbison@yahoo.com> [Wed, 31 Jan 2018 23:01:44 -0500] rev 35815
test-bookmarks-pushpull: stabilize for Windows
Thu, 01 Feb 2018 16:46:12 +0800 makefile: add Ubuntu Artful docker targets (.deb and ppa) stable
Anton Shestakov <av6@dwimlabs.net> [Thu, 01 Feb 2018 16:46:12 +0800] rev 35814
makefile: add Ubuntu Artful docker targets (.deb and ppa) Artful Aardvark was released on 2017-10-19 and will be supported until 2018-07.
Wed, 31 Jan 2018 16:31:34 +0100 bundle2: fix the formatting of the stream part requirements stable
Boris Feld <boris.feld@octobus.net> [Wed, 31 Jan 2018 16:31:34 +0100] rev 35813
bundle2: fix the formatting of the stream part requirements Use the same pre-encoded normalization as bundlespecs for the stream v2 part requirements. As it touch the wire protocol, it needs to change before the release. This was spotted by Gregory Szorc. Differential Revision: https://phab.mercurial-scm.org/D1950
Mon, 29 Jan 2018 10:28:10 +0100 streamclone: extract requirements formatting stable
Boris Feld <boris.feld@octobus.net> [Mon, 29 Jan 2018 10:28:10 +0100] rev 35812
streamclone: extract requirements formatting It will be reused for the formatting of the requirements of the stream v2 part requirement and later for the stream v2 requirements. Differential Revision: https://phab.mercurial-scm.org/D1949
Tue, 30 Jan 2018 22:27:45 +0100 bookmarks: fix pushkey compatibility mode (issue5777) stable
Boris Feld <boris.feld@octobus.net> [Tue, 30 Jan 2018 22:27:45 +0100] rev 35811
bookmarks: fix pushkey compatibility mode (issue5777) The namespace used for the compatibility mode was missing a trailing 's'.
Tue, 30 Jan 2018 20:32:48 -0800 lazymanifest: avoid reading uninitialized memory stable
Jun Wu <quark@fb.com> [Tue, 30 Jan 2018 20:32:48 -0800] rev 35810
lazymanifest: avoid reading uninitialized memory I got errors running tests with clang UBSAN [1] enabled. One of them is: ``` --- test-dirstate.t +++ test-dirstate.t.err @@ -85,9 +85,115 @@ $ echo "[extensions]" >> .hg/hgrc $ echo "dirstateex=../dirstateexception.py" >> .hg/hgrc $ hg up 0 - abort: simulated error while recording dirstateupdates - [255] + mercurial/cext/manifest.c:781:13: runtime error: load of value 190, which is not a valid value for type 'bool' + #0 0x7f668a8cf748 in lazymanifest_diff mercurial/cext/manifest.c:781 + #1 0x7f6692fc1dc4 in call_function Python-2.7.11/Python/ceval.c:4350 + ....... + SUMMARY: UndefinedBehaviorSanitizer: invalid-bool-load mercurial/cext/manifest.c:781:13 in + [1] $ hg log -r . -T '{rev}\n' 1 $ hg status - ? a ``` While the code is not technically wrong, but switching the condition would make clang UBSAN happy. So let's do it. The uninitialized memory could come from, for example, `lazymanifest_copy` allocates `self->maxlines` items but only writes the first `self->lines` items. [1]: https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html Test Plan: Run `test-dirstate.t` with UBSAN and it no longer reports the issue. Differential Revision: https://phab.mercurial-scm.org/D1948
Fri, 26 Jan 2018 11:42:47 -0800 unamend: fix command summary line stable
Martin von Zweigbergk <martinvonz@google.com> [Fri, 26 Jan 2018 11:42:47 -0800] rev 35809
unamend: fix command summary line Before this patch, the docstring started with a newline, which led the summary line (shown in e.g. `hg help -c`) to be blank. Differential Revision: https://phab.mercurial-scm.org/D1943
Mon, 29 Jan 2018 13:30:29 -0800 configitems: traverse sections deterministically stable
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 29 Jan 2018 13:30:29 -0800] rev 35808
configitems: traverse sections deterministically Otherwise output can be non-deterministic if there are warnings for multiple sections. Differential Revision: https://phab.mercurial-scm.org/D1947
Mon, 29 Jan 2018 21:42:18 -0500 lfs: don't require the .hglfs file to be tracked to control the policy stable
Matt Harbison <matt_harbison@yahoo.com> [Mon, 29 Jan 2018 21:42:18 -0500] rev 35807
lfs: don't require the .hglfs file to be tracked to control the policy The .hgignore file doesn't need to be tracked, nor does the git equivalent of this file. I'm still a little concerned about the effects of forgetting to commit this file. But the fact that conversions maintain the hashes if only the normal vs external storage changes, should make this less risky.
Sat, 27 Jan 2018 21:50:04 -0500 tests: add a pattern to fix --pure tests stable
Augie Fackler <augie@google.com> [Sat, 27 Jan 2018 21:50:04 -0500] rev 35806
tests: add a pattern to fix --pure tests Test Plan: ran all tests with and without --pure, everything passed on gcc112. Differential Revision: https://phab.mercurial-scm.org/D1946
Fri, 26 Jan 2018 16:01:42 +0100 streamclone: add a comment about non-publishing being broken with v1 stable
Boris Feld <boris.feld@octobus.net> [Fri, 26 Jan 2018 16:01:42 +0100] rev 35805
streamclone: add a comment about non-publishing being broken with v1 This change was suggested by Gregory Szorc.
Fri, 26 Jan 2018 15:51:07 +0100 streamclone: move requirement update into consumev2 stable
Boris Feld <boris.feld@octobus.net> [Fri, 26 Jan 2018 15:51:07 +0100] rev 35804
streamclone: move requirement update into consumev2 This change was suggested by Gregory Szorc.
Wed, 24 Jan 2018 21:44:31 +0100 streamclone: use readexactly when reading stream v2 stable
Boris Feld <boris.feld@octobus.net> [Wed, 24 Jan 2018 21:44:31 +0100] rev 35803
streamclone: use readexactly when reading stream v2 Yuya Nishihara pointed out that it is safer.
Wed, 24 Jan 2018 21:37:48 +0100 streamclone: rename '_emit' to '_emit2' for clarity stable
Boris Feld <boris.feld@octobus.net> [Wed, 24 Jan 2018 21:37:48 +0100] rev 35802
streamclone: rename '_emit' to '_emit2' for clarity This change was suggested by Gregory Szorc.
Tue, 23 Jan 2018 21:14:36 +0900 help: do not suggest "update --clean ." to cancel uncommitted merge stable
Yuya Nishihara <yuya@tcha.org> [Tue, 23 Jan 2018 21:14:36 +0900] rev 35801
help: do not suggest "update --clean ." to cancel uncommitted merge Follows up 41ef02ba329b.
Wed, 24 Jan 2018 22:26:28 -0500 minifileset: note the unsupported file pattern when raising a parse error stable
Matt Harbison <matt_harbison@yahoo.com> [Wed, 24 Jan 2018 22:26:28 -0500] rev 35800
minifileset: note the unsupported file pattern when raising a parse error This was useful in debugging, because I stupidly quoted it out of habit from the command line. This isn't a great example that clearly shows the problem, but I don't know how to improve it. The problem *is* obvious once a complex statement or a clearly bogus string is used.
Tue, 23 Jan 2018 21:29:45 -0500 lfs: don't automatically exclude '.hg*' files from external tracking stable
Matt Harbison <matt_harbison@yahoo.com> [Tue, 23 Jan 2018 21:29:45 -0500] rev 35799
lfs: don't automatically exclude '.hg*' files from external tracking The only reasons I did this in the first place was because tracking externally seems like it would always be a mistake, and the eol extension does the same thing. Yuya and Jun thought it might be better to not do this[1], so I'll defer to them on this. If a problem with say, .hgtags or .hgeol does arise, it can be added back without breaking existing repos. [1] https://www.mercurial-scm.org/pipermail/mercurial-devel/2018-January/110371.html
Tue, 23 Jan 2018 20:50:02 -0500 lfs: rename {oid} to {lfsoid} stable
Matt Harbison <matt_harbison@yahoo.com> [Tue, 23 Jan 2018 20:50:02 -0500] rev 35798
lfs: rename {oid} to {lfsoid} Per Yuya, for consistency with {lfspointer}. It might be slightly confusing for there to be {lfsoid} and {lfspointer.oid}. But preventing ambiguity seems more important, and the latter is controlled by the git-lfs spec.
Mon, 22 Jan 2018 17:47:40 -0500 lfs: rename {pointer} to {lfspointer} stable
Matt Harbison <matt_harbison@yahoo.com> [Mon, 22 Jan 2018 17:47:40 -0500] rev 35797
lfs: rename {pointer} to {lfspointer} Per Martin von Zweigbergk's suggestion to keep this unambiguous, for when it is migrated to {files} and friends.
Mon, 22 Jan 2018 18:08:50 -0500 Added signature for changeset 27b6df1b5adb stable
Augie Fackler <raf@durin42.com> [Mon, 22 Jan 2018 18:08:50 -0500] rev 35796
Added signature for changeset 27b6df1b5adb
Mon, 22 Jan 2018 18:08:49 -0500 Added tag 4.5-rc for changeset 27b6df1b5adb stable
Augie Fackler <raf@durin42.com> [Mon, 22 Jan 2018 18:08:49 -0500] rev 35795
Added tag 4.5-rc for changeset 27b6df1b5adb
Mon, 22 Jan 2018 17:53:02 -0500 merge with stable to begin 4.5 freeze stable 4.5-rc
Augie Fackler <augie@google.com> [Mon, 22 Jan 2018 17:53:02 -0500] rev 35794
merge with stable to begin 4.5 freeze # no-check-commit because it's a clean merge
Sat, 20 Jan 2018 22:55:42 -0800 bundle2: increase payload part chunk size to 32kb
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 20 Jan 2018 22:55:42 -0800] rev 35793
bundle2: increase payload part chunk size to 32kb Bundle2 payload parts are framed chunks. Esentially, we obtain data in equal size chunks of size `preferedchunksize` and emit those to a generator. That generator is fed into a compressor (which can be the no-op compressor, which just re-emits the generator). And the output from the compressor likely goes to a file descriptor or socket. What this means is that small chunk sizes create more Python objects and Python function calls than larger chunk sizes. And as we know, Python object and function call overhead in performance sensitive code matters (at least with CPython). This commit increases the bundle2 part payload chunk size from 4k to 32k. Practically speaking, this means that the chunks we feed into a compressor (implemented in C code) or feed directly into a file handle or socket write() are larger. It's possible the chunks might be larger than what the receiver can handle in one logical operation. But at that point, we're in C code, which is much more efficient at dealing with splitting up the chunk and making multiple function calls than Python is. A downside to larger chunks is that the receiver has to wait for that much data to arrive (either raw or from a decompressor) before it can process the chunk. But 32kb still feels like a small buffer to have to wait for. And in many cases, the client will convert from 8 read(4096) to 1 read(32768). That's happening in Python land. So we cut down on the number of Python objects and function calls, making the client faster as well. I don't think there are any significant concerns to increasing the payload chunk size to 32kb. The impact of this change on performance significant. Using `curl` to obtain a stream clone bundle2 payload from a server on localhost serving the mozilla-unified repository: before: 20.78 user; 7.71 system; 80.5 MB/s after: 13.90 user; 3.51 system; 132 MB/s legacy: 9.72 user; 8.16 system; 132 MB/s bundle2 stream clone generation is still more resource intensive than legacy stream clone (that's likely because of the use of a util.chunkbuffer). But the throughput is the same. We might be in territory we're this is effectively a benchmark of the networking stack or Python's syscall throughput. From the client perspective, `hg clone -U --stream`: before: 33.50 user; 7.95 system; 53.3 MB/s after: 22.82 user; 7.33 system; 72.7 MB/s legacy: 29.96 user; 7.94 system; 58.0 MB/s And for `hg clone --stream` with a working directory update of ~230k files: after: 119.55 user; 26.47 system; 0:57.08 wall legacy: 126.98 user; 26.94 system; 1:05.56 wall So, it appears that bundle2's stream clone is now definitively faster than legacy stream clone! Differential Revision: https://phab.mercurial-scm.org/D1932
Mon, 22 Jan 2018 12:23:47 -0800 bundle2: always advertise client support for stream parts
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 22 Jan 2018 12:23:47 -0800] rev 35792
bundle2: always advertise client support for stream parts Previously, enabling of stream clone over bundle2 was a server-side only change. And clients would only advertise bundle2 support for stream clones if an experimental config option was set. This situation wasn't forward compatible because in the future (when the feature is enabled on servers by default), an old client would send a request to the server but it wouldn't send its own bundle2 capability support for stream parts. Servers would have to infer that clients not sending this capability were old Mercurial clients that only sent the capability if the feature was explicitly enabled. Implicit and inferred behavior makes implementing servers hard. It's much better to be explicit about client features. We should either make the config option for bundle2 stream clones disable the feature client-side as well (so a server doesn't see a request from a client not advertising stream support). Or we should always advertise stream support if a client is willing to accept stream parts. Since I anticipating stabilizing stream clone support in bundle2 quickly, I think it's safe to always advertise client support in the bundle2 capabilities. So this commit changes things to do that. Because capabilities now vary between client and server, we had to create variations of the variable substitutions for those strings. Differential Revision: https://phab.mercurial-scm.org/D1931
Mon, 22 Jan 2018 12:22:01 -0800 exchange: don't send stream data when server.uncompressed is set
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 22 Jan 2018 12:22:01 -0800] rev 35791
exchange: don't send stream data when server.uncompressed is set Previously, bundle2 stream support would send out data even though the streaming clone feature was disabled. This commit changes the part handler to respect the server config. Differential Revision: https://phab.mercurial-scm.org/D1930
Mon, 22 Jan 2018 12:21:15 -0800 bundle2: don't advertise stream bundle2 capability when feature disabled
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 22 Jan 2018 12:21:15 -0800] rev 35790
bundle2: don't advertise stream bundle2 capability when feature disabled The server.uncompressed config option can be used to disable streaming clones. While the top-level capability to advertise streaming clone support isn't advertised when this option is set, we were still sending the bundle2-level capabilities advertising support for stream parts. It makes sense to not advertise that support when streaming clones are globally disabled. If the structure of the new code seems a bit odd, it is because we'll have to further tweak the behavior in commit(s) ahead. Differential Revision: https://phab.mercurial-scm.org/D1929
Mon, 22 Jan 2018 12:19:45 -0800 tests: add more testing around server.uncompressed
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 22 Jan 2018 12:19:45 -0800] rev 35789
tests: add more testing around server.uncompressed We already have testing for server.uncompressed in test-http*.t. However, it doesn't cover the new bundle2 use case. And, we don't have comprehensive testing of advertised capabilities. We add tests to test-clone-uncompressed.t that demonstrate behavior for both legacy and bundle2 configurations. If you look closely, the bundle2 capabilities are advertising stream support when it isn't enabled. That's a bug. In addition, while the client is smart enough to not request a stream clone when the server doesn't have the feature enabled, the getbundle wire protocol command is still sending stream clone data. This doesn't match the behavior of the legacy stream_out wire protocol command. That's also a bug. Tests have been added. While I was here, I also changed how the PID is recorded in $DAEMON_PIDS. If we kill a process, the PID formerly in $DAEMON_PIDS no longer exists. So we should replace that file instead of appending to it. Differential Revision: https://phab.mercurial-scm.org/D1928
Mon, 22 Jan 2018 12:19:49 -0800 bundle2: move version of stream clone into part name
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 22 Jan 2018 12:19:49 -0800] rev 35788
bundle2: move version of stream clone into part name I don't like having version numbers as part parameters. It means that parts can theoretically vary wildly in their generation and processing semantics. I think that a named part should have consistent behavior over time. In other words, if you need to introduce new functionality or behavior, that should be expressed by inventing a new bundle2 part, not adding functionality to an existing part. This commit applies this advice to the just-introduced stream clone via bundle2 feature. The "version" part parameter is removed. The name of the bundle2 part is now "stream2" instead of "stream" with "version=v2". Differential Revision: https://phab.mercurial-scm.org/D1927
Mon, 22 Jan 2018 12:12:29 -0800 exchange: send bundle2 stream clones uncompressed
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 22 Jan 2018 12:12:29 -0800] rev 35787
exchange: send bundle2 stream clones uncompressed Stream clones don't compress well. And compression undermines a point of stream clones which is to trade significant CPU reductions by increasing size. Building upon our introduction of metadata to communicate bundle information back to callers of exchange.getbundlechunks(), we add an attribute to the bundler that communicates whether the bundle is best left uncompressed. We return this attribute as part of the bundle metadata. And the wire protocol honors it when determining whether to compress the wire protocol response. The added test demonstrates that the raw result from the wire protocol is not compressed. It also demonstrates that the server will serve stream responses when the feature isn't enabled. We'll address that in another commit. The effect of this change is that server-side CPU usage for bundle2 stream clones is significantly reduced by removing zstd compression. For the mozilla-unified repository: before: 37.69 user 8.01 system after: 27.38 user 7.34 system Assuming things are CPU bound, that ~10s reduction would translate to faster clones on the client. zstd can decompress at >1 GB/s. So the overhead from decompression on the client is small in the grand scheme of things. But if zlib compression were being used, the overhead would be much greater. Differential Revision: https://phab.mercurial-scm.org/D1926
Mon, 22 Jan 2018 12:38:04 -0800 tests: update test to work with Git 2.16
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 22 Jan 2018 12:38:04 -0800] rev 35786
tests: update test to work with Git 2.16 It looks like Git 2.16 removed the "..." from some strings. Glob over those characters in the test output. Differential Revision: https://phab.mercurial-scm.org/D1935
Sat, 20 Jan 2018 13:41:57 -0800 exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 20 Jan 2018 13:41:57 -0800] rev 35785
exchange: return bundle info from getbundlechunks() (API) We generally want a mechanism to pass information about the generated bundle back to callers (in addition to the byte stream). Ideally we would return a bundler from this function and have the caller code to an interface. But the bundling APIs are not great and getbundlechunks() is the best API we have for obtaining bundle contents in a unified manner. We change getbundlechunks() to return a dict that we can use to communicate metadata. We populate that dict with the bundle version number to demonstrate some value. .. api:: exchange.getbundlechunks() now returns a 2-tuple instead of just an iterator. Differential Revision: https://phab.mercurial-scm.org/D1925
(0) -30000 -10000 -3000 -1000 -300 -100 -64 +64 +100 +300 +1000 +3000 +10000 tip