Fri, 10 Apr 2015 00:36:42 +0900 subrepo: inline reporelpath into abstractsubrepo._relpath to centralize logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 10 Apr 2015 00:36:42 +0900] rev 24674
subrepo: inline reporelpath into abstractsubrepo._relpath to centralize logic "reporelpath()" is referred only from "abstractsubrepo._relpath()".
Fri, 10 Apr 2015 00:36:42 +0900 subrepo: add _relpath field to centralize subrelpath logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 10 Apr 2015 00:36:42 +0900] rev 24673
subrepo: add _relpath field to centralize subrelpath logic This patch adds propertycache-ed "_relpath" field to "abstractsubrepo", to centralize "subrelpath" logic into it. Now, "subrelpath()" can always return "_relpath" field of the specified subrepo object, because it is ensured that subrepo object has it. To reduce changes in this patch, "subrelpath()" itself is still kept, even though it seems to be redundant. This is also a part of eliminating "os.path.*" API invocations for "Windows UTF-8 Plan".
Fri, 10 Apr 2015 00:36:42 +0900 subrepo: add wvfs field to access the working directory via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 10 Apr 2015 00:36:42 +0900] rev 24672
subrepo: add wvfs field to access the working directory via vfs This patch doesn't create vfs object in "abstractsubrepo.__init__()" but adds propertycache-ed "wvfs" field, because the latter can: - delay vfs instantiation until it is actually needed - allow to use "hgsubrepo._repo.wvfs" as "wvfs" "hgsubrepo._repo" is initialized after "abstractsubrepo.__init__()" invocation, and passing "hgsubrepo._repo.wvfs" to "abstractsubrepo.__init__()" is difficult.
Fri, 10 Apr 2015 00:36:42 +0900 subrepo: change arguments of abstractsubrepo.__init__ (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 10 Apr 2015 00:36:42 +0900] rev 24671
subrepo: change arguments of abstractsubrepo.__init__ (API) This patch passes "ctx" and "path" instead of "ui" to "abstractsubrepo.__init__()" and stores them as "_ctx" and "_path" to use them in subsequent patches. This also removes redundant field initializations in the constructor of classes derived from "abstractsubrepo".
Tue, 07 Apr 2015 15:18:52 -0700 treemanifest: optimize treemanifest._walk() to skip directories
Drew Gottlieb <drgott@google.com> [Tue, 07 Apr 2015 15:18:52 -0700] rev 24670
treemanifest: optimize treemanifest._walk() to skip directories This makes treemanifest.walk() not visit submanifests that are known not to have any matching files. It does this by calling match.visitdir() on submanifests as it walks. This change also updates largefiles to be able to work with this new behavior in treemanifests. It overrides match.visitdir(), the function that dictates how walk() and matches() skip over directories. The greatest speed improvements are seen with narrower scopes. For example, this commit speeds up the following command on the Mozilla repo from 1.14s to 1.02s: hg files -r . dom/apps/ Whereas with a wider scope, dom/, the speed only improves from 1.21s to 1.13s. As with similar a similar optimization to treemanifest.matches(), this change will bring out even bigger performance improvements once treemanifests are loaded lazily. Once that happens, we won't just skip over looking at submanifests, but we'll skip even loading them.
Wed, 08 Apr 2015 22:31:50 -0400 import-checker: force 'fcntl', 'grp', 'pwd', and 'termios' to stdlib modules
Matt Harbison <matt_harbison@yahoo.com> [Wed, 08 Apr 2015 22:31:50 -0400] rev 24669
import-checker: force 'fcntl', 'grp', 'pwd', and 'termios' to stdlib modules These are Unix only, and caused these additional warnings on Windows if they aren't hardcoded as stdlib: mercurial/posix.py mixed imports stdlib: errno, getpass, os, socket, stat, sys, tempfile relative: grp, pwd, unicodedata mercurial/posix.py mixed imports stdlib: re relative: fcntl mercurial/posix.py mixed imports stdlib: array relative: termios Additionally, this was missing on Windows: mercurial/crecord.py mixed imports stdlib: fcntl, termios relative: curses https://docs.python.org/2/library/fcntl.html https://docs.python.org/2/library/grp.html https://docs.python.org/2/library/pwd.html https://docs.python.org/2/library/termios.html
Wed, 08 Apr 2015 22:23:51 -0400 import-checker: allow *.pyd based stdlib modules
Matt Harbison <matt_harbison@yahoo.com> [Wed, 08 Apr 2015 22:23:51 -0400] rev 24668
import-checker: allow *.pyd based stdlib modules These are Windows dlls, and eliminate the following import check diffs that are not on Unix: mercurial/changegroup.py mixed imports stdlib: os, struct, tempfile, zlib relative: bz2 mercurial/encoding.py mixed imports stdlib: locale, os relative: unicodedata
Tue, 07 Apr 2015 22:35:44 -0700 manifest.walk: join nested if-conditions
Martin von Zweigbergk <martinvonz@google.com> [Tue, 07 Apr 2015 22:35:44 -0700] rev 24667
manifest.walk: join nested if-conditions This makes it more closely match the similar condition in manifestdict.matches().
Wed, 08 Apr 2015 10:01:31 -0700 manifestdict: inline _intersectfiles()
Martin von Zweigbergk <martinvonz@google.com> [Wed, 08 Apr 2015 10:01:31 -0700] rev 24666
manifestdict: inline _intersectfiles() The _intersectfiles() method is only called from one place, it's pretty short, and its caller has to be aware when it's appropriate to call it (when the number of files in the matcher is not too large), so let's inline it.
Wed, 08 Apr 2015 10:03:59 -0700 manifestdict._intersectfiles: avoid one level of property indirection
Martin von Zweigbergk <martinvonz@google.com> [Wed, 08 Apr 2015 10:03:59 -0700] rev 24665
manifestdict._intersectfiles: avoid one level of property indirection We have already bothered to extract "lm = self._lm", so let's use "lm" where possible.
Wed, 08 Apr 2015 10:06:05 -0700 manifestdict.matches: avoid name 'lm' for a not-lazymanifest
Martin von Zweigbergk <martinvonz@google.com> [Wed, 08 Apr 2015 10:06:05 -0700] rev 24664
manifestdict.matches: avoid name 'lm' for a not-lazymanifest
Tue, 24 Mar 2015 21:25:57 +0100 commands: add ui.statuscopies config knob
Mathias De Maré <mathias.demare@gmail.com> [Tue, 24 Mar 2015 21:25:57 +0100] rev 24663
commands: add ui.statuscopies config knob statuscopies enables viewing of copies and moves in 'hg status' by default.
Sat, 04 Apr 2015 22:30:59 +0900 changelog: inline revlog.__contains__ in case it is used in hot loop
Yuya Nishihara <yuya@tcha.org> [Sat, 04 Apr 2015 22:30:59 +0900] rev 24662
changelog: inline revlog.__contains__ in case it is used in hot loop Currently __contains__ is called only by "rev()" revset, but "x in cl" is a function that is likely to be used in hot loop. revlog.__contains__ is simple enough to duplicate to changelog, so just inline it.
Wed, 08 Apr 2015 02:56:19 +0900 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 08 Apr 2015 02:56:19 +0900] rev 24661
bookmarks: show detailed status about outgoing bookmarks Before this patch, "hg outgoing -B" shows only difference of bookmarks between two repositories, and it isn't user friendly. This patch shows detailed status about outgoing bookmarks at "hg outgoing -B". To avoid breaking backward compatibility with other tool chains, this patch shows status, only if --verbose is specified,
Wed, 08 Apr 2015 02:56:19 +0900 bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 08 Apr 2015 02:56:19 +0900] rev 24660
bookmarks: show detailed status about incoming bookmarks Before this patch, "hg incoming -B" shows only difference of bookmarks between two repositories, and it isn't user friendly. This patch shows detailed status about incoming bookmarks at "hg incoming -B". To avoid breaking backward compatibility with other tool chains, this patch shows status, only if --verbose is specified,
Wed, 08 Apr 2015 02:56:19 +0900 bookmarks: enhance test of showing detail about incoming/outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 08 Apr 2015 02:56:19 +0900] rev 24659
bookmarks: enhance test of showing detail about incoming/outgoing bookmarks
Wed, 08 Apr 2015 02:56:19 +0900 bookmarks: show outgoing bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 08 Apr 2015 02:56:19 +0900] rev 24658
bookmarks: show outgoing bookmarks more exactly Before this patch, "hg outgoing -B" shows only bookmarks added locally. Then, users can't know about bookmarks below before "hg push" execution. - deleted locally (even though it may be added remotely from "hg pull" view) - advanced locally - diverged - changed (= remote revision is unknown for local) This patch shows such bookmarks, too.
Wed, 08 Apr 2015 02:56:19 +0900 bookmarks: show incoming bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 08 Apr 2015 02:56:19 +0900] rev 24657
bookmarks: show incoming bookmarks more exactly Before this patch, "hg incoming -B" shows only bookmarks added remotely. Then, users can't know about bookmarks below before "hg pull" execution. - advanced remotely - diverged - changed (remote revision is unknown for local) This patch shows such bookmarks, too.
Tue, 07 Apr 2015 15:16:19 -0700 test-manifest: add some test coverage for treemanifest
Drew Gottlieb <drgott@google.com> [Tue, 07 Apr 2015 15:16:19 -0700] rev 24656
test-manifest: add some test coverage for treemanifest Similar to the testmanifest test case, testtreemanifest extends the base test case but uses treemanifests instead of manifestdicts. Adding this test provides some basic test coverage of treemanifest within the standard test suite.
Tue, 07 Apr 2015 15:16:19 -0700 test-manifest: make manifesttest a base class that is extended
Drew Gottlieb <drgott@google.com> [Tue, 07 Apr 2015 15:16:19 -0700] rev 24655
test-manifest: make manifesttest a base class that is extended The implementation of the testmanifest test case is moved to a new base class, which is then extended to make the testmanifest. And instead of testmanifest, the subclass is named testmanifestdict because, well, that's what it's testing. This refactoring makes it possible to create alternate versions of what was formerly testmanifest, improving test coverage of different manifestdict implementations.
Tue, 07 Apr 2015 15:16:19 -0700 test-manifest: move parsemanifest() to be a testmanifest class method
Drew Gottlieb <drgott@google.com> [Tue, 07 Apr 2015 15:16:19 -0700] rev 24654
test-manifest: move parsemanifest() to be a testmanifest class method This refactoring lets testmanifest subclasses override this method to return different manifestdict implementations, such as treemanifest. It is useful for later commits where the testmanifest class is moved into a base class, and test cases that extend the base class can provide their own parsemanifest() implementation.
Tue, 07 Apr 2015 22:31:36 -0400 windows: allow readpipe() to actually read data out of the pipe
Matt Harbison <matt_harbison@yahoo.com> [Tue, 07 Apr 2015 22:31:36 -0400] rev 24653
windows: allow readpipe() to actually read data out of the pipe It appears that the read() in readpipe() never actually ran before (in test-ssh.t anyway). A print of the size returned from os.fstat() is 0 for every single print output in test-ssh.t, so the data in the pipe ends up being read later instead of when it is available. This is the same problem as Linux, as mentioned in 331cbf088c4c. There are several places in the Windows SSH tests where the order of local output vs remote output differ from the other platforms. This only fixes one of those cases (and interstingly, not the one added in order to test 331cbf088c4c), so there is more investigation needed. However, without this patch, test-ssh.t also has this diff: --- c:/Users/Matt/Projects/hg/tests/test-ssh.t +++ c:/Users/Matt/Projects/hg/tests/test-ssh.t.err @@ -397,11 +397,11 @@ $ hg push --ssh "sh ../ssh.sh" pushing to ssh://user@dummy/*/remote (glob) searching for changes - remote: Permission denied - remote: abort: prechangegroup.hg-ssh hook failed - remote: Permission denied - remote: pushkey-abort: prepushkey.hg-ssh hook failed updating 6c0482d977a3 to public failed! + remote: Permission denied + remote: abort: prechangegroup.hg-ssh hook failed + remote: Permission denied + remote: pushkey-abort: prepushkey.hg-ssh hook failed [1] $ cd .. Output with this change was stable over 600+ runs of test-ssh.t. I initially tried a background thread to read the pipe[1], but this was simpler and the test results were exactly the same. I also tried SetNamedPipeHandleState(), but the PIPE_NOWAIT is for compatibility with LANMAN 2.0, not for async I/O (the results were identical though). [1] http://eyalarubas.com/python-subproc-nonblock.html
Tue, 07 Apr 2015 22:30:25 -0400 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com> [Tue, 07 Apr 2015 22:30:25 -0400] rev 24652
win32: add a method to fetch the available pipe data size This will be used in the next patch to do nonblocking reads from the child process, like on posix platforms. See that for why os.fstat() is insufficient.
Tue, 07 Apr 2015 20:43:04 -0700 dirs._addpath: reinstate use of Py_CLEAR
Siddharth Agarwal <sid0@fb.com> [Tue, 07 Apr 2015 20:43:04 -0700] rev 24651
dirs._addpath: reinstate use of Py_CLEAR I changed this to an explicit Py_DECREF + set to null in 6f0e6fa9fdd7. This was a silly misunderstanding on my part -- for some reason I thought Py_CLEAR set its argument to null only if its refcount reached 0. Turns out that's not actually the case -- Py_CLEAR is just Py_DECREF + set to null with some additional precautions around destructors that aren't relevant here. The real bug that 6f0e6fa9fdd7 fixed was the fact that we were mutating the string after setting it in the Python dictionary.
Mon, 06 Apr 2015 18:31:59 -0700 exchange: introduce a '_canusebundle2' function
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Apr 2015 18:31:59 -0700] rev 24650
exchange: introduce a '_canusebundle2' function This function refactors the logic that decides to use 'bundle2' during an exchange (pull/push). This will help being consistent while transitioning from the experimental protocol to the final frozen version. I do not expect this function to survive on the long run when using 'bundle2' will become a simple capability check. This is also necessary to allow HG2Y support in an extension to ease transition of companies using the experimental protocol in production (yeah...). Such extension will be able to wrap this function to use the experimental protocol in some case.
Tue, 07 Apr 2015 16:01:32 -0700 bundle2: detect bundle2 stream/request on /HG2./ instead of /HG2Y/
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Apr 2015 16:01:32 -0700] rev 24649
bundle2: detect bundle2 stream/request on /HG2./ instead of /HG2Y/ To support more bundle2 formats, we need a wider detection of bundle2-family streams. The various places what were explicitly detecting the full magic string are now matching on the first three characters of it.
Mon, 06 Apr 2015 17:23:11 -0700 unbundle20: allow generic dispatch between unbundlers
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Apr 2015 17:23:11 -0700] rev 24648
unbundle20: allow generic dispatch between unbundlers We now take full advantage of the 'getunbundler' function by using a '{version -> unbundler-class}' mapping. This map currently contains a single entry but will make it easy to support more versions from an extension/the future. At some point, this map will probably contain bundler-class information too, in the same fashion the packer map does. However, this is not critically required right now so it will happen by itself when needed. The main target is to allow HG2Y support in an extension to ease transition of companies using the experimental protocol in production (yeah...) But I've no doubt this will be useful when playing with a future HG21.
Tue, 07 Apr 2015 15:18:52 -0700 treemanifest: refactor treemanifest.walk()
Drew Gottlieb <drgott@google.com> [Tue, 07 Apr 2015 15:18:52 -0700] rev 24647
treemanifest: refactor treemanifest.walk() This refactor is a preparation for an optimization in the next commit. This introduces a recursive element that recurses each submanifest. By using a recursive function, the next commit can avoid walking over some subdirectories altogether.
Tue, 07 Apr 2015 15:18:52 -0700 manifest: move changectx.walk() to manifests
Drew Gottlieb <drgott@google.com> [Tue, 07 Apr 2015 15:18:52 -0700] rev 24646
manifest: move changectx.walk() to manifests The logic of walking a manifest to yield files matching a match object is currently being done by context, not the manifest itself. This moves the walk() function to both manifestdict and treemanifest. This separate implementation will also permit differing, optimized implementations for each manifest.
Sun, 05 Apr 2015 15:08:55 -0400 subrepo: precisely identify the missing subrepo spec file
Matt Harbison <matt_harbison@yahoo.com> [Sun, 05 Apr 2015 15:08:55 -0400] rev 24645
subrepo: precisely identify the missing subrepo spec file It isn't obvious which file is the problem with deep subrepos, so provide the path. Since the parsing is done with a ctx and not a subrepo object, it isn't possible to display a path from the root subrepo. Therefore, the path shown is relative to cwd. There's no test coverage for the first abort, and I couldn't figure out how to trigger it, but it is changed for consistency.
(0) -10000 -3000 -1000 -300 -100 -50 -30 +30 +50 +100 +300 +1000 +3000 +10000 tip