Sat, 23 Dec 2017 17:49:12 -0500 lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com> [Sat, 23 Dec 2017 17:49:12 -0500] rev 35510
lfs: show a friendly message when pushing lfs to a server without lfs enabled Upfront disclaimer: I don't know anything about the wire protocol, and this was pretty much cargo-culted from largefiles, and then clonebundles, since it seems more modern. I was surprised that exchange.push() will ensure all of the proper requirements when exchanging between two local repos, but doesn't care when one is remote. All this new capability marker does is inform the client that the extension is enabled remotely. It may or may not contain commits with external blobs. Open issues: - largefiles uses 'largefiles=serve' for its capability. Someday I hope to be able to push lfs blobs to an `hg serve` instance. That will probably require a distinct capability. Should it change to '=serve' then? Or just add an 'lfs-serve' capability then? - The flip side of this is more complicated. It looks like largefiles adds an 'lheads' command for the client to signal to the server that the extension is loaded. That is then converted to 'heads' and sent through the normal wire protocol plumbing. A client using the 'heads' command directly is kicked out with a message indicating that the largefiles extension must be loaded. We could do similar with 'lfsheads', but then a repo with both largefiles and lfs blobs can't be pushed over the wire. Hopefully somebody with more wire protocol experience can think of something else. I see 'x-hgarg-1' on some commands in the tests, but not on heads, and didn't dig any further.
Sun, 24 Dec 2017 01:26:36 -0500 lfs: allow non-lfs exchanges when the extension is only enabled on one side
Matt Harbison <matt_harbison@yahoo.com> [Sun, 24 Dec 2017 01:26:36 -0500] rev 35509
lfs: allow non-lfs exchanges when the extension is only enabled on one side Once the 'lfs' requirement is added, the extension must be loaded on both sides, and changegroup3 used. But there's no reason that I can see for bailing with cryptic errors if lfs is not required, but randomly enabled somewhere.
Sat, 23 Dec 2017 23:51:40 -0500 lfs: add the 'lfs' requirement in the changegroup transaction introducing lfs
Matt Harbison <matt_harbison@yahoo.com> [Sat, 23 Dec 2017 23:51:40 -0500] rev 35508
lfs: add the 'lfs' requirement in the changegroup transaction introducing lfs A hook like this is how largefiles manages to do the same. Largefiles uses a changegroup hook, but this uses pretxnchangegroup because that actually causes the transaction to rollback in the unlikely event that writing the requirements out fails. Sadly, the requires file itself isn't rolled back if a subsequent hook fails, but that seems trivial. Now that commit, changegroup and convert are covered, I don't think there's any way to get an lfs repo without the requirement. The grep exit code is blotted out of some test-lfs-serve.t tests now showing the requirement, because run-tests.py doesn't support conditionalizing the exit code.
Sat, 23 Dec 2017 15:07:24 -0500 test-lfs: add tests covering http exchanges
Matt Harbison <matt_harbison@yahoo.com> [Sat, 23 Dec 2017 15:07:24 -0500] rev 35507
test-lfs: add tests covering http exchanges This tries to test every combination of having the extension enabled/disabled on each side, and then push/pull/clone/identify lfs and non-lfs content. SSH is ignored here, because there's enough going on as it is. The root issue here is again that requirements are not exchanged and preserved on push/pull/clone. Doing so should eliminate the cryptic error messages when using `hg serve`. The 500 server error is triggered by "ValueError: no common changegroup version", because the extension forces changegroup3. Or, if changegroup3 is enabled manually, it is triggered by "abort: missing processor for flag '0x2000'!". Sadly, run-tests.py doesn't support conditionalizing the exit code like it does lines of output. Therefore, a couple of tests blot out the exit code by appending "|| true", since these failures will go away shortly anyway.
Fri, 22 Dec 2017 14:53:54 -0500 test-lfs: add tests covering local exchanges
Matt Harbison <matt_harbison@yahoo.com> [Fri, 22 Dec 2017 14:53:54 -0500] rev 35506
test-lfs: add tests covering local exchanges The root issue here is that requirements are not exchanged and preserved on push/pull. This can be handled with a changegroup hook. Testing for remote exchanges is much more extensive (it's possible for one process or the other to not have the extension loaded at all), so it is added separately.
Wed, 27 Dec 2017 11:08:32 -0700 smartset: split generatorset classes to avoid cycle
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 27 Dec 2017 11:08:32 -0700] rev 35505
smartset: split generatorset classes to avoid cycle I uncovered a cycle manifesting in a memory leak by running `hgperfrevset '::tip'`. The cycle was due to generatorset.__init__ assigning a bound method to self.__contains__. Internet sleuthing revealed that assigning a bound method to an instance attribute always creates a cycle. This commit creates two new variants of generatorset for the special cases of ascending and descending generators. The special implementations of __contains__ have been extracted to these classes where they are defined as __contains__. generatorset now implements __new__ and changes the spawned type to one of the new classes if needed. Differential Revision: https://phab.mercurial-scm.org/D1780
Wed, 27 Dec 2017 13:53:21 -0600 merge: raise before running mergedriver if using IMM
Phil Cohen <phillco@fb.com> [Wed, 27 Dec 2017 13:53:21 -0600] rev 35504
merge: raise before running mergedriver if using IMM Merge driver scripts run in the working copy, so disable with IMM for now. Differential Revision: https://phab.mercurial-scm.org/D1781
Tue, 26 Dec 2017 22:56:07 +0530 scmutil: use a tuple of possible values instead of using startswith()
Pulkit Goyal <7895pulkit@gmail.com> [Tue, 26 Dec 2017 22:56:07 +0530] rev 35503
scmutil: use a tuple of possible values instead of using startswith() This patch also adds a review comment which is helpful as inline comment. Differential Revision: https://phab.mercurial-scm.org/D1761
Mon, 25 Dec 2017 22:56:59 +0900 show: use revlog function to compute length of the longest shortest node
Yuya Nishihara <yuya@tcha.org> [Mon, 25 Dec 2017 22:56:59 +0900] rev 35502
show: use revlog function to compute length of the longest shortest node As the core part of shortest() was extracted at 448725a2ef73, we no logner need a templater.
Tue, 19 Dec 2017 11:20:35 +0530 commands: use the new API to access hidden changesets in various commands
Pulkit Goyal <7895pulkit@gmail.com> [Tue, 19 Dec 2017 11:20:35 +0530] rev 35501
commands: use the new API to access hidden changesets in various commands In previous patches, we have added an internal API to unhide hidden changesets. This patch makes the following command use that api in nowarn mode i.e. there will be no warning while accessing hidden changesets. cat, diff, export, files, heads, identify, log, manifest, parents, status This patch also adds test demonstarting the behaviour. .. feature:: Accessing hidden changesets Set config option 'experimental.directaccess = True' to access hidden changesets from read only commands. Differential Revision: https://phab.mercurial-scm.org/D1735
Fri, 15 Dec 2017 04:31:29 +0530 scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 15 Dec 2017 04:31:29 +0530] rev 35500
scmutil: add utility fn to return repo object with user passed revs unhidden There has been a need for accessing hidden changesets by default without passing --hidden. This is currently done using the directaccess extension but is bit hacky. This patch adds a utility function to return a repo object having user passed revisions unhidden. This functionality will live behind a config option and won't be the default behaviour. There is also a config option added by this patch which tells whether we want to unhide only those revisions whose hashes are passed or should we consider revisions numbers also. Differential Revision: https://phab.mercurial-scm.org/D1733
Mon, 18 Dec 2017 17:50:02 +0530 repoview: add a new filtername for accessing hidden commits
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 18 Dec 2017 17:50:02 +0530] rev 35499
repoview: add a new filtername for accessing hidden commits This patch adds a new filter 'visible-hidden' for repository and will be used to return a repo object with user passed revisions unhidden. Unlike the directaccess extension in fb-hgext and previous series adding the functionality, this time we introduce only one new filter as whether to warn user or not is handled by scmutil.unhidehashlikerevs(). Differential Revision: https://phab.mercurial-scm.org/D1734
Fri, 15 Dec 2017 04:25:32 +0530 revsetlang: add utility function to return hash like symbols from the tree
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 15 Dec 2017 04:25:32 +0530] rev 35498
revsetlang: add utility function to return hash like symbols from the tree Functionalities like unhiding changesets whose rev/hash is passed by the user required the knowledge of rev/hashes in the user provided specs. This patch adds functions which can parse tree object and return a list of such values. Differential Revision: https://phab.mercurial-scm.org/D1732
Fri, 22 Dec 2017 22:19:42 +0530 repoview: add visibilityexception argument to filterrevs() and related fns
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 22 Dec 2017 22:19:42 +0530] rev 35497
repoview: add visibilityexception argument to filterrevs() and related fns After this patch, filterrevs() can take an optional argument visibilityexceptions which is a set of revs which should be exception to being hidden. The visibilityexceptions will be passed to the function computing hidden revisions for that filtername and are considered there while calculating the set of hidden revs. Differential Revision: https://phab.mercurial-scm.org/D1747
Fri, 22 Dec 2017 17:57:11 +0530 repoview: add visibilityexceptions as an optional argument to repo.filtered()
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 22 Dec 2017 17:57:11 +0530] rev 35496
repoview: add visibilityexceptions as an optional argument to repo.filtered() This will help us in having an API where we can pass the filtername and the visibilityexceptions to get a new repo object. Visibility exceptions are the revs which must be visible even they should in theory belong to the hidden set. They are required as there has been desire to have a functionality to access hidden changesets using certain commands without passing --hidden. After this patch we can make those changesets visibility exceptions so that we can access them without requiring a unfiltered repo. Differential Revision: https://phab.mercurial-scm.org/D1746
Sun, 24 Dec 2017 11:46:13 -0700 streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 24 Dec 2017 11:46:13 -0700] rev 35495
streamclone: move wire protocol status code from wireproto command This consolidates the code for the streaming clone wire protocol format into streamclone.py. It also eliminates a generator wrapper, which might make streaming clones slightly faster. Differential Revision: https://phab.mercurial-scm.org/D1754
Fri, 22 Dec 2017 15:25:34 -0600 histedit: add ui.log for action count
Phil Cohen <phillco@fb.com> [Fri, 22 Dec 2017 15:25:34 -0600] rev 35494
histedit: add ui.log for action count Differential Revision: https://phab.mercurial-scm.org/D1751
Fri, 22 Dec 2017 17:04:08 -0700 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 22 Dec 2017 17:04:08 -0700] rev 35493
run-tests: extract sorting of tests to own function TestRunner._run() is a large function and is difficult to follow. Let's extract the test sorting to its own function to make it shorter. When I refactored run-tests.py several years ago, I put a lot of functionality in methods. The prevailing Mercurial style is to use functions - not classes - where possible. While refactoring the code, I decided to undo this historical mistake of mine by moving the code to a standalone function. Differential Revision: https://phab.mercurial-scm.org/D1750
Fri, 22 Dec 2017 12:22:43 -0700 run-tests: remove dead code related to temp directory
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 22 Dec 2017 12:22:43 -0700] rev 35492
run-tests: remove dead code related to temp directory Differential Revision: https://phab.mercurial-scm.org/D1749
Fri, 22 Dec 2017 13:13:45 -0600 rebase: switch ui.log calls to common style
Phil Cohen <phillco@fb.com> [Fri, 22 Dec 2017 13:13:45 -0600] rev 35491
rebase: switch ui.log calls to common style The old style raised errors in some cases. Differential Revision: https://phab.mercurial-scm.org/D1748
Fri, 22 Dec 2017 21:25:46 +0800 hgweb: link to successors of obsoleted changesets
Anton Shestakov <av6@dwimlabs.net> [Fri, 22 Dec 2017 21:25:46 +0800] rev 35490
hgweb: link to successors of obsoleted changesets _siblings() prepare various useful properties to use in templates. This function usually prepares parents and children of changesets for use in hgweb templates, but it can be used for successors too. It's needed because item['successors'] is a _hybrid object that works well when used in regular templates, but in hgweb templates work slightly differently and can't get hex nodes of the successors, which are required for these links to work.
Tue, 21 Nov 2017 17:03:41 +0800 hgweb: display fate of obsolete changesets
Anton Shestakov <av6@dwimlabs.net> [Tue, 21 Nov 2017 17:03:41 +0800] rev 35489
hgweb: display fate of obsolete changesets Operations that obsolete changesets store enough metadata to explain what happened after the fact. One way to get that metadata is showsuccsandmarkers function, which returns a list of successors of a particular changeset and appropriate obsolescence markers. Templates have a set of experimental functions that have names starting with obsfate. This patch uses some of these functions to interpret output of succsandmarkers() and produce human-friendly messages that describe what happened to an obsolete changeset, e.g. "pruned" or "rewritten as 6:3de5eca88c00". In commonentry(), succsandmarkers property is made callable so it's only executed on demand; this saves time when changeset is not obsolete, and also in e.g. /shortlog view, where there are a lot of changesets, but we don't need to show each and every one in detail. In spartan theme, succsandmarkers is used instead of the simple "obsolete: yes", in other themes a new line is added to /rev page.
Sat, 16 Dec 2017 18:58:02 -0500 test-ssh: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com> [Sat, 16 Dec 2017 18:58:02 -0500] rev 35488
test-ssh: stabilize for Windows Previously, this complained: remote: '.' is not recognized as an internal or external command, remote: operable program or batch file. Making this a python script apparently revealed some races[1]. Thanks to Yuya for suggesting this. [1] https://www.mercurial-scm.org/pipermail/mercurial-devel/2017-December/109094.html
Fri, 22 Dec 2017 21:19:29 +0900 templater: register keywords to defaults table
Yuya Nishihara <yuya@tcha.org> [Fri, 22 Dec 2017 21:19:29 +0900] rev 35487
templater: register keywords to defaults table Since the keywords are permanent, there should be no need to pass them by a temporary mapping.
Fri, 22 Dec 2017 21:22:49 +0900 templater: drop unneeded resources from conflict-marker data
Yuya Nishihara <yuya@tcha.org> [Fri, 22 Dec 2017 21:22:49 +0900] rev 35486
templater: drop unneeded resources from conflict-marker data Follow-up for 32c278eb876f and f1c54d003327.
Fri, 22 Dec 2017 21:12:17 +0900 templater: rewrite docstring of templater.__init__()
Yuya Nishihara <yuya@tcha.org> [Fri, 22 Dec 2017 21:12:17 +0900] rev 35485
templater: rewrite docstring of templater.__init__() More importantly, this patch adds what the cache is.
Fri, 22 Dec 2017 00:44:36 -0600 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com> [Fri, 22 Dec 2017 00:44:36 -0600] rev 35484
rebase: don't take out a dirstate guard for in-memory rebase Since IMM doesn't affect the dirstate, it's not needed, and might be faster. Differential Revision: https://phab.mercurial-scm.org/D1745
Fri, 22 Dec 2017 02:38:08 -0500 test-split: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com> [Fri, 22 Dec 2017 02:38:08 -0500] rev 35483
test-split: stabilize for Windows - $PYTHON needs to be quoted when used as an executable in $HGEDITOR. This avoids the error "'c' is not recognized as an internal or external command". - seq.py is printing out CRLF, and then the subsequent `sed` script seems to convert to LF on MSYS. IDK if python print statements can be made to print LF on Windows, and I'm pretty sure CRLF is baked into some other tests. - A stray glob was causing the 'obsstore-off' case to report 'no result code from test'. - When I ran with --debug, the `hg diff` commands in the test both printed color sequences, and paused the output as it was run through the pager.
Thu, 21 Dec 2017 23:31:46 -0500 lfs: use ui.note() and ui.debug() instead of ui.write() and their flags
Matt Harbison <matt_harbison@yahoo.com> [Thu, 21 Dec 2017 23:31:46 -0500] rev 35482
lfs: use ui.note() and ui.debug() instead of ui.write() and their flags Even though the upload/download message is still in a ui.verbose check, I switched that to ui.note() too so that the 'ui.note' label is applied. The debug message is no longer marked for translation because check-code complained.
Thu, 21 Dec 2017 14:13:39 -0500 lfs: only hardlink between the usercache and local store if the blob verifies
Matt Harbison <matt_harbison@yahoo.com> [Thu, 21 Dec 2017 14:13:39 -0500] rev 35481
lfs: only hardlink between the usercache and local store if the blob verifies This fixes the issue where verify (and other read commands) would propagate corrupt blobs. I originalled coded this to only hardlink if 'verify=True' for store.read(), but then good blobs weren't being linked, and this broke a bunch of tests. (The blob in repo5 that is being corrupted seems to be linked into repo5 in the loop running dumpflog.py prior to it being corrupted, but only if verify=False is handled too.) It's probably better to do a one time extra verification in order to create these files, so that the repo can be copied to a removable drive. Adding the same check to store.write() was only for completeness, but also needs to do a one time extra verification to avoid breaking tests.
(0) -30000 -10000 -3000 -1000 -300 -100 -50 -30 +30 +50 +100 +300 +1000 +3000 +10000 tip