Tue, 16 Jan 2018 19:56:00 -0500 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com> [Tue, 16 Jan 2018 19:56:00 -0500] rev 35662
cat: factor out a function that populates the formatter This will allow extensions to add data to the templater.
Sun, 14 Jan 2018 12:07:06 -0500 svnsubrepo: add new method _svnmissing
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Sun, 14 Jan 2018 12:07:06 -0500] rev 35661
svnsubrepo: add new method _svnmissing This is modelled after _gitmissing from dea6efdd7ec4 and also necessary for svn. I'm not sure exactly how this hasn't been more of a problem for svn until now, actually.
Sun, 14 Jan 2018 12:05:28 -0500 svnsubrepo: decorate dirty method with annotatesubrepoerror
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Sun, 14 Jan 2018 12:05:28 -0500] rev 35660
svnsubrepo: decorate dirty method with annotatesubrepoerror This function invokes svn commands which can error out in any number of ways, so it's helpful to know in which subrepo this error happens.
Tue, 16 Jan 2018 22:14:33 +0900 match: do not weirdly include explicit files excluded by -X option
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Jan 2018 22:14:33 +0900] rev 35659
match: do not weirdly include explicit files excluded by -X option Actually, this was the original behavior. Before a83a7d27911e, "log" and "files" showed nothing if "FILE -X FILE" was specified, whereas "debugwalk" got confused by an explicit FILE pattern. Under the hood, "log" and "files" use m() and ctx.matches(m) respectively, and "debugwalk" uses ctx.walk(m). I suspect dirstate.walk() goes wrong in _walkexplicit(), which seems to blindly trust m.files(). I reckon the original "log"/"files" behavior is correct, and drop the hack from the differencematcher.
Sun, 14 Jan 2018 15:56:22 -0500 lfs: add the '{oid}' template keyword to '{lfs_files}'
Matt Harbison <matt_harbison@yahoo.com> [Sun, 14 Jan 2018 15:56:22 -0500] rev 35658
lfs: add the '{oid}' template keyword to '{lfs_files}' The 'sha256:' prefix is skipped because this seems like the most convenient way to consume it. Maybe we should also add a '{oid_type}' keyword? Then again, that can be added in the future if a different algorithm is supported.
Sun, 14 Jan 2018 15:39:10 -0500 lfs: convert '{lfs_files}' keyword to a hybrid list
Matt Harbison <matt_harbison@yahoo.com> [Sun, 14 Jan 2018 15:39:10 -0500] rev 35657
lfs: convert '{lfs_files}' keyword to a hybrid list This will allow more attributes about the file to be queried.
Sun, 10 Dec 2017 21:42:33 +0100 showstack: add an extension docstring
Boris Feld <boris.feld@octobus.net> [Sun, 10 Dec 2017 21:42:33 +0100] rev 35656
showstack: add an extension docstring Now, running `hg help showstack` will give details on how to use the extension.
Mon, 15 Jan 2018 10:44:49 +0000 bookmark: run 'pushkey' hooks after bookmark move, not 'prepushkey'
Boris Feld <boris.feld@octobus.net> [Mon, 15 Jan 2018 10:44:49 +0000] rev 35655
bookmark: run 'pushkey' hooks after bookmark move, not 'prepushkey' This was a silly copy paste mistake. Spotted by Mitchell Plamann from Jane Street.
Mon, 15 Jan 2018 19:44:18 +0800 hgweb: remove unused second argument of nextPageVarGet()
Anton Shestakov <av6@dwimlabs.net> [Mon, 15 Jan 2018 19:44:18 +0800] rev 35654
hgweb: remove unused second argument of nextPageVarGet() nextPageVarGet is a function that's used in ajaxScrollInit() to produce URL of the next page. Before f84b01257e06, its second argument previousVal was a number on /graph pages, and the code was simply adding 60 to it and returning the resulting value. Now previousVal can only be a string containing changeset hash, which can't be used the same way (and in fact isn't used in any way).
Sun, 14 Jan 2018 20:06:56 -0800 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 14 Jan 2018 20:06:56 -0800] rev 35653
dispatch: handle IOError when writing to stderr Previously, attempts to write to stderr in dispatch.run() may lead to an exception being thrown. This would likely be handled by Python's default exception handler, which would print the exception and exit 1. Code in this function is already catching IOError for stdout failures and converting to exit code 255 (-1 & 255 == 255). Why we weren't doing the same for stderr for the sake of consistency, I don't know. I do know that chg and hg diverged in behavior here (as the changed test-basic.t shows). After this commit, we catch I/O failure on stderr and change the exit code to 255. chg and hg now behave consistently. As a bonus, Rust hg also now passes this test. I'm skeptical at changing the exit code due to failures this late in the process. I think we should consider preserving the current exit code - assuming it is non-0. And, we may want to preserve the exit code completely if the I/O error is EPIPE (and potentially other special error classes). There's definitely room to tweak behavior. But for now, let's at least prevent the uncaught exception. Differential Revision: https://phab.mercurial-scm.org/D1860
Sun, 14 Jan 2018 19:30:48 -0800 commandserver: restore cwd in case of exception
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 14 Jan 2018 19:30:48 -0800] rev 35652
commandserver: restore cwd in case of exception The order of the statements was also changed a bit. But it shouldn't matter. Differential Revision: https://phab.mercurial-scm.org/D1859
Wed, 10 Jan 2018 20:02:35 -0800 tests: make hg frame optional
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 10 Jan 2018 20:02:35 -0800] rev 35651
tests: make hg frame optional When `hg` is a Rust binary, the `hg` frame doesn't exist because an `hg` Python script doesn't exist. This commit updates expected test output to make the `hg` frame optional. There /might/ be a way to do this more accurately with the "(feature !)" syntax in .t files. However, I poked at it for a few minutes and couldn't get it to work. Worst case with using (?) is we drop the frame from output for Python `hg`. The `hg` frame isn't terribly important. So the worst case doesn't feel that bad. If someone wants to enlighten me on how to use "(feature !)" for optional output based on hghave features, I'd be more than willing to update this. Differential Revision: https://phab.mercurial-scm.org/D1858
Sat, 13 Jan 2018 22:40:33 -0500 test-lfs: add tests to show that hashes remain unchanged by conversions
Matt Harbison <matt_harbison@yahoo.com> [Sat, 13 Jan 2018 22:40:33 -0500] rev 35650
test-lfs: add tests to show that hashes remain unchanged by conversions This is a very cool feature that we should document, but I'll punt that to the freeze. From what I can tell, git doesn't have this capability.
Sat, 13 Jan 2018 22:29:18 -0500 test-lfs: drop an unresolved issue note, now that lfs.track=none() is a thing
Matt Harbison <matt_harbison@yahoo.com> [Sat, 13 Jan 2018 22:29:18 -0500] rev 35649
test-lfs: drop an unresolved issue note, now that lfs.track=none() is a thing
Sat, 13 Jan 2018 20:07:14 -0500 lfs: always exclude '.hg*' text files
Matt Harbison <matt_harbison@yahoo.com> [Sat, 13 Jan 2018 20:07:14 -0500] rev 35648
lfs: always exclude '.hg*' text files I can't think of any problematic scenarios (though things might get interesting with .hgtags, since every head is consulted). The eol extension explicitly disables handling these files, and that seems reasonable here too.
Mon, 15 Jan 2018 00:16:11 +0530 bookmarks: calculate visibility exceptions only once
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 15 Jan 2018 00:16:11 +0530] rev 35647
bookmarks: calculate visibility exceptions only once In the loop "for mark in names", the rev is same in each iteration, so it does not makes sense to call unhidehashlikerevs multiple times. Thanks to Yuya for spotting this.
Sun, 10 Dec 2017 18:25:33 +0900 log: rewrite --follow-first -rREV like --follow for consistency (BC)
Yuya Nishihara <yuya@tcha.org> [Sun, 10 Dec 2017 18:25:33 +0900] rev 35646
log: rewrite --follow-first -rREV like --follow for consistency (BC) This helps fixing the "--follow -rREV PATH" issue. .. bc:: ``log --follow-first -rREV``, which is deprecated, now follows the first parent of merge revisions from the specified ``REV`` just like ``log --follow -rREV``.
Tue, 02 Jan 2018 17:37:01 +0900 log: use revsetlang.formatspec() thoroughly
Yuya Nishihara <yuya@tcha.org> [Tue, 02 Jan 2018 17:37:01 +0900] rev 35645
log: use revsetlang.formatspec() thoroughly This patch replaces %(val)s and %(val)r with %r (expression) and %s (string) respectively. _matchfiles() is the exception as it takes a list of string parameters. "--prune REV" could take a revset expression if it were "ancestors(%(val)s)", but this patch doesn't change the existing behavior.
Tue, 02 Jan 2018 17:13:18 +0900 log: use revsetlang.formatspec() to concatenate list expression
Yuya Nishihara <yuya@tcha.org> [Tue, 02 Jan 2018 17:13:18 +0900] rev 35644
log: use revsetlang.formatspec() to concatenate list expression This rewrites 'not ancestors(x) and not ...' as 'not (ancestors(x) or ...)' so we can use '%lr'. 'isinstance(val, list)' is replaced with 'listop' to make sure 'listop' is applied.
Tue, 02 Jan 2018 17:00:48 +0900 log: simplify 'x or ancestors(x)' expression
Yuya Nishihara <yuya@tcha.org> [Tue, 02 Jan 2018 17:00:48 +0900] rev 35643
log: simplify 'x or ancestors(x)' expression 'ancestors(x)' includes 'x'.
Tue, 02 Jan 2018 16:58:37 +0900 log: make opt2revset table a module constant
Yuya Nishihara <yuya@tcha.org> [Tue, 02 Jan 2018 16:58:37 +0900] rev 35642
log: make opt2revset table a module constant Just makes it clear that the table isn't updated in _makelogrevset().
Sun, 14 Jan 2018 13:04:26 -0800 revlog: group revision info into a dedicated structure
Paul Morelle <paul.morelle@octobus.net> [Sun, 14 Jan 2018 13:04:26 -0800] rev 35641
revlog: group revision info into a dedicated structure
Sun, 14 Jan 2018 13:01:35 -0800 revlog: rename 'rev' to 'base', as it is the base revision
Paul Morelle <paul.morelle@octobus.net> [Sun, 14 Jan 2018 13:01:35 -0800] rev 35640
revlog: rename 'rev' to 'base', as it is the base revision
Sun, 14 Jan 2018 12:59:46 -0800 revlog: separate diff computation from the collection of other info
Paul Morelle <paul.morelle@octobus.net> [Sun, 14 Jan 2018 12:59:46 -0800] rev 35639
revlog: separate diff computation from the collection of other info
Fri, 12 Jan 2018 18:58:44 +0100 revlog: introduce 'deltainfo' to distinguish from 'delta'
Paul Morelle <paul.morelle@octobus.net> [Fri, 12 Jan 2018 18:58:44 +0100] rev 35638
revlog: introduce 'deltainfo' to distinguish from 'delta' A 'delta' is a binary diff between two revisions, as returned by revdiff. A 'deltainfo' is an object storing information about a delta, including the 'delta' itself. Formerly, it was stored in a 7-position tuple, which was less readable.
Fri, 12 Jan 2018 18:10:03 +0100 revlog: extract 'builddelta' closure function from _addrevision
Paul Morelle <paul.morelle@octobus.net> [Fri, 12 Jan 2018 18:10:03 +0100] rev 35637
revlog: extract 'builddelta' closure function from _addrevision
Fri, 12 Jan 2018 15:55:25 +0100 revlog: extract 'buildtext' closure function from _addrevision
Paul Morelle <paul.morelle@octobus.net> [Fri, 12 Jan 2018 15:55:25 +0100] rev 35636
revlog: extract 'buildtext' closure function from _addrevision
Sun, 14 Jan 2018 12:49:24 -0800 revlog: choose between ifh and dfh once for all
Paul Morelle <paul.morelle@octobus.net> [Sun, 14 Jan 2018 12:49:24 -0800] rev 35635
revlog: choose between ifh and dfh once for all
Sun, 14 Jan 2018 12:46:03 -0800 revlog: refactor out the selection of candidate revisions
Paul Morelle <paul.morelle@octobus.net> [Sun, 14 Jan 2018 12:46:03 -0800] rev 35634
revlog: refactor out the selection of candidate revisions The new function will be useful to retrieve all the revisions which will be needed to determine the best delta, and parallelize the computation of the necessary diffs.
Sat, 30 Dec 2017 00:13:56 +0530 py3: use email.parser module to parse email messages
Pulkit Goyal <7895pulkit@gmail.com> [Sat, 30 Dec 2017 00:13:56 +0530] rev 35633
py3: use email.parser module to parse email messages Before this patch we use email.Parser.Parser() from the email module which is not available on Python 3. On Python 2: >>> import email >>> import email.parser as emailparser >>> email.Parser.Parser is emailparser.Parser True
Fri, 12 Jan 2018 22:18:42 +0900 rust: convert Unix path to CString transparently
Yuya Nishihara <yuya@tcha.org> [Fri, 12 Jan 2018 22:18:42 +0900] rev 35632
rust: convert Unix path to CString transparently On Unix, path is just a sequence of bytes. We shouldn't convert it to UTF-8 string.
Fri, 12 Jan 2018 22:09:34 +0900 rust: extract function to convert Path to platform CString
Yuya Nishihara <yuya@tcha.org> [Fri, 12 Jan 2018 22:09:34 +0900] rev 35631
rust: extract function to convert Path to platform CString It can be better on Unix.
Mon, 09 Oct 2017 11:46:27 +0200 pylint: add a check for multiple statement on a single line
Boris Feld <boris.feld@octobus.net> [Mon, 09 Oct 2017 11:46:27 +0200] rev 35630
pylint: add a check for multiple statement on a single line Now that they are all cleaned up, we can install a check so that no new occurrence appears. Differential Revision: https://phab.mercurial-scm.org/D1834
Mon, 09 Oct 2017 11:45:21 +0200 style: remove multiple statement on a single line in zeroconf
Boris Feld <boris.feld@octobus.net> [Mon, 09 Oct 2017 11:45:21 +0200] rev 35629
style: remove multiple statement on a single line in zeroconf Differential Revision: https://phab.mercurial-scm.org/D1833
Mon, 09 Oct 2017 11:44:02 +0200 style: remove multiple statement on a single line
Boris Feld <boris.feld@octobus.net> [Mon, 09 Oct 2017 11:44:02 +0200] rev 35628
style: remove multiple statement on a single line This is similar to the change made in 5326e4ef1dab. Differential Revision: https://phab.mercurial-scm.org/D1832
Mon, 09 Oct 2017 11:40:15 +0200 pylint: split command line argument on multiple lines
Boris Feld <boris.feld@octobus.net> [Mon, 09 Oct 2017 11:40:15 +0200] rev 35627
pylint: split command line argument on multiple lines This clarify the important line in that configuration. Differential Revision: https://phab.mercurial-scm.org/D1831
Sun, 14 Jan 2018 11:24:43 -0800 phabricator: use named group for parsing differential reviews lines
Tom Prince <mozilla@hocat.ca> [Sun, 14 Jan 2018 11:24:43 -0800] rev 35626
phabricator: use named group for parsing differential reviews lines Differential Revision: https://phab.mercurial-scm.org/D1801
Sat, 13 Jan 2018 13:47:10 +0900 vfs: drop text mode flag (API)
Yuya Nishihara <yuya@tcha.org> [Sat, 13 Jan 2018 13:47:10 +0900] rev 35625
vfs: drop text mode flag (API) It's useless on Python 3. .. api:: ``text=False|True`` option is dropped from the vfs interface because of Python 3 compatibility issue. Use ``util.tonativeeol/fromnativeeol()`` to convert EOL manually.
Sat, 13 Jan 2018 13:41:11 +0900 lfs: convert EOL of hgrc before appending to bytes IO
Yuya Nishihara <yuya@tcha.org> [Sat, 13 Jan 2018 13:41:11 +0900] rev 35624
lfs: convert EOL of hgrc before appending to bytes IO Text IO is useless on Python 3 as it must be a unicode stream.
Sat, 13 Jan 2018 13:33:55 +0900 largefiles: convert EOL of hgrc before appending to bytes IO
Yuya Nishihara <yuya@tcha.org> [Sat, 13 Jan 2018 13:33:55 +0900] rev 35623
largefiles: convert EOL of hgrc before appending to bytes IO Text IO is useless on Python 3 as it must be a unicode stream.
Sat, 13 Jan 2018 13:31:27 +0900 share: convert EOL of hgrc before writing to bytes IO
Yuya Nishihara <yuya@tcha.org> [Sat, 13 Jan 2018 13:31:27 +0900] rev 35622
share: convert EOL of hgrc before writing to bytes IO Text IO is useless on Python 3 as it must be a unicode stream.
Sat, 13 Jan 2018 13:28:12 +0900 subrepo: convert EOL of hgrc before writing to bytes IO
Yuya Nishihara <yuya@tcha.org> [Sat, 13 Jan 2018 13:28:12 +0900] rev 35621
subrepo: convert EOL of hgrc before writing to bytes IO Follows up f2f0a777b2e2. Text IO is useless on Python 3 as it must be a unicode stream.
Sat, 13 Jan 2018 13:24:17 +0900 clone: use utility function to write hgrc
Yuya Nishihara <yuya@tcha.org> [Sat, 13 Jan 2018 13:24:17 +0900] rev 35620
clone: use utility function to write hgrc
Sat, 13 Jan 2018 13:23:16 +0900 share: use context manager or utility function to write file
Yuya Nishihara <yuya@tcha.org> [Sat, 13 Jan 2018 13:23:16 +0900] rev 35619
share: use context manager or utility function to write file
Sun, 31 Dec 2017 02:54:49 -0500 lfs: migrate most file filtering from threshold to custom filter
Matt Harbison <matt_harbison@yahoo.com> [Sun, 31 Dec 2017 02:54:49 -0500] rev 35618
lfs: migrate most file filtering from threshold to custom filter Migrate `lfs.threshold` to more powerful `lfs.filter` added by D4990618 so people can specify what files to be stored in LFS with more flexibility. This patch was authored by Jun Wu for the fb-experimental repo, to avoid using matcher for efficiency[1]. All I've changed here is to register the new 'lfs.track' default so that the tests run cleanly, and adapt the subsequent language changes. Migrating the remaining uses of 'lfs.threshold' can be done separately since there's a fallback in place. [1] https://www.mercurial-scm.org/pipermail/mercurial-devel/2017-December/109388.html
Sun, 31 Dec 2017 12:47:36 -0500 test-lfs: bump the number on test repo11 and higher
Matt Harbison <matt_harbison@yahoo.com> [Sun, 31 Dec 2017 12:47:36 -0500] rev 35617
test-lfs: bump the number on test repo11 and higher This will allow a Facebook patch that creates 'repo11' to be imported without breaking a bunch of tests, or requiring edits on the fly.
Wed, 10 Jan 2018 22:23:34 -0500 fileset: add a lightweight file filtering language
Matt Harbison <matt_harbison@yahoo.com> [Wed, 10 Jan 2018 22:23:34 -0500] rev 35616
fileset: add a lightweight file filtering language This patch was inspired by one that Jun Wu authored for the fb-experimental repo, to avoid using matcher for efficiency[1]. We want a way to specify what files will be converted to LFS at commit time. And per discussion, we also want to specify what files to skip, text diff, or merge in another config option. The current `lfs.threshold` config option could not satisfy complex needs. I'm putting it in a core package because Augie floated the idea of also using it for narrow and sparse. Yuya suggested farming out to fileset.parse(), which added support for more symbols. The only fileset element not supported here is 'negate'. (List isn't supported by filesets either.) I also changed the 'always' token to the 'all()' predicate for consistency, and introduced 'none()' to improve readability in a future tracked file based config. The extension operator was changed from '.' to '**', to match how recursive path globs are specified. Finally, I changed the path matcher from '/' to 'path:' at Yuya's suggestion, for consistency with matcher. Unfortunately, ':' is currently reserved in filesets, so this has to be quoted to be processed as a string instead of a symbol[2]. We should probably revisit that, because it's seriously ugly. But it's only used by an experimental extension, and I think using a file based config for LFS may drive some more tweaks, so I'm settling for this for now. I reserved all of the glob characters in fileset except '.' and '_' for the extension test because those are likely valid extension characters. Sample filter settings: all() # everything size(">20MB") # larger than 20MB !**.txt # except for .txt files **.zip | **.tar.gz | **.7z # some types of compressed files "path:bin" # files under "bin" in the project root [1] https://www.mercurial-scm.org/pipermail/mercurial-devel/2017-December/109387.html [2] https://www.mercurial-scm.org/pipermail/mercurial-devel/2018-January/109729.html
Wed, 10 Jan 2018 22:35:08 -0500 fileset: split the logic for matching a size expression to a separate method
Matt Harbison <matt_harbison@yahoo.com> [Wed, 10 Jan 2018 22:35:08 -0500] rev 35615
fileset: split the logic for matching a size expression to a separate method This will be used in the next patch to build a simple filtering language, but where we won't have an mctx.
Fri, 12 Jan 2018 23:13:38 -0500 lfs: drop deprecated remote store config options
Matt Harbison <matt_harbison@yahoo.com> [Fri, 12 Jan 2018 23:13:38 -0500] rev 35614
lfs: drop deprecated remote store config options The last of these were removed from fb-experimental in 86884a51e9aa, and we might as well clean this up before the freeze.
Fri, 12 Jan 2018 18:11:05 +0530 py3: use bytes instead of pycompat.bytestr
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 12 Jan 2018 18:11:05 +0530] rev 35613
py3: use bytes instead of pycompat.bytestr Follow up for 35fb3367f72d. Differential Revision: https://phab.mercurial-scm.org/D1854
Fri, 12 Jan 2018 17:10:55 +0100 test-pull-r: explicitly kill server processes
Joerg Sonnenberger <joerg@bec.de> [Fri, 12 Jan 2018 17:10:55 +0100] rev 35612
test-pull-r: explicitly kill server processes Differential Revision: https://phab.mercurial-scm.org/D1855
Fri, 05 Jan 2018 22:28:06 +0530 bookmarks: add bookmarks to hidden revs if directaccess config is set
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 05 Jan 2018 22:28:06 +0530] rev 35611
bookmarks: add bookmarks to hidden revs if directaccess config is set This patch adds support to add bookmarks to hidden revs if `experimental.directaccessi=True` config is set. A warning is also printed saying "accessing hidden changeset <revhash>". Differential Revision: https://phab.mercurial-scm.org/D1813
Fri, 12 Jan 2018 11:15:41 +0000 visibility: pass a normal repo to _getfilteredreason
Boris Feld <boris.feld@octobus.net> [Fri, 12 Jan 2018 11:15:41 +0000] rev 35610
visibility: pass a normal repo to _getfilteredreason There is no reason to pass an unfiltered-repo to _getfilteredreason and successorssets, so use a normal repo instead. Differential Revision: https://phab.mercurial-scm.org/D1853
Fri, 12 Jan 2018 11:10:18 +0000 visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net> [Fri, 12 Jan 2018 11:10:18 +0000] rev 35609
visibility: make the filtered message translatable Introduce a filtered message table to ease translation of these messages. Differential Revision: https://phab.mercurial-scm.org/D1852
Fri, 12 Jan 2018 11:09:04 +0000 visibility: fix a comment introduced before which is not up-to-date
Boris Feld <boris.feld@octobus.net> [Fri, 12 Jan 2018 11:09:04 +0000] rev 35608
visibility: fix a comment introduced before which is not up-to-date 265cd9e19d26 introduced a comment in _filterederror that was not updated with the latest iterations of the patch, fix the comment. Differential Revision: https://phab.mercurial-scm.org/D1851
Wed, 10 Jan 2018 19:24:58 -0800 rust: avoid redundant 'static lifetime
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 10 Jan 2018 19:24:58 -0800] rev 35607
rust: avoid redundant 'static lifetime 'static is apparently automatic for const variables. Differential Revision: https://phab.mercurial-scm.org/D1846
Thu, 11 Jan 2018 11:57:59 +0000 pull: hold wlock for the full operation when --update is used
Boris Feld <boris.feld@octobus.net> [Thu, 11 Jan 2018 11:57:59 +0000] rev 35606
pull: hold wlock for the full operation when --update is used With now, the wlock is not held between the pull and the update. This can lead to race condition and make logic checking to post pull results more complicated (eg: with _afterlock).
Thu, 11 Jan 2018 18:20:08 +0800 hgweb: drop support of browsers that don't understand <canvas> (BC)
Anton Shestakov <av6@dwimlabs.net> [Thu, 11 Jan 2018 18:20:08 +0800] rev 35605
hgweb: drop support of browsers that don't understand <canvas> (BC) Internet Explorer 8 and below need excanvas aka ExplorerCanvas to support canvas tag at all. We used to vendor the library in Mercurial, but IE8 was discontinued and all support for it ceased in January 2016. We should do the same and remove excanvas library. Apart from just cleaning up code, this will also make downstream Debian packages stop depending on libjs-excanvas, for example.
Wed, 10 Jan 2018 19:36:45 -0800 rust: add TODO about lifetime of program_name variable
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 10 Jan 2018 19:36:45 -0800] rev 35604
rust: add TODO about lifetime of program_name variable Per review comment in D1581. Differential Revision: https://phab.mercurial-scm.org/D1847
Wed, 10 Jan 2018 19:23:36 -0800 rust: move import of PathBuf
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 10 Jan 2018 19:23:36 -0800] rev 35603
rust: move import of PathBuf By moving it to the single function that uses it, we eliminate a #cfg. Differential Revision: https://phab.mercurial-scm.org/D1845
Wed, 10 Jan 2018 21:09:57 -0800 perf: do not import util.queue
Jun Wu <quark@fb.com> [Wed, 10 Jan 2018 21:09:57 -0800] rev 35602
perf: do not import util.queue This was added by af25237be091. But util.queue is not a module and is not importable. I guess it wasn't noticed because of demandimport. Differential Revision: https://phab.mercurial-scm.org/D1848
Wed, 10 Jan 2018 19:08:51 -0800 rust: move Cargo.lock
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 10 Jan 2018 19:08:51 -0800] rev 35601
rust: move Cargo.lock If you do a `cargo build` in rust/, Cargo will create rust/Cargo.lock. Furthermore, the previous rust/hgcli/Cargo.lock appears to not even be consulted because the auto-generated rust/Cargo.lock varied from rust/hgcli/Cargo.lock. This commit moves Cargo.lock to where Cargo expects it to be. While we're here, bump the version of libc to the latest available. Differential Revision: https://phab.mercurial-scm.org/D1844
Wed, 10 Jan 2018 19:04:52 -0800 run-tests: fix regular expression for path test
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 10 Jan 2018 19:04:52 -0800] rev 35600
run-tests: fix regular expression for path test The previous regexp would match the empty string. This fixes a mistake added in 964212780daf. Differential Revision: https://phab.mercurial-scm.org/D1843
Sun, 17 Dec 2017 04:31:27 +0100 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net> [Sun, 17 Dec 2017 04:31:27 +0100] rev 35599
perf: add threading capability to perfbdiff Since we are releasing the GIL during diffing, it is interesting to see how a thread pool would perform on diffing. We add a new `--threads` argument to commands. Synchronizing the thread pool is a bit complex because we want to be able to reuse it from one run to another. On my computer (i7 with 4 cores + hyperthreading), I get the following data for about 12000 revisions: threads wall comb wall gain comb overhead none 31.596715 31.59 0.00% 0.00% 1 31.621228 31.62 -0.08% 0.09% 2 16.406202 32.8 48.08% 3.83% 3 11.598334 34.76 63.29% 10.03% 4 9.205421 36.77 70.87% 16.40% 5 8.517604 42.51 73.04% 34.57% 6 7.94645 47.58 74.85% 50.62% 7 7.434972 51.92 76.47% 64.36% 8 7.070638 55.34 77.62% 75.18% Compared to the feature disabled (threads=0), the overhead is negligible with the threading code (threads=1), and the gain is already 48% with two threads.
Wed, 10 Jan 2018 17:24:25 +0100 upgraderepo: select correct deltareuse depending on actions
Paul Morelle <paul.morelle@octobus.net> [Wed, 10 Jan 2018 17:24:25 +0100] rev 35598
upgraderepo: select correct deltareuse depending on actions Only 'redeltafulladd' was taken into account because of a small typo.
Tue, 02 Jan 2018 18:35:11 +0900 revsetlang: add %p specifier to format list of function arguments
Yuya Nishihara <yuya@tcha.org> [Tue, 02 Jan 2018 18:35:11 +0900] rev 35597
revsetlang: add %p specifier to format list of function arguments This will be used to construct parameters passed to _matchfiles().
Tue, 02 Jan 2018 21:05:40 +0900 revsetlang: unnest inner functions from formatspec()
Yuya Nishihara <yuya@tcha.org> [Tue, 02 Jan 2018 21:05:40 +0900] rev 35596
revsetlang: unnest inner functions from formatspec()
Sat, 01 Apr 2017 17:51:56 +0900 revsetlang: fix quoting of %ls string
Yuya Nishihara <yuya@tcha.org> [Sat, 01 Apr 2017 17:51:56 +0900] rev 35595
revsetlang: fix quoting of %ls string Before, "'" wasn't escaped appropriately. This also changes the separator '\0' to '\\0', but that's okay as a string token is unescaped.
Sat, 01 Apr 2017 17:44:07 +0900 revsetlang: catch invalid value passed to formatspec()
Yuya Nishihara <yuya@tcha.org> [Sat, 01 Apr 2017 17:44:07 +0900] rev 35594
revsetlang: catch invalid value passed to formatspec() The scope of AttributeError is narrowed because it's more likely to be triggered by mistake.
Sat, 01 Apr 2017 17:28:28 +0900 revsetlang: check incomplete revspec format character
Yuya Nishihara <yuya@tcha.org> [Sat, 01 Apr 2017 17:28:28 +0900] rev 35593
revsetlang: check incomplete revspec format character
Sat, 01 Apr 2017 17:25:45 +0900 revsetlang: check number of arguments passed to formatspec()
Yuya Nishihara <yuya@tcha.org> [Sat, 01 Apr 2017 17:25:45 +0900] rev 35592
revsetlang: check number of arguments passed to formatspec()
Sat, 01 Apr 2017 17:18:31 +0900 revsetlang: catch invalid format character with %l prefix
Yuya Nishihara <yuya@tcha.org> [Sat, 01 Apr 2017 17:18:31 +0900] rev 35591
revsetlang: catch invalid format character with %l prefix listexp() could call argtype() with an invalid format character, but that wasn't checked before.
Fri, 29 Dec 2017 06:32:17 +0530 py3: add 8 new passing tests to the whitelist
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 29 Dec 2017 06:32:17 +0530] rev 35590
py3: add 8 new passing tests to the whitelist Differential Revision: https://phab.mercurial-scm.org/D1800
Fri, 29 Dec 2017 05:33:36 +0530 py3: use list() to get a list of items using dict.items()
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 29 Dec 2017 05:33:36 +0530] rev 35589
py3: use list() to get a list of items using dict.items() dict.items() on Python 3 returns a generator over the values of the dictionary, hence we can't delete elements while iterating over dict.items() in Python 3. Differential Revision: https://phab.mercurial-scm.org/D1799
Fri, 29 Dec 2017 05:31:27 +0530 py3: convert dict keys' to str before passing as kwargs
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 29 Dec 2017 05:31:27 +0530] rev 35588
py3: convert dict keys' to str before passing as kwargs We have pycompat.strkwargs() which converts the keys of a dict to str and returns that. Differential Revision: https://phab.mercurial-scm.org/D1798
Fri, 29 Dec 2017 05:29:57 +0530 py3: make sure we open the file to write in bytes mode
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 29 Dec 2017 05:29:57 +0530] rev 35587
py3: make sure we open the file to write in bytes mode Differential Revision: https://phab.mercurial-scm.org/D1797
Fri, 29 Dec 2017 05:47:17 +0530 py3: don't use dict.iterkeys()
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 29 Dec 2017 05:47:17 +0530] rev 35586
py3: don't use dict.iterkeys() Instead of iterating of dict.iterkeys(), let's iterate of dict as that will be equivalent and dict.iterkeys() is not present in Python 3. Differential Revision: https://phab.mercurial-scm.org/D1796
Fri, 29 Dec 2017 05:29:04 +0530 py3: use pycompat.bytestr() instead of str()
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 29 Dec 2017 05:29:04 +0530] rev 35585
py3: use pycompat.bytestr() instead of str() Differential Revision: https://phab.mercurial-scm.org/D1795
Fri, 29 Dec 2017 05:28:05 +0530 py3: make regular expressions bytes by prepending b''
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 29 Dec 2017 05:28:05 +0530] rev 35584
py3: make regular expressions bytes by prepending b'' Regexes start with r'' and hence transformer skips adding b'' there. # skip-blame because we are just adding b'' Differential Revision: https://phab.mercurial-scm.org/D1794
Fri, 29 Dec 2017 05:27:00 +0530 py3: slice on bytes instead of indexing
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 29 Dec 2017 05:27:00 +0530] rev 35583
py3: slice on bytes instead of indexing Indexing returns the ascii value on Python 3. Differential Revision: https://phab.mercurial-scm.org/D1793
Fri, 29 Dec 2017 05:25:27 +0530 py3: use node.hex(h.digest()) instead of h.hexdigest()
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 29 Dec 2017 05:25:27 +0530] rev 35582
py3: use node.hex(h.digest()) instead of h.hexdigest() hashlib.sha1.hexdigest() returns str on Python 3. Differential Revision: https://phab.mercurial-scm.org/D1792
Fri, 29 Dec 2017 05:22:06 +0530 tests: make autodiff.py work on Python 3
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 29 Dec 2017 05:22:06 +0530] rev 35581
tests: make autodiff.py work on Python 3 This patch adds b'' to string literal to make it compatible with in-core Python 3 compatibility. # skip-blame because we are just adding b'' Differential Revision: https://phab.mercurial-scm.org/D1791
Fri, 29 Dec 2017 03:32:04 +0530 py3: use pycompat.ziplist instead of inbuilt zip
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 29 Dec 2017 03:32:04 +0530] rev 35580
py3: use pycompat.ziplist instead of inbuilt zip zip just like map on Python 3 returns a generator object instead of list. This results in error if we try to iterate over the result once we consume it. We have added pycompat.ziplist which returns a list. Differential Revision: https://phab.mercurial-scm.org/D1790
Fri, 29 Dec 2017 05:35:57 +0530 py3: use bytes and open() instead of file() in test-diff-upgrade.t
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 29 Dec 2017 05:35:57 +0530] rev 35579
py3: use bytes and open() instead of file() in test-diff-upgrade.t file() is not present in Python 3. Differential Revision: https://phab.mercurial-scm.org/D1789
Wed, 10 Jan 2018 11:02:20 -0800 exchange: use context manager for locks and transaction in unbundle()
Martin von Zweigbergk <martinvonz@google.com> [Wed, 10 Jan 2018 11:02:20 -0800] rev 35578
exchange: use context manager for locks and transaction in unbundle() Note that the transactionmanager doesn't actually create a transaction -- that is done the first time .transaction() is called on it (if at all). Consequently, .close() and .release() won't do anything if no transaction has been created. This makes it a little unusual, but it still works as a context manager. Differential Revision: https://phab.mercurial-scm.org/D1841
Wed, 10 Jan 2018 10:49:12 -0800 bookmarks: use context managers for locks and transaction in pushbookmark()
Martin von Zweigbergk <martinvonz@google.com> [Wed, 10 Jan 2018 10:49:12 -0800] rev 35577
bookmarks: use context managers for locks and transaction in pushbookmark() Differential Revision: https://phab.mercurial-scm.org/D1840
Wed, 10 Jan 2018 10:47:13 -0800 bookmarks: use context managers for lock and transaction in update()
Martin von Zweigbergk <martinvonz@google.com> [Wed, 10 Jan 2018 10:47:13 -0800] rev 35576
bookmarks: use context managers for lock and transaction in update() Differential Revision: https://phab.mercurial-scm.org/D1839
Wed, 10 Jan 2018 10:44:21 -0800 phase: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com> [Wed, 10 Jan 2018 10:44:21 -0800] rev 35575
phase: use context managers for lock and transaction Differential Revision: https://phab.mercurial-scm.org/D1838
Wed, 10 Jan 2018 10:33:11 -0800 obsolete: use context manager for transaction in pushmarker()
Martin von Zweigbergk <martinvonz@google.com> [Wed, 10 Jan 2018 10:33:11 -0800] rev 35574
obsolete: use context manager for transaction in pushmarker() Differential Revision: https://phab.mercurial-scm.org/D1837
Wed, 10 Jan 2018 10:32:16 -0800 obsolete: use context manager for lock in pushmarker()
Martin von Zweigbergk <martinvonz@google.com> [Wed, 10 Jan 2018 10:32:16 -0800] rev 35573
obsolete: use context manager for lock in pushmarker() Differential Revision: https://phab.mercurial-scm.org/D1836
Wed, 10 Jan 2018 10:30:51 -0800 obsolete: use context manager for transaction in createmarkers()
Martin von Zweigbergk <martinvonz@google.com> [Wed, 10 Jan 2018 10:30:51 -0800] rev 35572
obsolete: use context manager for transaction in createmarkers() Differential Revision: https://phab.mercurial-scm.org/D1835
Fri, 05 Jan 2018 09:12:08 +0100 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net> [Fri, 05 Jan 2018 09:12:08 +0100] rev 35571
visibility: improve the message when accessing filtered obsolete rev When trying to access filtered revision, it is likely because they have been obsoleted by an obs-marker. The current message shows how to access the revision anyway: abort: hidden revision '13bedc178fce'! But in the case of an obsoleted revision, the user is likely to want to update to or use the successor of the revision. We update the message to display more information about the obsolescence fate of the revision in the following cases: abort: hidden revision '13bedc178fce' is pruned! abort: hidden revision '13bedc178fce' has diverged! abort: hidden revision '13bedc178fce' was rewritten as X, Y and 2 more! Differential Revision: https://phab.mercurial-scm.org/D1591
Fri, 29 Dec 2017 03:37:36 +0530 tests: add b'' to string literals where bytes are required
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 29 Dec 2017 03:37:36 +0530] rev 35570
tests: add b'' to string literals where bytes are required Since we are internally dealing with bytes only, we need to use bytes in the tests too. This is one of the many patches which will make all the tests completely use bytes. # skip-blame because we are just adding b'' Differential Revision: https://phab.mercurial-scm.org/D1788
Wed, 10 Jan 2018 08:53:22 -0800 rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 10 Jan 2018 08:53:22 -0800] rev 35569
rust: implementation of `hg` This commit provides a mostly-working implementation of the `hg` script in Rust along with scaffolding to support Rust in the repository. If you are familiar with Rust, the contents of the added rust/ directory should be pretty straightforward. We create an "hgcli" package that implements a binary application to run Mercurial. The output of this package is an "hg" binary. Our Rust `hg` (henceforth "rhg") essentially is a port of the existing `hg` Python script. The main difference is the creation of the embedded CPython interpreter is handled by the binary itself instead of relying on the shebang. In that sense, rhg is more similar to the "exe wrapper" we currently use on Windows. However, unlike the exe wrapper, rhg does not call the `hg` Python script. Instead, it uses the CPython APIs to import mercurial modules and call appropriate functions. The amount of code here is surprisingly small. It is my intent to replace the existing C-based exe wrapper with rhg. Preferably in the next Mercurial release. This should be achievable - at least for some Mercurial distributions. The future/timeline for rhg on other platforms is less clear. We already ship a hg.exe on Windows. So if we get the quirks with Rust worked out, shipping a Rust-based hg.exe should hopefully not be too contentious. Now onto the implementation. We're using python27-sys and the cpython crates for talking to the CPython API. We currently don't use too much functionality of the cpython crate and could have probably cut it out. However, it does provide a reasonable abstraction over unsafe {} CPython function calls. While we still have our fair share of those, at least we're not dealing with too much refcounting, error checking, etc. So I think the use of the cpython crate is justified. Plus, there is not-yet-implemented functionality that could benefit from cpython. I see our use of this crate only increasing. The cpython and python27-sys crates are not without their issues. The cpython crate didn't seem to account for the embedding use case in its design. Instead, it seems to assume that you are building a Python extension. It is making some questionable decisions around certain CPython APIs. For example, it insists that PyEval_ThreadsInitialized() is called and that the Python code likely isn't the main thread in the underlying application. It is also missing some functionality that is important for embedded use cases (such as exporting the path to the Python interpreter from its build script). After spending several hours trying to wrangle python27-sys and cpython, I gave up and forked the project on GitHub. Our Cargo.toml tracks this fork. I'm optimistic that the upstream project will accept our contributions and we can eventually unfork. There is a non-trivial amount of code in our custom Cargo build script. Our build.rs (which is called as part of building the hgcli crate): * Validates that the Python interpreter that was detected by the python27-sys crate provides a shared library (we only support shared library linking at this time - although this restriction could be loosened). * Validates that the Python is built with UCS-4 support. This ensures maximum Unicode compatibility. * Exports variables to the crate build allowing the built crate to e.g. find the path to the Python interpreter. The produced rhg should be considered alpha quality. There are several known deficiencies. Many of these are documented with inline TODOs. Probably the biggest limitation of rhg is that it assumes it is running from the ./rust/target/<target> directory of a source distribution. So, rhg is currently not very practical for real-world use. But, if you can `cargo build` it, running the binary *should* yield a working Mercurial CLI. In order to support using rhg with the test harness, we needed to hack up run-tests.py so the path to Mercurial's Python files is set properly. The change is extremely hacky and is only intended to be a stop-gap until the test harness gains first-class support for installing rhg. This will likely occur after we support running rhg outside the source directory. Despite its officially alpha quality, rhg copes extremely well with the test harness (at least on Linux). Using `run-tests.py --with-hg ../rust/target/debug/hg`, I only encounter the following failures: * test-run-tests.t -- Warnings emitted about using an unexpected Mercurial library. This is due to the hacky nature of setting the Python directory when run-tests.py detected rhg. * test-devel-warnings.t -- Expected stack trace missing frame for `hg` (This is expected since we no longer have an `hg` script!) * test-convert.t -- Test running `$PYTHON "$BINDIR"/hg`, which obviously assumes `hg` is a Python script. * test-merge-tools.t -- Same assumption about `hg` being executable with Python. * test-http-bad-server.t -- Seeing exit code 255 instead of 1 around line 358. * test-blackbox.t -- Exit code 255 instead of 1. * test-basic.t -- Exit code 255 instead of 1. It certainly looks like we have a bug around exit code handling. I don't think it is severe enough to hold up review and landing of this initial implementation. Perfect is the enemy of good. Differential Revision: https://phab.mercurial-scm.org/D1581
Sun, 07 Jan 2018 15:21:16 -0500 lfs: improve the error message for a missing remote blob
Matt Harbison <matt_harbison@yahoo.com> [Sun, 07 Jan 2018 15:21:16 -0500] rev 35568
lfs: improve the error message for a missing remote blob It seems better to print the name known to the user, not the internal file. The previous code unconditionally set 'p.filename'. That potentially made the attribute None, and would be printed as such in _gitlfsremote._checkforservererror() instead of "unknown". Normally, files are printed relative to CWD, but I don't see a way to get the repo path to make that adjustment. The test modified here apparently only runs within Facebook, but a print statement confirmed the name change. I tried uploading the blob to a different remote store (so the git server never saw it), and also killing the git server and removing the blob directory, and removing the 'lfs.db' file. All resulted in a message: abort: LFS server claims required objects do not exist: bdc26931acfb734b142a8d675f205becf27560dc461f501822de13274fe6fc8a! So I have no idea how to make this test generally runnable.
Sun, 07 Jan 2018 15:01:59 -0500 filelog: add the ability to report the user facing name
Matt Harbison <matt_harbison@yahoo.com> [Sun, 07 Jan 2018 15:01:59 -0500] rev 35567
filelog: add the ability to report the user facing name This will be used by lfs, but is probably generally useful. There are various bits of code that reverse engineer this from the index or data file names, but it seems better to just store it. Especially if there's experimenting with backing storage other than revlog.
Tue, 19 Dec 2017 20:41:25 +0800 hgweb: make different kinds of commits look differently on /graph
Anton Shestakov <av6@dwimlabs.net> [Tue, 19 Dec 2017 20:41:25 +0800] rev 35566
hgweb: make different kinds of commits look differently on /graph Regular hg log -G uses different symbols for some graph nodes, such as commits that close branches and hidden commits. It also marks the currently checked out commit with "@". Since hg serve is sometimes used/recommended as a more visual alternative to CLI, it makes sense to port these features to hgweb. "graphnode" includes the style of a particular node and also if it's currently checked out or not, both at the same time. This is different from hg log -G (which uses templatekw.showgraphnode), where there's only place for one character, but hgweb doesn't have this limitation, since it uses <canvas> and not plain text. I'm using one string of 1 or 2 characters in this patch, it's not the most self-explanatory format, but it's concise, uses the same characters as hg log -G, and is internal to hgweb (i.e. not used for json-graph). I'm more or less fine with how things look visually, but there's still room for improvement. Feel free to criticise or point me to good-looking graphs of this kind for inspiration.
Thu, 21 Dec 2017 13:58:11 +0100 clonebundle: make it possible to retrieve the initial bundle through largefile
Boris Feld <boris.feld@octobus.net> [Thu, 21 Dec 2017 13:58:11 +0100] rev 35565
clonebundle: make it possible to retrieve the initial bundle through largefile By setting the default path early enough, we make it possible to retrieve a clone bundle as a largefile from the repository we are cloning. But... why? Clone bundle is a great feature to speeds up clone of large repository. However one of the main obstacle for clone bundle deployment is the authentication scheme. For non public project, just putting a static file on some random CDN is not an option as we have to make sure people have the proper permission to retrieves the bundle. On the other hand, 'largefiles' already have all the necessary logic to serve arbitrary binary files -after- an authentication checks. So reusing an existing large file infrastructure can be a significant shortcut to clone bundle in this kind of closed environment. The idea might seems strange, but the necessary update to the large file extensions are quite small while the benefits are huge. In addition, since all the extra logic live in the 'largefiles' extensions, core does not have to know anything about it.
Thu, 21 Dec 2017 13:57:57 +0100 largefiles: add support for 'largefiles://' url scheme
Boris Feld <boris.feld@octobus.net> [Thu, 21 Dec 2017 13:57:57 +0100] rev 35564
largefiles: add support for 'largefiles://' url scheme This changesets allows Mercurial to transparently download content from the configured largefile store. This handle all authentication and largefile protocol details. The target usecase is to leverage largefile infrastructure for clone bundle. See next changeset for details
Thu, 21 Dec 2017 13:53:26 +0100 largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net> [Thu, 21 Dec 2017 13:53:26 +0100] rev 35563
largefiles: add a 'debuglfput' command to put largefile into the store We add a new debug command able to add arbitrary new files into the largefile store. This will be useful for debugging, testing and other unholy usecase.
Fri, 15 Dec 2017 09:30:16 +0100 debug: add a 'debugdownload' command
Boris Feld <boris.feld@octobus.net> [Fri, 15 Dec 2017 09:30:16 +0100] rev 35562
debug: add a 'debugdownload' command This command resolve and fetch and URL through the Mercurial logic. Mercurial logic add various headers (including authentication) while resolving an URL so the commands helps with building the same request Mercurial would be doing. A new test file is created because we'll add more logic regarding Mercurial download logic and it will grow to a reasonable size.
Sat, 01 Apr 2017 17:12:48 +0900 revsetlang: raise ParseError to report invalid format character
Yuya Nishihara <yuya@tcha.org> [Sat, 01 Apr 2017 17:12:48 +0900] rev 35561
revsetlang: raise ParseError to report invalid format character It's more common in revset and templater than raising Abort. I have a couple more patches to address exceptions caused by bad format string passed to revset() template function.
Sat, 01 Apr 2017 17:04:49 +0900 revsetlang: use iterator to track current argument in formatspec()
Yuya Nishihara <yuya@tcha.org> [Sat, 01 Apr 2017 17:04:49 +0900] rev 35560
revsetlang: use iterator to track current argument in formatspec()
Sat, 01 Apr 2017 16:56:47 +0900 revsetlang: unnest "if True" in formatrevspec()
Yuya Nishihara <yuya@tcha.org> [Sat, 01 Apr 2017 16:56:47 +0900] rev 35559
revsetlang: unnest "if True" in formatrevspec()
Sat, 01 Apr 2017 16:55:28 +0900 revsetlang: use str.find() to scan expr in formatspec()
Yuya Nishihara <yuya@tcha.org> [Sat, 01 Apr 2017 16:55:28 +0900] rev 35558
revsetlang: use str.find() to scan expr in formatspec() There should be no need to walk character one by one in Python.
Sat, 01 Apr 2017 16:50:11 +0900 revsetlang: avoid string concatenation in formatspec()
Yuya Nishihara <yuya@tcha.org> [Sat, 01 Apr 2017 16:50:11 +0900] rev 35557
revsetlang: avoid string concatenation in formatspec()
Thu, 04 Jan 2018 12:30:55 +0900 test-glog: hook cmdutil.getlogrevs() so -frREV is rewritten accordingly
Yuya Nishihara <yuya@tcha.org> [Thu, 04 Jan 2018 12:30:55 +0900] rev 35556
test-glog: hook cmdutil.getlogrevs() so -frREV is rewritten accordingly Before, these tests didn't match the real behavior of "log -frREV".
Wed, 03 Jan 2018 17:12:30 +0900 test-glog: dump computed set
Yuya Nishihara <yuya@tcha.org> [Wed, 03 Jan 2018 17:12:30 +0900] rev 35555
test-glog: dump computed set It's more important than the revset expression built from command options.
Wed, 03 Jan 2018 17:09:16 +0900 test-glog: drop uninteresting nodes from AST output
Yuya Nishihara <yuya@tcha.org> [Wed, 03 Jan 2018 17:09:16 +0900] rev 35554
test-glog: drop uninteresting nodes from AST output This makes future test changes more readable.
Sun, 07 Jan 2018 01:14:52 -0500 lfs: remove the verification option when writing to the local store
Matt Harbison <matt_harbison@yahoo.com> [Sun, 07 Jan 2018 01:14:52 -0500] rev 35553
lfs: remove the verification option when writing to the local store This partially reverts 417e8e040102 and bb6a80fc969a. But since there's now a dedicated download function, there's no functional change. The last sentence in the commit message of the latter is wrong- write() didn't need the one time hash check if verification wasn't requested. I suspect I missed 'read()' in there ("... but _read()_ also needs to do a one time check..."), because that did fail without the hash check before linking to the usercache. The write() method simply took the same check for consistency. While here, clarify that the write() method is *only* for storing content directly from filelog, which has already checked the hash. If someone can come up with a way to bridge the differences between writing to a file and sending a urlreq.request across the wire, we can create an upload() function and cleanup read() in a similar way. About the only common thread I see is an open() that verifies the content before returning a file descriptor.
Thu, 21 Dec 2017 21:20:00 -0500 lfs: use the localstore download method to transfer from remote stores
Matt Harbison <matt_harbison@yahoo.com> [Thu, 21 Dec 2017 21:20:00 -0500] rev 35552
lfs: use the localstore download method to transfer from remote stores Both gitlfsremote and file based remotes benefit from not requiring the whole file in memory (though the whole file is still loaded when passing through the revlog interface). With a method specific to downloading from a remote store, the misleading 'use hg verify' hint is removed. The behavior is otherwise unchanged, in that a download from both remote store types will yield a copy of the blob via util.atomictempfile. There's no response payload defined for the non 'download' actions, but the previous code attempted to read the payload in this case anyway. This refactored code made that more obvious, so any payload is printed as a debug message, just in case.
Thu, 21 Dec 2017 18:56:04 -0500 lfs: introduce a localstore method for downloading from remote stores
Matt Harbison <matt_harbison@yahoo.com> [Thu, 21 Dec 2017 18:56:04 -0500] rev 35551
lfs: introduce a localstore method for downloading from remote stores The current local.write() method requires the full data, which means concatenating file chunks in memory when downloading from a git server. The dedicated method downloads in chunks, verifies the content on the fly, and creates the usercache hardlink if successful. It can also be used for the file system based remotestore. An explicit division of labor between downloading from a remote store (which should be verified) and writing to the store because of a commit or similar (which doesn't need verification), seems clearer. I can't figure out how to make a similar function for upload, because for a file remote store, it's a simple open/read/write operation. For a gitremote store, it's open the file and a urlreq.request(), and process that.
Tue, 02 Jan 2018 12:14:08 +0900 win32: do not call GetVolumePathName() with the minimum buffer length
Yuya Nishihara <yuya@tcha.org> [Tue, 02 Jan 2018 12:14:08 +0900] rev 35550
win32: do not call GetVolumePathName() with the minimum buffer length It fails on Windows XP even though the doc says "a safer but slower way to set the size of the return buffer is to call the GetFullPathName function, and then make sure that the buffer size is at least the same size as the full path that GetFullPathName returns." https://msdn.microsoft.com/en-us/library/windows/desktop/aa364996(v=vs.85).aspx Well, more "safe" way would be to simply rely on MAX_PATH for common scenarios.
Tue, 02 Jan 2018 12:02:25 +0900 win32: allocate buffer of maximum length for GetVolumeInformation()
Yuya Nishihara <yuya@tcha.org> [Tue, 02 Jan 2018 12:02:25 +0900] rev 35549
win32: allocate buffer of maximum length for GetVolumeInformation() It's documented that "the maximum buffer size is MAX_PATH+1", which is slightly larger than 256. https://msdn.microsoft.com/en-us/library/windows/desktop/aa364993(v=vs.85).aspx
Sun, 22 Oct 2017 22:49:11 +0900 log: drop unused expr from return value of getlogrevs()
Yuya Nishihara <yuya@tcha.org> [Sun, 22 Oct 2017 22:49:11 +0900] rev 35548
log: drop unused expr from return value of getlogrevs() Future patches will move some processing of the --follow option out of _makelogrevset(), where the returned 'expr' value will be less consistent with the 'revs'. So let's remove it from the public interface.
Thu, 04 Jan 2018 12:00:18 +0900 log: don't expand aliases in revset built from command options
Yuya Nishihara <yuya@tcha.org> [Thu, 04 Jan 2018 12:00:18 +0900] rev 35547
log: don't expand aliases in revset built from command options Only -rREV should be rewritten with user aliases.
Sun, 22 Oct 2017 22:52:36 +0900 graphlog: remove redundant check for empty revs
Yuya Nishihara <yuya@tcha.org> [Sun, 22 Oct 2017 22:52:36 +0900] rev 35546
graphlog: remove redundant check for empty revs
Sun, 22 Oct 2017 22:38:16 +0900 log: remove redundant handling of --limit
Yuya Nishihara <yuya@tcha.org> [Sun, 22 Oct 2017 22:38:16 +0900] rev 35545
log: remove redundant handling of --limit A returned 'revs' set is pre-filtered by cmdutil.getlogrevs(). The result of displayer.flush() isn't used anymore, so removed.
Sun, 22 Oct 2017 23:04:07 +0900 log: use smartset.slice() to limit number of revisions to be displayed
Yuya Nishihara <yuya@tcha.org> [Sun, 22 Oct 2017 23:04:07 +0900] rev 35544
log: use smartset.slice() to limit number of revisions to be displayed
Thu, 04 Jan 2018 10:51:41 +0900 log: merge getlogrevs() and getgraphlogrevs()
Yuya Nishihara <yuya@tcha.org> [Thu, 04 Jan 2018 10:51:41 +0900] rev 35543
log: merge getlogrevs() and getgraphlogrevs() cmdutil.graphlog() is updated to receive (revs, filematcher) as arguments to make sure that opts['graph'] is set when getlogrevs() is invoked.
(0) -30000 -10000 -3000 -1000 -120 +120 +1000 +3000 +10000 tip