Mon, 26 Jun 2017 23:58:27 +0530 py3: use pycompat.bytestr() to convert str to bytes
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 26 Jun 2017 23:58:27 +0530] rev 33119
py3: use pycompat.bytestr() to convert str to bytes
Mon, 26 Jun 2017 23:57:49 +0530 py3: pass the memoryview object into bytes() to get the value
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 26 Jun 2017 23:57:49 +0530] rev 33118
py3: pass the memoryview object into bytes() to get the value
Mon, 26 Jun 2017 17:23:10 +0530 py3: use pycompat.bytestr instead of str
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 26 Jun 2017 17:23:10 +0530] rev 33117
py3: use pycompat.bytestr instead of str
Mon, 26 Jun 2017 17:22:45 +0530 py3: use '%d' to convert integers to bytes
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 26 Jun 2017 17:22:45 +0530] rev 33116
py3: use '%d' to convert integers to bytes
Sun, 25 Jun 2017 08:36:51 +0530 py3: slice over bytes to prevent getting it's ascii value
Pulkit Goyal <7895pulkit@gmail.com> [Sun, 25 Jun 2017 08:36:51 +0530] rev 33115
py3: slice over bytes to prevent getting it's ascii value
Tue, 27 Jun 2017 00:23:32 +0530 py3: use pycompat.strkwargs() to convert kwargs keys to str
Pulkit Goyal <7895pulkit@gmail.com> [Tue, 27 Jun 2017 00:23:32 +0530] rev 33114
py3: use pycompat.strkwargs() to convert kwargs keys to str
Tue, 27 Jun 2017 00:15:56 +0530 py3: use r'' to prevent the addition of b'' by transformer
Pulkit Goyal <7895pulkit@gmail.com> [Tue, 27 Jun 2017 00:15:56 +0530] rev 33113
py3: use r'' to prevent the addition of b'' by transformer There are cases in opts handling in debugcommands.py where we don't need to convert opts keys back to bytes as there are some handful cases and no other function using opts value. Using r'', we prevent the transformer to add a b'' which will keep the value str.
Tue, 27 Jun 2017 00:20:55 +0530 py3: use pycompat.byteskwargs() to convert kwargs' keys to bytes
Pulkit Goyal <7895pulkit@gmail.com> [Tue, 27 Jun 2017 00:20:55 +0530] rev 33112
py3: use pycompat.byteskwargs() to convert kwargs' keys to bytes This is used where ever required like where kwargs are passed into ui.formatter(), scmutil.match() or cmdutil.openrevlog() which expects bytes.
Tue, 27 Jun 2017 02:24:38 +0900 tests: use cgienv to minimize environment setup at hgweb tests
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 27 Jun 2017 02:24:38 +0900] rev 33111
tests: use cgienv to minimize environment setup at hgweb tests This patch follows other hgweb tests.
Tue, 27 Jun 2017 02:24:37 +0900 tests: avoid test failure for mangling path-like string by MSYS
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 27 Jun 2017 02:24:37 +0900] rev 33110
tests: avoid test failure for mangling path-like string by MSYS
Sun, 25 Jun 2017 08:20:05 +0530 py3: make sure commands name are bytes in tests
Pulkit Goyal <7895pulkit@gmail.com> [Sun, 25 Jun 2017 08:20:05 +0530] rev 33109
py3: make sure commands name are bytes in tests
Sun, 25 Jun 2017 03:11:55 +0530 py3: add b'' to make the regex pattern bytes
Pulkit Goyal <7895pulkit@gmail.com> [Sun, 25 Jun 2017 03:11:55 +0530] rev 33108
py3: add b'' to make the regex pattern bytes
Mon, 26 Jun 2017 17:20:46 +0530 py3: use hex() to convert the hash to bytes
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 26 Jun 2017 17:20:46 +0530] rev 33107
py3: use hex() to convert the hash to bytes
Sat, 24 Jun 2017 19:57:50 +0530 py3: add b'' to make a triple quoted string bytes on Python 3
Pulkit Goyal <7895pulkit@gmail.com> [Sat, 24 Jun 2017 19:57:50 +0530] rev 33106
py3: add b'' to make a triple quoted string bytes on Python 3 Transformer does not adds b'' in front of triple quoted strings to prevent converting docs to bytes.
Sat, 24 Jun 2017 19:55:41 +0530 py3: add tests to show `hg bookmarks` and `hg branches` work on Python 3
Pulkit Goyal <7895pulkit@gmail.com> [Sat, 24 Jun 2017 19:55:41 +0530] rev 33105
py3: add tests to show `hg bookmarks` and `hg branches` work on Python 3
Sat, 24 Jun 2017 19:55:01 +0530 py3: fix kwargs handling for `hg bookmarks`
Pulkit Goyal <7895pulkit@gmail.com> [Sat, 24 Jun 2017 19:55:01 +0530] rev 33104
py3: fix kwargs handling for `hg bookmarks`
Mon, 26 Jun 2017 09:37:16 +0900 identify: provide changectx to templater
Yuya Nishihara <yuya@tcha.org> [Mon, 26 Jun 2017 09:37:16 +0900] rev 33103
identify: provide changectx to templater
Mon, 26 Jun 2017 09:33:01 +0900 formatter: proxy fm.context() through converter
Yuya Nishihara <yuya@tcha.org> [Mon, 26 Jun 2017 09:33:01 +0900] rev 33102
formatter: proxy fm.context() through converter Otherwise nested template formatter would not see the context objects. It's just a boolean flag now. We might want to change it to 'ctxs -> items' function so changectx attributes are populated automatically in JSON, but I'm not sure.
Mon, 26 Jun 2017 09:18:55 +0900 identify: change p1/p2 to a list of parents
Yuya Nishihara <yuya@tcha.org> [Mon, 26 Jun 2017 09:18:55 +0900] rev 33101
identify: change p1/p2 to a list of parents It makes sense because the nested data structure is a list of items.
Sun, 25 Jun 2017 13:31:56 -0700 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com> [Sun, 25 Jun 2017 13:31:56 -0700] rev 33100
scmutil: add a cleanupnodes method for developers It's now common that an old node gets replaced by zero or more new nodes, that could happen with amend, rebase, histedit, etc. And it's a common requirement to do bookmark movements, strip or obsolete nodes and even moving working copy parent. Previously, amend, rebase, history have their own logic doing the above. This patch is an attempt to unify them and future code. This enables new developers to be able to do "replace X with Y" thing correctly, without any knowledge about bookmarks, strip or obsstore. The next step will be migrating rebase to the new API, so it works inside a transaction, and its code could be simplified.
Sun, 25 Jun 2017 10:38:45 -0700 strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com> [Sun, 25 Jun 2017 10:38:45 -0700] rev 33099
strip: add a delayedstrip method that works in a transaction For long, the fact that strip does not work inside a transaction and some code has to work with both obsstore and fallback to strip lead to duplicated code like: with repo.transaction(): .... if obsstore: obsstore.createmarkers(...) if not obsstore: repair.strip(...) Things get more complex when you want to call something which may call strip under the hood. Like you cannot simply write: with repo.transaction(): .... rebasemod.rebase(...) # may call "strip", so this doesn't work But you do want rebase to run inside a same transaction if possible, so the code may look like: with repo.transaction(): .... if obsstore: rebasemod.rebase(...) obsstore.createmarkers(...) if not obsstore: rebasemod.rebase(...) repair.strip(...) That's ugly and error-prone. Ideally it's possible to just write: with repo.transaction(): rebasemod.rebase(...) saferemovenodes(...) This patch is the first step towards that. It adds a "delayedstrip" method to repair.py which maintains a postclose callback in the transaction object.
Sun, 25 Jun 2017 22:30:14 -0700 workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com> [Sun, 25 Jun 2017 22:30:14 -0700] rev 33098
workingfilectx: add audit() as a wrapper for wvfs.audit()
Sun, 25 Jun 2017 22:30:14 -0700 workingfilectx: add backgroundclose as a kwarg to write()
Phil Cohen <phillco@fb.com> [Sun, 25 Jun 2017 22:30:14 -0700] rev 33097
workingfilectx: add backgroundclose as a kwarg to write() This is necessary because some callers in merge.py pass backgroundclose=True when writing. As with previous changes in this series, this should be a no-op.
Sun, 25 Jun 2017 22:29:09 -0700 merge: change repo.wvfs.setflags calls to a new wctx[f].setflags function
Phil Cohen <phillco@fb.com> [Sun, 25 Jun 2017 22:29:09 -0700] rev 33096
merge: change repo.wvfs.setflags calls to a new wctx[f].setflags function As with previous changes in this series, this should be a no-op.
Sun, 25 Jun 2017 17:00:15 -0700 merge: convert repo.wwrite() calls to wctx[f].write()
Phil Cohen <phillco@fb.com> [Sun, 25 Jun 2017 17:00:15 -0700] rev 33095
merge: convert repo.wwrite() calls to wctx[f].write() As with the previous patch in this series, workingfilectx.write() is a direct call to repo.wwrite(), so this change should be a no-op.
Sun, 25 Jun 2017 16:58:26 -0700 merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com> [Sun, 25 Jun 2017 16:58:26 -0700] rev 33094
merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove() The code inside workingfilectx.remove() is a straight call to repo.wvfs.unlinkpath, so this should be a no-op.
Sun, 25 Jun 2017 16:56:49 -0700 merge: pass wctx to batchremove and batchget
Phil Cohen <phillco@fb.com> [Sun, 25 Jun 2017 16:56:49 -0700] rev 33093
merge: pass wctx to batchremove and batchget We would like to migrate direct calls of repo.wvfs/wwrite/wread/etc to a call on the relevant workingfilectx, both as a cleanup (to reduce the number of working copy functions on `repo`), and also to facilitate an in-memory merge that doesn't write to the working copy. In order to do that, the first step is to ensure we pass the target wctx around and perform our writes and reads on it. Later, this object might become a memctx.
Sat, 24 Jun 2017 23:05:57 +0900 revset: add depth limit to descendants() (issue5374)
Yuya Nishihara <yuya@tcha.org> [Sat, 24 Jun 2017 23:05:57 +0900] rev 33092
revset: add depth limit to descendants() (issue5374) This is naive implementation using two-pass scanning. Tracking descendants isn't an easy problem if both start and stop depths are specified. It's impractical to remember all possible depths of each node while scanning from roots to descendants because the number of depths explodes. Instead, we could cache (min, max) depths as a good approximation and track ancestors back when needed, but that's likely to have off-by-one bug. Since this implementation appears not significantly slower, and is quite straightforward, I think it's good enough for practical use cases. The time and space complexity is O(n) ish. revisions: 0) 1-pass scanning with (min, max)-depth cache (worst-case quadratic) 1) 2-pass scanning (this version) repository: mozilla-central # descendants(0) (for reference) *) 0.430353 # descendants(0, depth=1000) 0) 0.264889 1) 0.398289 # descendants(limit(tip:0, 1, offset=10000), depth=1000) 0) 0.025478 1) 0.029099 # descendants(0, depth=2000, startdepth=1000) 0) painfully slow (due to quadratic backtracking of ancestors) 1) 1.531138
Sat, 24 Jun 2017 23:35:03 +0900 dagop: make walk direction switchable so it can track descendants
Yuya Nishihara <yuya@tcha.org> [Sat, 24 Jun 2017 23:35:03 +0900] rev 33091
dagop: make walk direction switchable so it can track descendants # ancestors(tip) using hg repo 2) 0.068527 3) 0.069097
Sat, 24 Jun 2017 23:30:51 +0900 dagop: factor out generator of ancestor nodes
Yuya Nishihara <yuya@tcha.org> [Sat, 24 Jun 2017 23:30:51 +0900] rev 33090
dagop: factor out generator of ancestor nodes # ancestors(tip) using hg repo 1) 0.068976 2) 0.068527
Sat, 24 Jun 2017 23:22:45 +0900 dagop: factor out pfunc from revancestors() generator
Yuya Nishihara <yuya@tcha.org> [Sat, 24 Jun 2017 23:22:45 +0900] rev 33089
dagop: factor out pfunc from revancestors() generator This generator will be reused for tracking descendants with depth limit. # ancestors(tip) using hg repo 0) 0.065868 1) 0.068976
Fri, 23 Jun 2017 21:15:10 +0900 dagop: use smartset.min() in revdescendants() generator
Yuya Nishihara <yuya@tcha.org> [Fri, 23 Jun 2017 21:15:10 +0900] rev 33088
dagop: use smartset.min() in revdescendants() generator All callers pass the result of revset.getset(), which should be a smartset.
Tue, 20 Jun 2017 22:26:52 +0900 dagop: change revdescendants() to include all root revisions
Yuya Nishihara <yuya@tcha.org> [Tue, 20 Jun 2017 22:26:52 +0900] rev 33087
dagop: change revdescendants() to include all root revisions Prepares for adding depth support. I want to process depth=0 in revdescendants() to make things simpler. only() also calls dagop.revdescendants(), but it filters out root revisions explicitly. So this should cause no problem. # descendants(0) using hg repo 0) 0.052380 1) 0.051226 # only(tip) using hg repo 0) 0.001433 1) 0.001425
Tue, 20 Jun 2017 22:11:23 +0900 test-revset: add a few more tests of descendants()
Yuya Nishihara <yuya@tcha.org> [Tue, 20 Jun 2017 22:11:23 +0900] rev 33086
test-revset: add a few more tests of descendants() I'll add depth support to descendants().
Sun, 18 Jun 2017 17:02:03 +0900 dagop: unnest inner generator of revdescendants()
Yuya Nishihara <yuya@tcha.org> [Sun, 18 Jun 2017 17:02:03 +0900] rev 33085
dagop: unnest inner generator of revdescendants() This just moves iterate() to module-level function.
Sun, 25 Jun 2017 00:14:48 +0900 smartset: fix default value of abstractsmartset.sort()
Yuya Nishihara <yuya@tcha.org> [Sun, 25 Jun 2017 00:14:48 +0900] rev 33084
smartset: fix default value of abstractsmartset.sort() It's unused, but it shouldn't lie.
Mon, 26 Jun 2017 03:47:11 +0900 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 26 Jun 2017 03:47:11 +0900] rev 33083
keyword: wrap functions only once at loading keyword extension Before this patch, some functions are wrapped in reposetup(), but this causes redundant nested wrapping, if two ore more repositories enable keyword extension (e.g. hgweb serves multiple repositories). Now, there is no need to define these wrapper functions in reposetup(), because previous patches made them not directly refer to kwtemplater instanciated in reposetup(). This patch factors these wrapper functions out from reposetup(), and uses them to wrap functions only at once at loading keyword extension.
Mon, 26 Jun 2017 03:46:17 +0900 keyword: use _keywordkwt of repository instead of kwtools['templater']
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 26 Jun 2017 03:46:17 +0900] rev 33082
keyword: use _keywordkwt of repository instead of kwtools['templater'] Now, kwtemplater instance can be obtained via _keywordkwt property of repository.
Mon, 26 Jun 2017 03:44:50 +0900 keyword: obtain kwtemplater instance via repository at runtime
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 26 Jun 2017 03:44:50 +0900] rev 33081
keyword: obtain kwtemplater instance via repository at runtime Wrapper functions of keyword extension are defined in reposetup(), because they refer to kwtemplater instantiated in reposetup(). This patch makes them obtain kwtemplater instance via repository at runtime. For reviewability, this patch focuses on wrapper functions, which handle generator. This is a part of preparations for defining them statically.
Mon, 26 Jun 2017 03:43:47 +0900 keyword: obtain kwtemplater instance via repository at runtime
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 26 Jun 2017 03:43:47 +0900] rev 33080
keyword: obtain kwtemplater instance via repository at runtime Wrapper functions of keyword extension are defined in reposetup(), because they refer to kwtemplater instantiated in reposetup(). This patch makes them obtain kwtemplater instance via repository at runtime. This is a part of preparations for defining them statically.
Mon, 26 Jun 2017 03:42:17 +0900 keyword: make wrapped repository and kwtemplater refer to each other
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 26 Jun 2017 03:42:17 +0900] rev 33079
keyword: make wrapped repository and kwtemplater refer to each other Wrapper functions of keyword extension are defined in reposetup(), because they refer to kwtemplater instantiated in reposetup(). But these functions can be defined statically, if kwtemplater can be obtained via repository at runtime. This is a part of preparations for defining them statically. To avoid cyclic reference, this patch makes kwtemplater use weakref to refer related repository instance.
Mon, 26 Jun 2017 03:40:57 +0900 keyword: add test for keyword expansion at serving multiple repositories
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 26 Jun 2017 03:40:57 +0900] rev 33078
keyword: add test for keyword expansion at serving multiple repositories This is safety for subsequent (and future) patches, which change function wrapping.
Mon, 26 Jun 2017 03:40:12 +0900 keyword: make comparison webcommand suppress keyword expansion
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 26 Jun 2017 03:40:12 +0900] rev 33077
keyword: make comparison webcommand suppress keyword expansion Before this patch, diff in "comparison" webcommand doesn't suppress keyword expansion as same as diff output of other webcommands.
Mon, 26 Jun 2017 03:40:06 +0900 keyword: restore kwtemplater.match at the end of wrapped webcommands
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 26 Jun 2017 03:40:06 +0900] rev 33076
keyword: restore kwtemplater.match at the end of wrapped webcommands Before this patch, kwweb_skip doesn't restore kwtemplater.match after wrapped webcommands. This suppresses keyword expansion at wrapped webcommands. Typical usecase of this issue is "file" webcommand after annotate, changeset, filediff or so on. To ensure kwtemplater.match=util.never while original webcommand running, this patch makes kwweb_skip yield values returned by it, because it returns generator object.
Mon, 26 Jun 2017 03:38:12 +0900 keyword: restore kwtemplater.restrict at the end of wrapped patch.diff
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 26 Jun 2017 03:38:12 +0900] rev 33075
keyword: restore kwtemplater.restrict at the end of wrapped patch.diff Before this patch, kwdiff doesn't restore kwtemplater.restrict after invocation of wrapped patch.diff(). This suppresses keyword expansion at subsequent filelog.read(). Typical usecase of this issue is "hg cat" after "hg diff" with command server. In this case, kwtemplater.restrict=True is kept in command server process even after "hg diff". To ensure kwtemplater.restrict=True while original patch.diff() running, this patch makes kwdiff() yield values returned by it, because it returns generator object. Strictly speaking, if filelog.read() is invoked before completely evaluating the result of previous patch.diff(), keyword expansion is still suppressed, because kwtemplater.restrict isn't restored yet. But this fixing should be reasonable enough, because patch.diff() is consumed immediately, AFAIK.
Mon, 26 Jun 2017 22:27:34 +0900 debugrevlog: align chain length, reach, and compression ratio
Yuya Nishihara <yuya@tcha.org> [Mon, 26 Jun 2017 22:27:34 +0900] rev 33074
debugrevlog: align chain length, reach, and compression ratio I think this is what the max(...) exists for.
Fri, 23 Jun 2017 17:19:29 +0200 configitems: register 'ui.interactive'
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 23 Jun 2017 17:19:29 +0200] rev 33073
configitems: register 'ui.interactive' That item default value is a bit special (None) so this adds a second proof that everything is still working fine.
Sun, 25 Jun 2017 14:41:12 +0200 config: use '_config' within 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net> [Sun, 25 Jun 2017 14:41:12 +0200] rev 33072
config: use '_config' within 'configbytes' This will prevent bugs from using None as the sentinel value (eg: 'ui.interactive')
Sun, 25 Jun 2017 14:38:56 +0200 config: use '_config' within 'configbool'
Pierre-Yves David <pierre-yves.david@octobus.net> [Sun, 25 Jun 2017 14:38:56 +0200] rev 33071
config: use '_config' within 'configbool' This will prevent bugs from using None as the sentinel value (eg: 'ui.interactive')
Sun, 25 Jun 2017 14:34:34 +0200 config: extract the core config logic into a private method
Pierre-Yves David <pierre-yves.david@octobus.net> [Sun, 25 Jun 2017 14:34:34 +0200] rev 33070
config: extract the core config logic into a private method This will make it easier for the other 'configxxx' function to detect unset value.
Fri, 23 Jun 2017 01:38:10 +0200 debugrevlog: also display the largest delta chain span
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 23 Jun 2017 01:38:10 +0200] rev 33069
debugrevlog: also display the largest delta chain span Mercurial read all data between the base of the chain and the last delta when restoring content (including unrelated delta). To monitor this, we add data about the size of the "delta chain span" to debugrevlog.
Sat, 24 Jun 2017 21:13:48 -0700 rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com> [Sat, 24 Jun 2017 21:13:48 -0700] rev 33068
rebase: clean up rebasestate from active transaction Previously, rebase assumes the following pattern: rebase: with transaction as tr: # top-level ... tr.__close__ writes rebasestate unlink('rebasestate') However it's possible that "rebase" was called inside a transaction: with transaction as tr1: rebase: with transaction as tr2: # not top-level ... tr2.__close__ does not write rebasestate unlink('rebasestate') tr1.__close__ writes rebasestate That leaves a rebasestate on disk incorrectly. This patch adds "removefilegenerator" to notify transaction code that the state file is no longer needed therefore fixes the issue.
Sat, 24 Jun 2017 21:01:28 -0700 test-rebase: add a test showing rebasestate left behind
Jun Wu <quark@fb.com> [Sat, 24 Jun 2017 21:01:28 -0700] rev 33067
test-rebase: add a test showing rebasestate left behind The test demonstrates that .hg/rebasestate is left behind if "rebase" was called inside an existing transaction.
Sun, 25 Jun 2017 17:46:35 -0400 identify: rename 'changed' keyword -> 'dirty'
Matt Harbison <matt_harbison@yahoo.com> [Sun, 25 Jun 2017 17:46:35 -0400] rev 33066
identify: rename 'changed' keyword -> 'dirty' I meant to do this before sending the initial templater support, but forgot. I'm quite surprised that 'dirty' doesn't occur in more user facing contexts, but there are a few, like the help for blackbox. It also more obviously mirrors the '(clean)' state printed by the summary command. I also didn't like that it was just one letter off from {changes} in the {latesttags} sub-keywords, which has a totally different meaning.
Sat, 24 Jun 2017 02:39:21 +0900 dispatch: remove unused _loaded
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 24 Jun 2017 02:39:21 +0900] rev 33065
dispatch: remove unused _loaded Now, there is no user for dispatch._loaded.
Sat, 24 Jun 2017 02:39:20 +0900 extensions: register functions always at loading extension (issue5601)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 24 Jun 2017 02:39:20 +0900] rev 33064
extensions: register functions always at loading extension (issue5601) Before this patch, functions defined in extensions are registered via extra loaders only in _dispatch(). Therefore, loading extensions in other code paths like below omits registration of functions. - WSGI service - operation across repositories (e.g. subrepo) - test-duplicateoptions.py, using extensions.loadall() directly To register functions always at loading new extension, this patch moves implementation for extra loading from dispatch._dispatch() to extensions.loadall(). AFAIK, only commands module causes cyclic dependency between extensions module, but this patch imports all related modules just before extra loading in loadall(), in order to centralize them. This patch makes extensions.py depend on many other modules, even though extensions.py itself doesn't. It should be avoided if possible, but I don't have any better idea. Some other places like below aren't reasonable for extra loading, IMHO. - specific function in newly added module: existing callers of extensions.loadall() should invoke it, too - hg.repository() or so: no-repo commands aren't covered by this. BTW, this patch removes _loaded.add(name) on relocation, because dispatch._loaded is used only for extraloaders (for similar reason, "exts" variable is removed, too).
(0) -30000 -10000 -3000 -1000 -300 -100 -56 +56 +100 +300 +1000 +3000 +10000 tip