Commit Graph

18968 Commits

Author SHA1 Message Date
Pierre-Yves David
6b9d408177 configitems: add a devel warning for extensions items overiding core one
We do not want such case to pass silently. In the future we'll likely have
useful tool for an extension to alter the existing definition in core.
2017-06-18 19:52:54 +02:00
Pierre-Yves David
1dab0bbe74 configitems: add an official API for extensions to register config item
Extensions can have a 'configtable' mapping and use
'registrar.configitem(table)' to retrieve the registration function.

This behave in the same way as the other way for extensions to register new
items (commands, colors, etc).
2017-06-17 13:48:20 +02:00
Pierre-Yves David
2305d6b487 configitems: extract the logic to build a registrar on any configtable
Having the logic available independently from the mapping used is a necessary
step toward extensions support.
2017-06-17 13:38:53 +02:00
Pierre-Yves David
3e0bfc6abf obsolete: skip 'changectx' usage in unstable computation
We simplify the unstable computation code, skipping the expensive creation of
changectx object. We focus on efficient set operation and revnumber centric
functions.

In my mercurial development repository, this provides a 3x speedup to the
function:

  before: 5.319 ms
  after:  1.844 ms

repo details:

  total changesets:       40886
  obsolete changesets:     7756
  mutable (not obsolete):   293
  unstable:                  30
2017-06-19 01:08:11 +02:00
Pierre-Yves David
be7de168fe obsolete: provide a small function to retrieve all mutable revisions
More obsolescence related algorithm focus on the mutable revision. We provide a
tiny utility function to make it easy to access this set.
2017-06-18 22:38:11 +02:00
Siddharth Agarwal
218f4e2803 bundle2: add debug info about the number of stream params
Seems like the %i was never substituted.
2017-06-27 14:38:00 -07:00
Siddharth Agarwal
1920cf0324 bundle2: add some debugging information to the not-a-bundle error
I found this useful while trying to debug wireproto-related issues.
2017-06-27 14:30:55 -07:00
Yuya Nishihara
9b58e92dbe smartset: fix generatorset.last() to not return the first element (issue5609) 2017-06-27 23:50:22 +09:00
Jun Wu
d15f755cab strip: respect the backup option in stripcallback
The backup option was mistakenly ignored. It should be respected.

Thanks Martin von Zweigbergk for finding this out!
2017-06-26 21:11:02 -07:00
Pulkit Goyal
f6911d2833 py3: use pycompat.bytestr() to convert str to bytes 2017-06-26 23:58:27 +05:30
Pulkit Goyal
f7889ef073 py3: pass the memoryview object into bytes() to get the value 2017-06-26 23:57:49 +05:30
Pulkit Goyal
971c41225c py3: use pycompat.bytestr instead of str 2017-06-26 17:23:10 +05:30
Pulkit Goyal
0d776078c8 py3: use '%d' to convert integers to bytes 2017-06-26 17:22:45 +05:30
Pulkit Goyal
bfb91c2ff5 py3: slice over bytes to prevent getting it's ascii value 2017-06-25 08:36:51 +05:30
Pulkit Goyal
5cabeba9d4 py3: use pycompat.strkwargs() to convert kwargs keys to str 2017-06-27 00:23:32 +05:30
Pulkit Goyal
cd9c4a1e24 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.
2017-06-27 00:15:56 +05:30
Pulkit Goyal
0993aa87aa 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.
2017-06-27 00:20:55 +05:30
Pulkit Goyal
d7e69a39e2 py3: add b'' to make the regex pattern bytes 2017-06-25 03:11:55 +05:30
Pulkit Goyal
35cedf7901 py3: use hex() to convert the hash to bytes 2017-06-26 17:20:46 +05:30
Pulkit Goyal
10c2f21384 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.
2017-06-24 19:57:50 +05:30
Pulkit Goyal
a80331e023 py3: fix kwargs handling for hg bookmarks 2017-06-24 19:55:01 +05:30
Yuya Nishihara
87a9caa150 identify: provide changectx to templater 2017-06-26 09:37:16 +09:00
Yuya Nishihara
fad172bfb7 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.
2017-06-26 09:33:01 +09:00
Yuya Nishihara
23dd71f9c6 identify: change p1/p2 to a list of parents
It makes sense because the nested data structure is a list of items.
2017-06-26 09:18:55 +09:00
Jun Wu
1e5c473456 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.
2017-06-25 13:31:56 -07:00
Jun Wu
e38073e90f 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.
2017-06-25 10:38:45 -07:00
Phil Cohen
22861c5e86 workingfilectx: add audit() as a wrapper for wvfs.audit() 2017-06-25 22:30:14 -07:00
Phil Cohen
8b63d9e6f0 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.
2017-06-25 22:30:14 -07:00
Phil Cohen
67430178c3 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.
2017-06-25 22:29:09 -07:00
Phil Cohen
522fc7d98c 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.
2017-06-25 17:00:15 -07:00
Phil Cohen
4a54f4253f 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.
2017-06-25 16:58:26 -07:00
Phil Cohen
c6b8b5e8d4 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.
2017-06-25 16:56:49 -07:00
Yuya Nishihara
44aa43c0dc 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
2017-06-24 23:05:57 +09:00
Yuya Nishihara
34373a25d4 dagop: make walk direction switchable so it can track descendants
# ancestors(tip) using hg repo
  2) 0.068527
  3) 0.069097
2017-06-24 23:35:03 +09:00
Yuya Nishihara
06592918ad dagop: factor out generator of ancestor nodes
# ancestors(tip) using hg repo
  1) 0.068976
  2) 0.068527
2017-06-24 23:30:51 +09:00
Yuya Nishihara
568f49d319 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
2017-06-24 23:22:45 +09:00
Yuya Nishihara
1103437683 dagop: use smartset.min() in revdescendants() generator
All callers pass the result of revset.getset(), which should be a smartset.
2017-06-23 21:15:10 +09:00
Yuya Nishihara
c6472824e6 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
2017-06-20 22:26:52 +09:00
Yuya Nishihara
0a45222557 dagop: unnest inner generator of revdescendants()
This just moves iterate() to module-level function.
2017-06-18 17:02:03 +09:00
Yuya Nishihara
e199b8a6c1 smartset: fix default value of abstractsmartset.sort()
It's unused, but it shouldn't lie.
2017-06-25 00:14:48 +09:00
Yuya Nishihara
e05a3db9e4 debugrevlog: align chain length, reach, and compression ratio
I think this is what the max(...) exists for.
2017-06-26 22:27:34 +09:00
Pierre-Yves David
e2366ea12d 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.
2017-06-23 17:19:29 +02:00
Pierre-Yves David
337073fb57 config: use '_config' within 'configbytes'
This will prevent bugs from using None as the sentinel value (eg:
'ui.interactive')
2017-06-25 14:41:12 +02:00
Pierre-Yves David
bcbc568807 config: use '_config' within 'configbool'
This will prevent bugs from using None as the sentinel value (eg:
'ui.interactive')
2017-06-25 14:38:56 +02:00
Pierre-Yves David
634a0d74db config: extract the core config logic into a private method
This will make it easier for the other 'configxxx' function to detect unset
value.
2017-06-25 14:34:34 +02:00
Pierre-Yves David
e77c352bd8 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.
2017-06-23 01:38:10 +02:00
Jun Wu
e906874924 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.
2017-06-24 21:13:48 -07:00
Matt Harbison
e73eeef097 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.
2017-06-25 17:46:35 -04:00
FUJIWARA Katsunori
b05e620ac0 dispatch: remove unused _loaded
Now, there is no user for dispatch._loaded.
2017-06-24 02:39:21 +09:00
FUJIWARA Katsunori
fdb6557cf4 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).
2017-06-24 02:39:20 +09:00