Commit Graph

20290 Commits

Author SHA1 Message Date
Boris Feld
d8aa8e36d8 upgrade: add a 'redeltafullall' mode
We add a new mode for delta recomputation, when selected, each full text will
go through the full "addrevision" mechanism again. This is slower than
"redeltaall" but this gives the opportunity for extensions to trigger special
logic. For example, the lfs extensions can decide to promote some revision to
lfs storage during the upgrade.
2017-12-07 20:27:03 +01:00
Boris Feld
84c9e6582a upgrade: use actual filelog to convert filelog
Extensions can add extra logic related to the config, so we must use the actual
class. The path used needs minimal transformation for this to work.
2017-12-07 22:37:18 +01:00
Boris Feld
b70b33bf91 upgrade: more standard creation of the temporary repository
By using the standard path to create a repository we fill some hole in the
current initialization process. The one who triggered this changeset was the
lack of extensions initialization.
2017-12-07 18:56:10 +01:00
Boris Feld
826e838aa1 upgrade: use the repository 'ui' as the base for the new repository
The `repo.baseui` contains all the configuration but the one specific to the
repository (so it can be used when dealing with local peer and sub-
repository). However, we need the repository config to be taken into account
when doing the upgrade. Otherwise, the upgrade related config that exists in
the repository config won't be taken into account when performing the update.
A buggy and surprising behavior.

We had to work around protection set around `repo.ui.copy` since we are an
uncommon case.
2017-12-07 18:55:35 +01:00
Boris Feld
9f250d48c5 upgrade: register compression as a format variants
Compression is a promising vector for speedup, let us make it easier to check
the compression used and upgrade existing repository.
2017-12-07 16:50:48 +01:00
Boris Feld
25342bccd7 debugformat: handle non-boolean value for variant 2017-12-07 16:49:24 +01:00
Boris Feld
c2382c14ab debugformat: update label depending on value difference
The new label highlight areas where the repo format differs from current
config or default. This should help people spot area where a repository
mismatch with the expected state.
2017-12-07 16:12:32 +01:00
Boris Feld
5ef878754c debugformat: add data about the config when verbose
In verbose mode, the command also displays the current configuration choice
for the variant and the global Mercurial default for it.
2017-12-07 16:05:20 +01:00
Boris Feld
3b270be25b debugformat: add a 'debugformat' command
The command displays basic data about all format variants registered for repo
upgrades. This gives a quick way to peek into a repository format.

The 'fm.write()' calls are very independent because more data will be added in
later changeset. Having more separate call make the later patch clearer.
2017-12-07 16:19:46 +01:00
Boris Feld
dd552bcef6 upgrade: rename 'removecldeltachain' to 'plain-cl-delta'
The new naming is more descriptive of a "state" while the older one was more
about "action". I'm looking into command exposing more of data about the state
of the repository so "state" oriented work better there.

The key has not been made public anywhere outside the debug area so it is fine
to update it.
2017-12-07 15:55:59 +01:00
Pulkit Goyal
3e6a480b54 clone: add support for storing remotenames while cloning
If `experimental.remotenames` is set to True, we store the remotenames in case
of `hg pull`. This patch adds that support to clone command also.

Differential Revision: https://phab.mercurial-scm.org/D1601
2017-12-06 06:40:27 +05:30
Jun Wu
4ca48aa8cc revset: use phasecache.getrevset to calculate public()
Other revsets like secret(), draft(), _nonpublic() are using
phasescache.getrevset already. The latter is more efficient after D1606.
So let's migrate the public() revset function too.

Tested using:

  $ hg debugshell --hidden --cwd hg-committed`
  In [1]: %timeit len(repo.revs('public()'))

* Before D1606: 10 loops, best of 3: 22.5 ms per loop
* Before this change, after D1606: 10 loops, best of 3: 28.6 ms per loop
* After this change: 10 loops, best of 3: 20.2 ms per loop

Therefore `public()` revset becomes even slightly faster after the data
structure change by D1606. A similar performance win could also be observed
on a large repo.

A side effect is `phasecache.getrevset` needs to take a `subset` parameter.
That was added with a default value so it won't cause BC issues.

Differential Revision: https://phab.mercurial-scm.org/D1620
2017-12-08 14:20:34 -08:00
Matthieu Laneuville
eb58359793 patch: move part of tabsplitter logic in _inlinediff
It cannot be entirely moved within _inlinediff as long as worddiff is
experimental (when turned off, matches is always an empty dict).
2017-12-08 17:20:11 +09:00
Phil Cohen
8364d14980 overlayworkingctx: invalidate the manifest cache when changing parents
This fixes problems noticeable when rebasing several commits into one
destination commit using ``--collapse``. The manifest cache needs to be cleared
each time.

Differential Revision: https://phab.mercurial-scm.org/D1244
2017-12-07 16:07:06 -08:00
Phil Cohen
4a5355ea73 overlayworkingctx: add _compact()
Alas, presence of a key in the cache isn't sufficient evidence that the file
is actually dirty.

Differential Revision: https://phab.mercurial-scm.org/D1243
2017-12-07 16:07:06 -08:00
Phil Cohen
b5b63f89d9 overlayworkingctx: add `tomemctx()`
Differential Revision: https://phab.mercurial-scm.org/D1242
2017-12-07 22:26:07 -08:00
Phil Cohen
bea2c78914 overlayworkingctx: add _auditconflicts to write()
Alas, part of Mercurial's conflict detection (for file<->folder conflicts,
for example) depends on the filesystem. We don't have the filesystem with IMM,
so we have to run these checks ourselves.

Differential Revision: https://phab.mercurial-scm.org/D1241
2017-12-07 16:07:06 -08:00
Phil Cohen
2ec2189e8b overlayworkingctx: inherit from committablectx instead of workingctx
We should find a better name for this context at some point. (mutablememctx?)

Differential Revision: https://phab.mercurial-scm.org/D1240
2017-12-07 16:07:06 -08:00
Phil Cohen
d5ed058435 overlayworkingctx: add a no-op `clearunknown()`
We no longer inherit ``workingctx``'s version, but we also don't need to do
anything anymore.

Differential Revision: https://phab.mercurial-scm.org/D1239
2017-12-07 16:07:06 -08:00
Phil Cohen
b24f3aaa75 overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Differential Revision: https://phab.mercurial-scm.org/D1238
2017-12-07 16:07:06 -08:00
Phil Cohen
993b6df471 rebase: add concludememorynode(), and call it when rebasing in-memory
Differential Revision: https://phab.mercurial-scm.org/D1248
2017-12-07 22:35:43 -08:00
Anton Shestakov
80d803c705 hgweb: rewrite template = A and B or C to be a proper ternary operator 2017-12-08 22:27:14 +08:00
Matthieu Laneuville
b5b163535f patch: catch unexpected case in _inlinediff
If operation is neither 'diff.inserted' or 'diff.deleted', label and token won't
be define. This patch explicitely catches that exception.
2017-12-08 16:54:59 +09:00
Matthieu Laneuville
9b54f9af3b patch: reverse _inlinediff output for consistency 2017-12-08 16:47:18 +09:00
Joerg Sonnenberger
b1f2bd10ac phases: drop the list with phase of each rev, always comput phase sets
Change the C implementation of phasecache.loadphaserevs to provide only
the sets for draft and secret phase as well as the number of revisions
seen.

Change the pure Python implementation of the same functino to compute
the sets instead of the list of phases for each revision.

Change phasecache.phase to check the phase sets and assume public if the
revision is in neither draft nor secret set. This is computationally
slightly more expensive.

Change phasecache.getrevset for public() based queries to compute the
set of non-matching revisions and return the result as filtered
fullreposet. A shortcut is taken when no draft or secret revision
exists.

Bump the module version for the changed interface contract.

Overall, this saves around 16 Bytes per revision whenever the phasecache
is used, for the test case in issue5691 it is around 3MB. getrevset()
for a large repository is around 13% slower here, that seems an
acceptable trade off. Performance impact for phase() should be similar.

Differential Revision: https://phab.mercurial-scm.org/D1606
2017-12-06 15:46:41 +01:00
Joerg Sonnenberger
9c25f296a4 transaction: build changes['revs'] as range instead of a set
Revisions are added consecutively, so a range can easily represent them
in the changes list. This saves around 45 Bytes / revision on 64bit
platforms and reduces the memory footprint of issue5691 by 15MB.

Don't copy changes['revs'] in getobsoleted. Ranges have a very efficient
contains implementation already.

Differential Revision: https://phab.mercurial-scm.org/D1615
2017-12-08 01:23:34 +01:00
Augie Fackler
b3191ab441 ui: add diff.showfunc to tweakdefaults
This is a little risky, as I think we can have some encoding weirdness
crop up. showfunc also isn't the most robust feature, but it's still
often useful context...

Differential Revision: https://phab.mercurial-scm.org/D1610
2017-12-06 16:43:07 -05:00
Augie Fackler
0cf992efc2 ui: add curses interface to tweakdefaults
This was part of the original proposal, and while *I* don't like the
curses interface, most users anecdotally seem to greatly prefer it to
plain text interfaces.

Differential Revision: https://phab.mercurial-scm.org/D1609
2017-12-06 16:42:24 -05:00
Boris Feld
8fc5e92851 push: restrict common discovery to the pushed set
This changeset make use of the ability of the set discovery to only search
common changeset for a subset of the repository. Restricting that search to the
pushed set avoid potential waste of time finding out the status of many
unrelated related revision.

Repository with many heads were especially badly affected by this. Here is an
example of findcommonhead discovery for pushing 11 outgoing changeset on a
repository with tens of thousand of unrelated heads. (discovery run over a ssh
link to localhost).

Before:
    queries: 92
    time:    44.1996s

After:
    queries: 3
    time:    0.6938s

A x63 speedup even with a network link without latency.
2017-12-06 23:33:01 +01:00
Boris Feld
cc076020d2 setdiscover: allow to ignore part of the local graph
Currently, the push discovery first determines the full set of common nodes
before looking into what changesets are outgoing. When pushing a specific
subset, this can lead to pathological situations where we search for the status
of thousand of local heads that are unrelated to the requested pushes.

To fix this, we need to teach the discovery to ignores part of the graph. Most
of the necessary pieces were already in place. This changeset just makes them
available to higher level API and tests them.

Change actually impacting pushes are coming in a later changeset.
2017-12-06 22:44:51 +01:00
Boris Feld
8a1502d6d0 upgraderepo: allow extension to register preserved requirements
Some requirement does not directly result from config and needs more advanced
logic to be preserved. The current example is 'largefiles'. We add a hook
point in the upgrade code so that extensions can handle these cases.

The 'largefiles' extension will use it in the next changeset.
2017-12-07 01:51:54 +01:00
Yuya Nishihara
5db2725c37 revset: make follow() accept empty startrev
This is the same behavior as ancestors(emptyset).
2016-09-22 19:41:42 +09:00
Yuya Nishihara
85d4b98f53 revset: alias follow(startrev=rev) to ancestors(rev)
This seems natural given 'log -frREV' (with no file pattern) is equivalent
to 'log -frREV *'.
2016-09-22 19:40:07 +09:00
Yuya Nishihara
08c3b37347 revset: make follow() accept keyword arguments
Also renamed the argument from 'pattern' to 'file' conforming to
followlines().
2016-09-22 19:35:36 +09:00
Yuya Nishihara
3142b0e7d7 revset: make follow() accept multiple startrevs
The diff might look slightly complicated, but the initial "c = repo['.']" was
effective if rev = None.
2016-09-22 19:11:26 +09:00
Yuya Nishihara
d7842061cc dagop: use heap to compute max rev in filectxancestors() 2016-09-22 18:41:51 +09:00
Yuya Nishihara
e49a4312a9 dagop: add smartset interface to filectxancestors()
The original filectx API is kept public since we'll need it to walk ancestor
(rev, match) pairs efficiently. The current implementation scans ancestors
twice for 'hg log -fp FILE'.
2017-10-22 18:57:42 +09:00
Phil Cohen
e206413cfc overlayworkingctx: add _checkexist(path)
This is in preparation to switch this class to inheriting (and being based off
a) `commitctx` instead of a `workingctx`. `filectx` has no `exists` function,
so this is how we'll fall back in that case.

Differential Revision: https://phab.mercurial-scm.org/D1237
2017-12-07 13:20:47 -08:00
Phil Cohen
4cb0fafe39 overlayworkingctx: fix a bad reference to self._path
Differential Revision: https://phab.mercurial-scm.org/D1236
2017-12-07 13:20:47 -08:00
Phil Cohen
4dc892f75b overlayworkingctx: track copy information in the context
We can no longer do so in the dirstate, so add the functions to do so here.

Differential Revision: https://phab.mercurial-scm.org/D1235
2017-12-07 13:20:47 -08:00
Phil Cohen
8024806695 overlayworkingctx: move _wrappedctx out of the constructor
With rebase, we will be setting the _wrappedctx at a different point from the
wctx construction (somewhat later, and possibly several times). Move it to a
public function.

Differential Revision: https://phab.mercurial-scm.org/D1231
2017-12-07 13:20:47 -08:00
Phil Cohen
d99691c52d merge: don't check for unknown files in IMM
Differential Revision: https://phab.mercurial-scm.org/D1214
2017-12-07 13:20:47 -08:00
Jun Wu
e7d2ff6ac8 rebase: enable multidest by default
This was intended to be done by D470. But there was a minor documentation
issue. The feature is quite usable now so it gets formally documented and
enabled.

There is no behavior change for people not using the `SRC` or `ALLSRC` in
rebase destination revset.

.. feature:: Rebase with different destination per source revision

  Previously, rebase only supports one unique destination. Now ``SRC`` and
  ``ALLSRC`` can be used in rebase destination revset to precisely define
  destination per each individual source revision.

  For example, the following command could move some orphaned changesets to
  reasonable new places so they become no longer orphaned::

    hg rebase
      -r 'orphan()-obsolete()'
      -d 'max((successors(max(roots(ALLSRC) & ::SRC)^)-obsolete())::)'

Differential Revision: https://phab.mercurial-scm.org/D1063
2017-10-13 14:08:14 -07:00
Phil Cohen
b85e71bd61 overlayworkingctx: make clean() public
It will be called directly by rebase after concluding a node.

Differential Revision: https://phab.mercurial-scm.org/D1230
2017-12-01 00:07:23 -08:00
Phil Cohen
635c6eaf7f overlayworkingctx: remove flushall()
Differential Revision: https://phab.mercurial-scm.org/D1216
2017-12-01 00:07:23 -08:00
Phil Cohen
da19a4a9f4 merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Differential Revision: https://phab.mercurial-scm.org/D1215
2017-12-01 00:07:23 -08:00
Phil Cohen
d0b4ef96b4 merge: remove calls to flushall()
Since D1105, these are unnecessary since IMM will now never use workers.

Differential Revision: https://phab.mercurial-scm.org/D1213
2017-12-01 00:07:23 -08:00
Phil Cohen
cb5bf40a81 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Merge conflicts might be supported in the future, but for now are kept out of
scope.

Any places where we used to call `flushall()` should be replaced with some kind
of exception. At this point, IMM M1 is no longer supported.

Differential Revision: https://phab.mercurial-scm.org/D1212
2017-12-01 00:07:23 -08:00
Phil Cohen
5992e0fe48 context: switch ctx() use to changectx()
I added `ctx()` to `overlayworkingfilectx`, (and before that, `absentfilectx`),
because `absentfilectx` had reference to this function in its `cmp()` function.

But the standard is actually `changectx()`, and no other class implements
`ctx()`. So let's use the standard name.

(As a result, I'm not sure that part of the `absentfilectx` comparator ever
worked! It was written before I added either function.)

This will be necessary in the next patch.

Differential Revision: https://phab.mercurial-scm.org/D1211
2017-12-01 00:07:23 -08:00
Matthieu Laneuville
14498f2bf5 patch: add within-line color diff capacity
The `diff' command usually writes deletion in red and insertions in green. This
patch adds within-line colors, to highlight which part of the lines differ.
Lines to compare are decided based on their similarity ratio, as computed by
difflib SequenceMatcher, with an arbitrary threshold (0.7) to decide at which
point two lines are considered entirely different (therefore no inline-diff
required).

The current implementation is kept behind an experimental flag in order to test
the effect on performance. In order to activate it, set inline-color-diff to
true in [experimental].
2017-10-26 00:13:38 +09:00