hgext3rd/evolve/__init__.py
author Pulkit Goyal <7895pulkit@gmail.com>
Fri, 19 Jan 2018 17:29:48 +0530
changeset 3467 41ce24cf288d
parent 3466 0a8e3130ad00
child 3468 a3052824101d
permissions -rw-r--r--
utility: move MultipleSuccessorsError from __init__.py The MultipleSuccessorsError is required in multiple modules in upcoming patches, so let's move it to utility first.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     1
# Copyright 2011 Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     2
#                Logilab SA        <contact@logilab.fr>
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     3
#                Pierre-Yves David <pierre-yves.david@ens-lyon.org>
519
9825c7da5b54 ensure all file have a copyright notice
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 517
diff changeset
     4
#                Patrick Mezard <patrick@mezard.eu>
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     5
#
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     6
# This software may be used and distributed according to the terms of the
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     7
# GNU General Public License version 2 or any later version.
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
     8
"""extends Mercurial feature related to Changeset Evolution
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
     9
2292
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    10
This extension:
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    11
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    12
- provides several commands to mutate history and deal with resulting issues,
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    13
- enable the changeset-evolution feature for Mercurial,
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    14
- improves some aspect of the early implementation in Mercurial core,
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    15
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    16
Note that a version dedicated to server usage only (no local working copy) is
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    17
available as 'evolve.serveronly'.
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    18
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    19
While many feature related to changeset evolution are directly handled by core
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    20
this extensions contains significant additions recommended to any user of
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    21
changeset evolution.
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    22
2678
da2b3e5e4f69 docs: some fixes to the help text
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2667
diff changeset
    23
With the extension various evolution events will display warning (new unstable
2292
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    24
changesets, obsolete working copy parent, improved error when accessing hidden
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    25
revision, etc).
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    26
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    27
In addition, the extension contains better discovery protocol for obsolescence
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    28
markers. This means less obs-markers will have to be pushed and pulled around,
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    29
speeding up such operation.
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    30
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    31
Some improvement and bug fixes available in newer version of Mercurial are also
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    32
backported to older version of Mercurial by this extension. Some older
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    33
experimental protocol are also supported for a longer time in the extensions to
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
    34
help people transitioning. (The extensions is currently compatible down to
3141
f9faa5b6f937 compat: mark version 4.1 as the minimum version required
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3124
diff changeset
    35
Mercurial version 4.1).
2311
26d638e419df auto-push: move config help in the extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
    36
2923
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2895
diff changeset
    37
New Config::
2311
26d638e419df auto-push: move config help in the extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
    38
26d638e419df auto-push: move config help in the extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
    39
    [experimental]
26d638e419df auto-push: move config help in the extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
    40
    # Set to control the behavior when pushing draft changesets to a publishing
26d638e419df auto-push: move config help in the extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
    41
    # repository. Possible value:
26d638e419df auto-push: move config help in the extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
    42
    # * ignore: current core behavior (default)
26d638e419df auto-push: move config help in the extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
    43
    # * warn: proceed with the push, but issue a warning
26d638e419df auto-push: move config help in the extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
    44
    # * abort: abort the push
26d638e419df auto-push: move config help in the extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
    45
    auto-publish = ignore
26d638e419df auto-push: move config help in the extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
    46
2521
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2504
diff changeset
    47
    # For some large repository with few markers, the current  for obsolescence
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2504
diff changeset
    48
    # markers discovery can get in the way. You can disable it with the
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2504
diff changeset
    49
    # configuration option below. This means all pushes and pulls will
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2504
diff changeset
    50
    # re-exchange all markers every time.
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2504
diff changeset
    51
    evolution.obsdiscovery = yes
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2504
diff changeset
    52
2460
64cc0b059073 obshashrange: document the experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2443
diff changeset
    53
Obsolescence Markers Discovery Experiment
64cc0b059073 obshashrange: document the experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2443
diff changeset
    54
=========================================
64cc0b059073 obshashrange: document the experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2443
diff changeset
    55
2550
d8a48234efad obshashrange: basic proof reading of the documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2549
diff changeset
    56
We are experimenting with a new protocol to discover common markers between
d8a48234efad obshashrange: basic proof reading of the documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2549
diff changeset
    57
local and remote repositories. This experiment is still at an early stage but
d8a48234efad obshashrange: basic proof reading of the documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2549
diff changeset
    58
is already raising better results than the previous version (when usable).
d8a48234efad obshashrange: basic proof reading of the documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2549
diff changeset
    59
d8a48234efad obshashrange: basic proof reading of the documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2549
diff changeset
    60
"Large" repositories (hundreds of thousand) are currently unsupported. Some key
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3198
diff changeset
    61
algorithm has a naive implementation with too aggressive caching, creating
2460
64cc0b059073 obshashrange: document the experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2443
diff changeset
    62
memory consumption issue (this will get fixed).
64cc0b059073 obshashrange: document the experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2443
diff changeset
    63
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3198
diff changeset
    64
Medium sized repositories works fine, but be prepared for a noticeable initial
2460
64cc0b059073 obshashrange: document the experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2443
diff changeset
    65
cache filling. for the Mercurial repository, this is around 20 seconds
64cc0b059073 obshashrange: document the experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2443
diff changeset
    66
64cc0b059073 obshashrange: document the experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2443
diff changeset
    67
The following config control the experiment::
64cc0b059073 obshashrange: document the experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2443
diff changeset
    68
64cc0b059073 obshashrange: document the experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2443
diff changeset
    69
  [experimental]
64cc0b059073 obshashrange: document the experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2443
diff changeset
    70
64cc0b059073 obshashrange: document the experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2443
diff changeset
    71
  # enable new discovery protocol
64cc0b059073 obshashrange: document the experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2443
diff changeset
    72
  # (needed on both client and server)
64cc0b059073 obshashrange: document the experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2443
diff changeset
    73
  obshashrange = yes
64cc0b059073 obshashrange: document the experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2443
diff changeset
    74
3368
7310f3ef6dee caches: add a 'auto' option for obshashrange cache warming
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3365
diff changeset
    75
  # control cache warming at the end of transaction
7310f3ef6dee caches: add a 'auto' option for obshashrange cache warming
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3365
diff changeset
    76
  #   yes:  warm all caches at the end of each transaction,
7310f3ef6dee caches: add a 'auto' option for obshashrange cache warming
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3365
diff changeset
    77
  #   off:  warm no caches at the end of transaction,
3369
c7fbb79cd366 caches: switch to 'auto' warming by default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3368
diff changeset
    78
  #   auto: warm cache at the end of server side transaction (default).
3368
7310f3ef6dee caches: add a 'auto' option for obshashrange cache warming
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3365
diff changeset
    79
  obshashrange.warm-cache = 'auto'
2475
84982b441e82 documentation: recomment using blackbox with the obshashrange experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2465
diff changeset
    80
3368
7310f3ef6dee caches: add a 'auto' option for obshashrange cache warming
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3365
diff changeset
    81
The initial cache warming might be a bit slow. To make sure it is build you
7310f3ef6dee caches: add a 'auto' option for obshashrange cache warming
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3365
diff changeset
    82
can run one of the following commands in your repository::
2715
61e73c8fe169 obshashrange: add cache warming instruction to the documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2714
diff changeset
    83
3368
7310f3ef6dee caches: add a 'auto' option for obshashrange cache warming
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3365
diff changeset
    84
    $ hg debugupdatecache # mercurial 4.3 and above
7310f3ef6dee caches: add a 'auto' option for obshashrange cache warming
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3365
diff changeset
    85
    $ hg debugobshashrange --rev 'head() # mercurial 4.2 and below
2715
61e73c8fe169 obshashrange: add cache warming instruction to the documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2714
diff changeset
    86
2678
da2b3e5e4f69 docs: some fixes to the help text
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2667
diff changeset
    87
It is recommended to enable the blackbox extension. It gathers useful data about
2687
4a02781d90ce evolve: fix documentation formatting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2678
diff changeset
    88
the experiment. It is shipped with Mercurial so no extra install is needed::
2475
84982b441e82 documentation: recomment using blackbox with the obshashrange experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2465
diff changeset
    89
84982b441e82 documentation: recomment using blackbox with the obshashrange experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2465
diff changeset
    90
    [extensions]
84982b441e82 documentation: recomment using blackbox with the obshashrange experiment
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2465
diff changeset
    91
    blackbox =
2493
3ee8e9a12f41 doc: add documentation about effectflag experiment
Boris Feld <boris.feld@octobus.net>
parents: 2488
diff changeset
    92
2550
d8a48234efad obshashrange: basic proof reading of the documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2549
diff changeset
    93
Finally some extra options are available to help tame the experimental
2687
4a02781d90ce evolve: fix documentation formatting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2678
diff changeset
    94
implementation of some of the algorithms::
2504
d95006fe4dd0 stablerange: use last recently used caching for revisions associated to ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2493
diff changeset
    95
d95006fe4dd0 stablerange: use last recently used caching for revisions associated to ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2493
diff changeset
    96
    [experimental]
d95006fe4dd0 stablerange: use last recently used caching for revisions associated to ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2493
diff changeset
    97
    # restrict cache size to reduce memory consumption
d95006fe4dd0 stablerange: use last recently used caching for revisions associated to ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2493
diff changeset
    98
    obshashrange.lru-size = 2000 # default is 2000
d95006fe4dd0 stablerange: use last recently used caching for revisions associated to ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2493
diff changeset
    99
2551
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2550
diff changeset
   100
    # automatically disable obshashrange related computation and capabilities
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2550
diff changeset
   101
    # if the repository has more than N revisions.  This is meant to help large
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3198
diff changeset
   102
    # server deployment to enable the feature on smaller repositories while
2551
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2550
diff changeset
   103
    # ensuring no large repository will get affected.
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2550
diff changeset
   104
    obshashrange.max-revs = 100000 # default is None
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2550
diff changeset
   105
2714
7eff426f999b evolve: explain how to disable markers discovery in the documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2699
diff changeset
   106
For very large repositories. it is currently recommended to disable obsmarkers
7eff426f999b evolve: explain how to disable markers discovery in the documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2699
diff changeset
   107
discovery (Make sure you follow release announcement to know when you can turn
2923
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2895
diff changeset
   108
it back on)::
2714
7eff426f999b evolve: explain how to disable markers discovery in the documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2699
diff changeset
   109
7eff426f999b evolve: explain how to disable markers discovery in the documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2699
diff changeset
   110
    [experimental]
7eff426f999b evolve: explain how to disable markers discovery in the documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2699
diff changeset
   111
    evolution.obsdiscovery = no
7eff426f999b evolve: explain how to disable markers discovery in the documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2699
diff changeset
   112
2493
3ee8e9a12f41 doc: add documentation about effectflag experiment
Boris Feld <boris.feld@octobus.net>
parents: 2488
diff changeset
   113
Effect Flag Experiment
3ee8e9a12f41 doc: add documentation about effectflag experiment
Boris Feld <boris.feld@octobus.net>
parents: 2488
diff changeset
   114
======================
3ee8e9a12f41 doc: add documentation about effectflag experiment
Boris Feld <boris.feld@octobus.net>
parents: 2488
diff changeset
   115
2689
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   116
Evolve also records what changed between two evolutions of a changeset. For
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   117
example, having this information is helpful to understand what changed between
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   118
an obsolete changeset and its tipmost successors.
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   119
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   120
Evolve currently records:
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   121
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   122
    - Meta changes, user, date
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   123
    - Tree movement, branch and parent, did the changeset moved?
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   124
    - Description, was the commit description edited
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   125
    - Diff, was there apart from potential diff change due to rebase a change in the diff?
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   126
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   127
These flags are lightweight and can be combined, so it's easy to see if 4
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   128
evolutions of the same changeset has just updated the description or if the
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   129
content changed and you need to review again the diff.
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   130
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   131
The effect flag recording is enabled by default in Evolve 6.4.0 so you have
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   132
nothing to do to enjoy it. Now every new evolution that you create will have
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   133
the effect flag attached.
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   134
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   135
The following config control the effect flag recording::
2493
3ee8e9a12f41 doc: add documentation about effectflag experiment
Boris Feld <boris.feld@octobus.net>
parents: 2488
diff changeset
   136
3ee8e9a12f41 doc: add documentation about effectflag experiment
Boris Feld <boris.feld@octobus.net>
parents: 2488
diff changeset
   137
  [experimental]
2689
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   138
  # uncomment to deactivate the registration of effect flags in obs markers
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   139
  # evolution.effect-flags = false
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   140
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   141
You can display the effect flags with the command obslog, so if you have a
2923
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2895
diff changeset
   142
changeset and you update only the message, you will see::
2689
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   143
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   144
    $ hg commit -m "WIP
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   145
    $ hg commit -m "A better commit message!"
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   146
    $ hg obslog .
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   147
   @  8e9045855628 (3133) A better commit message!
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   148
   |
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   149
   x  7863a5bb5763 (3132) WIP
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   150
        rewritten(description) by Boris Feld <boris.feld@octobus.net> (Fri Jun 02 12:00:24 2017 +0200) as 8e9045855628
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   151
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   152
Servers does not need to activate the effect flag recording. Effect flags that
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   153
you create will not cause interference with other clients or servers without
9e84b407fde5 doc: update effect flag documentation
Boris Feld <boris.feld@octobus.net>
parents: 2687
diff changeset
   154
the effect flag recording.
2556
d5b97b5dec5b doc: document the evolve templates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   155
d5b97b5dec5b doc: document the evolve templates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   156
Templates
d5b97b5dec5b doc: document the evolve templates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   157
=========
d5b97b5dec5b doc: document the evolve templates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   158
d5b97b5dec5b doc: document the evolve templates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   159
Evolve ship several templates that you can use to have a better visibility
d5b97b5dec5b doc: document the evolve templates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   160
about your obs history:
d5b97b5dec5b doc: document the evolve templates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   161
d5b97b5dec5b doc: document the evolve templates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   162
  - precursors, for each obsolete changeset show the closest visible
d5b97b5dec5b doc: document the evolve templates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   163
    precursors.
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3198
diff changeset
   164
  - successors, for each obsolete changeset show the closest visible
2556
d5b97b5dec5b doc: document the evolve templates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   165
    successors. It is useful when your working directory is obsolete to see
2678
da2b3e5e4f69 docs: some fixes to the help text
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2667
diff changeset
   166
    what are its successors. This information can also be retrieved with the
2556
d5b97b5dec5b doc: document the evolve templates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   167
    obslog command and the --all option.
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   168
  - obsfate, for each obsolete changeset display a line summarizing what
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3198
diff changeset
   169
    changed between the changeset and its successors. Depending on the
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   170
    verbosity level (-q and -v) it display the changeset successors, the users
2678
da2b3e5e4f69 docs: some fixes to the help text
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2667
diff changeset
   171
    that created the obsmarkers and the date range of these changes.
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   172
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   173
    The template itself is not complex, the data are basically a list of
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   174
    successortset. Each successorset is a dict with these fields:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   175
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   176
      - "verb", how did the revision changed, pruned or rewritten for the moment
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   177
      - "users" a sorted list of users that have create obs marker between current
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   178
        changeset and one of its successor
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   179
      - "min_date" the tiniest date of the first obs marker between current
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   180
        changeset and one of its successor
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   181
      - "max_date" the biggest date between current changeset and one of its
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   182
        successor
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   183
      - "successors" a sorted list of locally know successors node ids
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   184
      - "markers" the raw list of changesets.
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
   185
"""
2049
b81d3775006b evolve: move extension metadata in their own module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2048
diff changeset
   186
1414
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   187
evolutionhelptext = """
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   188
Obsolescence markers make it possible to mark changesets that have been
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   189
deleted or superset in a new version of the changeset.
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   190
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   191
Unlike the previous way of handling such changes, by stripping the old
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   192
changesets from the repository, obsolescence markers can be propagated
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   193
between repositories. This allows for a safe and simple way of exchanging
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   194
mutable history and altering it after the fact. Changeset phases are
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   195
respected, such that only draft and secret changesets can be altered (see
1709
989ed2f30d41 help: fix evolution hg phases reference
timeless@gmail.com
parents: 1702
diff changeset
   196
:hg:`help phases` for details).
1414
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   197
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   198
Obsolescence is tracked using "obsolete markers", a piece of metadata
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   199
tracking which changesets have been made obsolete, potential successors for
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   200
a given changeset, the moment the changeset was marked as obsolete, and the
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   201
user who performed the rewriting operation. The markers are stored
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   202
separately from standard changeset data can be exchanged without any of the
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   203
precursor changesets, preventing unnecessary exchange of obsolescence data.
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   204
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   205
The complete set of obsolescence markers describes a history of changeset
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   206
modifications that is orthogonal to the repository history of file
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   207
modifications. This changeset history allows for detection and automatic
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   208
resolution of edge cases arising from multiple users rewriting the same part
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   209
of history concurrently.
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   210
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   211
Current feature status
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   212
======================
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   213
1710
aec233d3cafd help: fix evolution help grammar
timeless@gmail.com
parents: 1709
diff changeset
   214
This feature is still in development.  If you see this help, you have enabled an
1414
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   215
extension that turned this feature on.
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   216
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   217
Obsolescence markers will be exchanged between repositories that explicitly
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   218
assert support for the obsolescence feature (this can currently only be done
2782
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   219
via an extension).
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   220
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   221
Instability
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   222
==========
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   223
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   224
(note: the vocabulary is in the process of being updated)
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   225
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   226
Rewriting changesets might introduce instability (currently 'trouble').
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   227
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   228
There are two main kinds of instability: orphaning and diverging.
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   229
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   230
Orphans are changesets left behind when their ancestors are rewritten, (currently: 'unstable').
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   231
Divergence has two variants:
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   232
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   233
* Content-divergence occurs when independent rewrites of the same changesets
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   234
  lead to different results. (currently: 'divergent')
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   235
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   236
* Phase-divergence occurs when the old (obsolete) version of a changeset
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   237
  becomes public. (currently: 'bumped')
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   238
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   239
If it possible to prevent local creation of orphans by using the following config::
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   240
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   241
    [experimental]
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   242
    evolution=createmarkers,allnewcommands,exchange
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   243
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   244
You can also enable that option explicitly::
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   245
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   246
    [experimental]
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   247
    evolution=createmarkers,allnewcommands,allowunstable,exchange
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   248
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   249
or simply::
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   250
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   251
    [experimental]
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   252
    evolution=all
2bd0b0996cfb evolve: document the various instability/troubles
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2772
diff changeset
   253
""".strip()
1414
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
   254
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
   255
import sys
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
   256
import collections
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
   257
import struct
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
   258
1678
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1677
diff changeset
   259
try:
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1677
diff changeset
   260
    import StringIO as io
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1677
diff changeset
   261
    StringIO = io.StringIO
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1677
diff changeset
   262
except ImportError:
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1677
diff changeset
   263
    import io
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1677
diff changeset
   264
    StringIO = io.StringIO
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
   265
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
   266
1825
377d94d6c889 evolve: proactively detect bad version early
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1824
diff changeset
   267
try:
377d94d6c889 evolve: proactively detect bad version early
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1824
diff changeset
   268
    from mercurial import registrar
377d94d6c889 evolve: proactively detect bad version early
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1824
diff changeset
   269
    registrar.templatekeyword # new in hg-3.8
377d94d6c889 evolve: proactively detect bad version early
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1824
diff changeset
   270
except ImportError:
2049
b81d3775006b evolve: move extension metadata in their own module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2048
diff changeset
   271
    from . import metadata
2895
e4ee0b6170e9 compat: make it more clear that evolve need Mercurial >= minversion
Philippe Pepiot <phil@philpep.org>
parents: 2859
diff changeset
   272
    raise ImportError('evolve needs Mercurial version %s or above' %
2049
b81d3775006b evolve: move extension metadata in their own module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2048
diff changeset
   273
                      min(metadata.testedwith.split()))
1825
377d94d6c889 evolve: proactively detect bad version early
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1824
diff changeset
   274
670
97ce1f801309 evolve: drop unused import
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 663
diff changeset
   275
import mercurial
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   276
from mercurial import util
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   277
1834
f23a97d14895 compat: drop compat for older wireproto implementation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1833
diff changeset
   278
from mercurial import obsolete
f23a97d14895 compat: drop compat for older wireproto implementation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1833
diff changeset
   279
if not obsolete._enabled:
f23a97d14895 compat: drop compat for older wireproto implementation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1833
diff changeset
   280
    obsolete._enabled = True
617
469befc27b26 detect incompatibility with future mercurial 2.5
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 616
diff changeset
   281
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   282
from mercurial import (
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   283
    bookmarks as bookmarksmod,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   284
    cmdutil,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   285
    commands,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   286
    context,
2465
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   287
    dirstate,
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   288
    error,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   289
    extensions,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   290
    help,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   291
    hg,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   292
    lock as lockmod,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   293
    node,
2524
d912380ec685 evolve: fix import order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2521
diff changeset
   294
    obsolete,
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   295
    patch,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   296
    phases,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   297
    revset,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   298
    scmutil,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   299
)
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
   300
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
   301
from mercurial.commands import mergetoolopts
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   302
from mercurial.i18n import _
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   303
from mercurial.node import nullid
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   304
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
   305
from . import (
2245
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2123
diff changeset
   306
    checkheads,
2525
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents: 2524
diff changeset
   307
    compat,
2123
cf7b4ab31f0c split: move the debugcommand into a dedicated module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2122
diff changeset
   308
    debugcmd,
2772
394b836e475b commands: rewrite the 'evocommands' module to 'cmdrewrite'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2766
diff changeset
   309
    cmdrewrite,
3457
82e9f9603b1b evolvestate: rename the file to state.py and class name to cmdstate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3456
diff changeset
   310
    state,
3461
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3460
diff changeset
   311
    evolvecmd,
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
   312
    exthelper,
2049
b81d3775006b evolve: move extension metadata in their own module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2048
diff changeset
   313
    metadata,
2294
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2293
diff changeset
   314
    obscache,
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2293
diff changeset
   315
    obsexchange,
2524
d912380ec685 evolve: fix import order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2521
diff changeset
   316
    obshistory,
2756
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2755
diff changeset
   317
    rewriteutil,
2286
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2275
diff changeset
   318
    safeguard,
2524
d912380ec685 evolve: fix import order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2521
diff changeset
   319
    templatekw,
2047
ce39d0f9976d serveronly: give the sub extension a way to access to the 'evolve' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2044
diff changeset
   320
    utility,
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
   321
)
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
   322
3373
3ff0da45d4c7 evolve: use compat.TROUBLES to show troubles in user interface
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3369
diff changeset
   323
TROUBLES = compat.TROUBLES
2049
b81d3775006b evolve: move extension metadata in their own module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2048
diff changeset
   324
__version__ = metadata.__version__
b81d3775006b evolve: move extension metadata in their own module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2048
diff changeset
   325
testedwith = metadata.testedwith
b81d3775006b evolve: move extension metadata in their own module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2048
diff changeset
   326
minimumhgversion = metadata.minimumhgversion
b81d3775006b evolve: move extension metadata in their own module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2048
diff changeset
   327
buglink = metadata.buglink
1838
6942750831bb serveronly: deduplicate code with the main evolve extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1836
diff changeset
   328
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
   329
# Flags for enabling optional parts of evolve
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
   330
commandopt = 'allnewcommands'
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
   331
2047
ce39d0f9976d serveronly: give the sub extension a way to access to the 'evolve' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2044
diff changeset
   332
obsexcmsg = utility.obsexcmsg
2763
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   333
shorttemplate = utility.shorttemplate
1838
6942750831bb serveronly: deduplicate code with the main evolve extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1836
diff changeset
   334
2404
c07f752137f4 label: rename 'evolve.short_node' to 'evolve.node'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2403
diff changeset
   335
colortable = {'evolve.node': 'yellow',
2337
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
   336
              'evolve.user': 'green',
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
   337
              'evolve.rev': 'blue',
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
   338
              'evolve.short_description': '',
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
   339
              'evolve.date': 'cyan',
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
   340
              'evolve.current_rev': 'bold',
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
   341
              'evolve.verb': '',
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
   342
              }
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
   343
820
a9a66143e2ec exchange: actually use _pushkeyescape fallback
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 819
diff changeset
   344
_pack = struct.pack
1597
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
   345
_unpack = struct.unpack
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   346
1296
23819e1d61fd evolve: add -i flag to amend command
Laurent Charignon <lcharignon@fb.com>
parents: 1281
diff changeset
   347
aliases, entry = cmdutil.findcmd('commit', commands.table)
2772
394b836e475b commands: rewrite the 'evocommands' module to 'cmdrewrite'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2766
diff changeset
   348
commitopts3 = cmdrewrite.commitopts3
394b836e475b commands: rewrite the 'evocommands' module to 'cmdrewrite'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2766
diff changeset
   349
interactiveopt = cmdrewrite.interactiveopt
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   350
rewrite = rewriteutil.rewrite
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2716
diff changeset
   351
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   352
# This extension contains the following code
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   353
#
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   354
# - Extension Helper code
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   355
# - Obsolescence cache
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   356
# - ...
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   357
# - Older format compat
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   358
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
   359
eh = exthelper.exthelper()
2123
cf7b4ab31f0c split: move the debugcommand into a dedicated module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2122
diff changeset
   360
eh.merge(debugcmd.eh)
2053
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2051
diff changeset
   361
eh.merge(obsexchange.eh)
2245
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2123
diff changeset
   362
eh.merge(checkheads.eh)
2286
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2275
diff changeset
   363
eh.merge(safeguard.eh)
2294
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2293
diff changeset
   364
eh.merge(obscache.eh)
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2414
diff changeset
   365
eh.merge(obshistory.eh)
2485
e6ecd35e99ec refactor: extract templates into a new file
Boris Feld <boris.feld@octobus.net>
parents: 2481
diff changeset
   366
eh.merge(templatekw.eh)
2525
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents: 2524
diff changeset
   367
eh.merge(compat.eh)
2772
394b836e475b commands: rewrite the 'evocommands' module to 'cmdrewrite'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2766
diff changeset
   368
eh.merge(cmdrewrite.eh)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   369
uisetup = eh.final_uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   370
extsetup = eh.final_extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   371
reposetup = eh.final_reposetup
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
   372
cmdtable = eh.cmdtable
3080
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3074
diff changeset
   373
configtable = eh.configtable
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3074
diff changeset
   374
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3074
diff changeset
   375
# Configuration
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3074
diff changeset
   376
eh.configitem('experimental', 'evolutioncommands')
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3074
diff changeset
   377
eh.configitem('experimental', 'evolution.allnewcommands')
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3074
diff changeset
   378
eh.configitem('experimental', 'prunestrip')
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3074
diff changeset
   379
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3074
diff changeset
   380
# hack around because we need an actual default there
3093
9c04bd928056 compat: conditionally access config item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3080
diff changeset
   381
if configtable:
9c04bd928056 compat: conditionally access config item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3080
diff changeset
   382
    configtable['experimental']['evolution.allnewcommands'].default = None
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   383
2465
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   384
# pre hg 4.0 compat
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   385
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   386
if not util.safehasattr(dirstate.dirstate, 'parentchange'):
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   387
    import contextlib
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   388
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   389
    @contextlib.contextmanager
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   390
    def parentchange(self):
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   391
        '''Context manager for handling dirstate parents.
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   392
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   393
        If an exception occurs in the scope of the context manager,
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   394
        the incoherent dirstate won't be written when wlock is
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   395
        released.
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   396
        '''
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   397
        self._parentwriters += 1
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   398
        yield
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   399
        # Typically we want the "undo" step of a context manager in a
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   400
        # finally block so it happens even when an exception
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   401
        # occurs. In this case, however, we only want to decrement
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   402
        # parentwriters if the code in the with statement exits
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   403
        # normally, so we don't have a try/finally here on purpose.
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   404
        self._parentwriters -= 1
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   405
    dirstate.dirstate.parentchange = parentchange
479646a3873a deprecation: fix dirstate.beginparentchange deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2460
diff changeset
   406
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   407
#####################################################################
1213
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   408
### Option configuration                                          ###
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   409
#####################################################################
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   410
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   411
@eh.reposetup # must be the first of its kin.
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   412
def _configureoptions(ui, repo):
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   413
    # If no capabilities are specified, enable everything.
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   414
    # This is so existing evolve users don't need to change their config.
3185
0c64d0242ac2 config: clarify that config is only enabled on the repository is it setup for
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3155
diff changeset
   415
    evolveopts = repo.ui.configlist('experimental', 'evolution')
1213
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   416
    if not evolveopts:
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   417
        evolveopts = ['all']
3185
0c64d0242ac2 config: clarify that config is only enabled on the repository is it setup for
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3155
diff changeset
   418
        repo.ui.setconfig('experimental', 'evolution', evolveopts, 'evolve')
3149
79a926b557f1 compat: drop support for older exchange protocol
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3141
diff changeset
   419
    if obsolete.isenabled(repo, 'exchange'):
79a926b557f1 compat: drop support for older exchange protocol
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3141
diff changeset
   420
        repo.ui.setconfig('server', 'bundle1', False)
1213
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   421
3365
911c91ce686f caches: record 'desc' attribute on transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   422
    class trdescrepo(repo.__class__):
911c91ce686f caches: record 'desc' attribute on transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   423
911c91ce686f caches: record 'desc' attribute on transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   424
        def transaction(self, desc, *args, **kwargs):
911c91ce686f caches: record 'desc' attribute on transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   425
            tr = super(trdescrepo, self).transaction(desc, *args, **kwargs)
911c91ce686f caches: record 'desc' attribute on transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   426
            tr.desc = desc
911c91ce686f caches: record 'desc' attribute on transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   427
            return tr
911c91ce686f caches: record 'desc' attribute on transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   428
911c91ce686f caches: record 'desc' attribute on transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   429
    repo.__class__ = trdescrepo
911c91ce686f caches: record 'desc' attribute on transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   430
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   431
@eh.uisetup
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   432
def _configurecmdoptions(ui):
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   433
    # Unregister evolve commands if the command capability is not specified.
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   434
    #
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   435
    # This must be in the same function as the option configuration above to
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   436
    # guarantee it happens after the above configuration, but before the
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   437
    # extsetup functions.
3080
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3074
diff changeset
   438
    evolvecommands = ui.configlist('experimental', 'evolutioncommands', [])
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   439
    evolveopts = ui.configlist('experimental', 'evolution')
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   440
    if evolveopts and (commandopt not in evolveopts and
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   441
                       'all' not in evolveopts):
1441
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   442
        # We build whitelist containing the commands we want to enable
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   443
        whitelist = set()
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   444
        for cmd in evolvecommands:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   445
            matchingevolvecommands = [e for e in cmdtable.keys() if cmd in e]
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   446
            if not matchingevolvecommands:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   447
                raise error.Abort(_('unknown command: %s') % cmd)
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   448
            elif len(matchingevolvecommands) > 1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
   449
                msg = _('ambiguous command specification: "%s" matches %r')
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
   450
                raise error.Abort(msg % (cmd, matchingevolvecommands))
1441
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   451
            else:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   452
                whitelist.add(matchingevolvecommands[0])
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   453
        for disabledcmd in set(cmdtable) - whitelist:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   454
            del cmdtable[disabledcmd]
1213
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   455
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   456
#####################################################################
805
66c02a2e8e2f prune: wrap mercurial internal to add parent information in prune marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 804
diff changeset
   457
### experimental behavior                                         ###
66c02a2e8e2f prune: wrap mercurial internal to add parent information in prune marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 804
diff changeset
   458
#####################################################################
66c02a2e8e2f prune: wrap mercurial internal to add parent information in prune marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 804
diff changeset
   459
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   460
getrevs = obsolete.getrevs
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   461
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   462
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   463
### Additional Utilities                                          ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   464
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   465
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   466
# This section contains a lot of small utility function and method
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   467
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   468
# - Function to create markers
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   469
# - useful alias pstatus and pdiff (should probably go in evolve)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   470
# - "troubles" method on changectx
1661
48232457b704 Spelling: through
timeless@gmail.com
parents: 1659
diff changeset
   471
# - function to travel through the obsolescence graph
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   472
# - function to find useful changeset to stabilize
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   473
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   474
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   475
### Useful alias
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   476
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   477
@eh.uisetup
2953
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   478
def setupparentcommand(ui):
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   479
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   480
    _alias, statuscmd = cmdutil.findcmd('status', commands.table)
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   481
    pstatusopts = [o for o in statuscmd[1] if o[1] != 'rev']
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   482
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   483
    @eh.command('pstatus', pstatusopts)
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   484
    def pstatus(ui, repo, *args, **kwargs):
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   485
        """show status combining committed and uncommited changes
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   486
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   487
        This show the combined status of the current working copy parent commit and
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   488
        the uncommitted change in the working copy itself. The status displayed
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   489
        match the content of the commit that a bare :hg:`amend` will creates.
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   490
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   491
        See :hg:`help status` for details."""
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   492
        kwargs['rev'] = ['.^']
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   493
        return statuscmd[0](ui, repo, *args, **kwargs)
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   494
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   495
    _alias, diffcmd = cmdutil.findcmd('diff', commands.table)
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   496
    pdiffopts = [o for o in diffcmd[1] if o[1] != 'rev']
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   497
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   498
    @eh.command('pdiff', pdiffopts)
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   499
    def pdiff(ui, repo, *args, **kwargs):
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   500
        """show diff combining committed and uncommited changes
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   501
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   502
        This show the combined diff of the current working copy parent commit and
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   503
        the uncommitted change in the working copy itself. The diff displayed
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   504
        match the content of the commit that a bare :hg:`amend` will creates.
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   505
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   506
        See :hg:`help diff` for details."""
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   507
        kwargs['rev'] = ['.^']
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   508
        return diffcmd[0](ui, repo, *args, **kwargs)
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   509
b9aea9e48203 commands: upgrade pdiff and pstatus to full commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2952
diff changeset
   510
@eh.uisetup
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   511
def _installalias(ui):
3072
ec97e7b11119 config: stop passing useless default value to config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3068
diff changeset
   512
    if ui.config('alias', 'odiff') is None:
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   513
        ui.setconfig('alias', 'odiff',
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
   514
                     "diff --hidden --rev 'limit(precursors(.),1)' --rev .",
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
   515
                     'evolve')
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   516
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   517
### Troubled revset symbol
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   518
2925
9efedcedd9dd evolve: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
   519
@eh.revset('troubled()')
594
7f89b31fcb26 merge bumped rename
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 592 593
diff changeset
   520
def revsettroubled(repo, subset, x):
2925
9efedcedd9dd evolve: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
   521
    """Changesets with troubles.
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   522
    """
993
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
   523
    revset.getargs(x, 0, 0, 'troubled takes no arguments')
1381
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
   524
    troubled = set()
2845
9fc6a4615ae5 revset: unstable volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2844
diff changeset
   525
    troubled.update(getrevs(repo, 'orphan'))
2847
a1805a65ce21 revset: bumped volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2846
diff changeset
   526
    troubled.update(getrevs(repo, 'phasedivergent'))
2846
9c019996bce0 revset: divergent volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2845
diff changeset
   527
    troubled.update(getrevs(repo, 'contentdivergent'))
1381
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
   528
    troubled = revset.baseset(troubled)
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
   529
    troubled.sort() # set is non-ordered, enforce order
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
   530
    return subset & troubled
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   531
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   532
### Obsolescence graph
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   533
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   534
# XXX SOME MAJOR CLEAN UP TO DO HERE XXX
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   535
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   536
def _precursors(repo, s):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   537
    """Precursor of a changeset"""
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   538
    cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   539
    nm = repo.changelog.nodemap
2840
dfad30be866c context: precursors was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2838
diff changeset
   540
    markerbysubj = repo.obsstore.predecessors
1377
01bdeb847f81 evolve: avoid creating changectx object in _precursors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1376
diff changeset
   541
    node = repo.changelog.node
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   542
    for r in s:
1377
01bdeb847f81 evolve: avoid creating changectx object in _precursors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1376
diff changeset
   543
        for p in markerbysubj.get(node(r), ()):
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   544
            pr = nm.get(p[0])
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   545
            if pr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   546
                cs.add(pr)
1383
cf62abb62941 evolve: move 'precursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1382
diff changeset
   547
    cs -= repo.changelog.filteredrevs # nodemap has no filtering
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   548
    return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   549
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   550
def _allprecursors(repo, s):  # XXX we need a better naming
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   551
    """transitive precursors of a subset"""
1378
a127f0f3bf5f evolve: avoid creating changectx object in _allprecursors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1377
diff changeset
   552
    node = repo.changelog.node
a127f0f3bf5f evolve: avoid creating changectx object in _allprecursors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1377
diff changeset
   553
    toproceed = [node(r) for r in s]
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   554
    seen = set()
2840
dfad30be866c context: precursors was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2838
diff changeset
   555
    allsubjects = repo.obsstore.predecessors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   556
    while toproceed:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   557
        nc = toproceed.pop()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   558
        for mark in allsubjects.get(nc, ()):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   559
            np = mark[0]
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   560
            if np not in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   561
                seen.add(np)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   562
                toproceed.append(np)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   563
    nm = repo.changelog.nodemap
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   564
    cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   565
    for p in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   566
        pr = nm.get(p)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   567
        if pr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   568
            cs.add(pr)
1384
64c8b8c27811 evolve: move 'allprecursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1383
diff changeset
   569
    cs -= repo.changelog.filteredrevs # nodemap has no filtering
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   570
    return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   571
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   572
def _successors(repo, s):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   573
    """Successors of a changeset"""
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   574
    cs = set()
1379
693cdcd809f2 evolve: avoid creating changectx object in _successors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1378
diff changeset
   575
    node = repo.changelog.node
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   576
    nm = repo.changelog.nodemap
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   577
    markerbyobj = repo.obsstore.successors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   578
    for r in s:
1379
693cdcd809f2 evolve: avoid creating changectx object in _successors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1378
diff changeset
   579
        for p in markerbyobj.get(node(r), ()):
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   580
            for sub in p[1]:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   581
                sr = nm.get(sub)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   582
                if sr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   583
                    cs.add(sr)
1385
c2584407afbf evolve: move 'successors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1384
diff changeset
   584
    cs -= repo.changelog.filteredrevs # nodemap has no filtering
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   585
    return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   586
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   587
def _allsuccessors(repo, s, haltonflags=0):  # XXX we need a better naming
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   588
    """transitive successors of a subset
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   589
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   590
    haltonflags allows to provide flags which prevent the evaluation of a
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   591
    marker.  """
1380
43dcf62237be evolve: avoid creating changectx object in _allsuccessors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1379
diff changeset
   592
    node = repo.changelog.node
43dcf62237be evolve: avoid creating changectx object in _allsuccessors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1379
diff changeset
   593
    toproceed = [node(r) for r in s]
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   594
    seen = set()
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   595
    allobjects = repo.obsstore.successors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   596
    while toproceed:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   597
        nc = toproceed.pop()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   598
        for mark in allobjects.get(nc, ()):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   599
            if mark[2] & haltonflags:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   600
                continue
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   601
            for sub in mark[1]:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   602
                if sub == nullid:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   603
                    continue # should not be here!
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   604
                if sub not in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   605
                    seen.add(sub)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   606
                    toproceed.append(sub)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   607
    nm = repo.changelog.nodemap
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   608
    cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   609
    for s in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   610
        sr = nm.get(s)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   611
        if sr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   612
            cs.add(sr)
1386
b5eaec8a53d0 evolve: move 'allsuccessors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1385
diff changeset
   613
    cs -= repo.changelog.filteredrevs # nodemap has no filtering
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   614
    return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   615
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   616
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   617
### Extending revset and template                                 ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   618
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   619
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   620
# this section add several useful revset symbol not yet in core.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   621
# they are subject to changes
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   622
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   623
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   624
### XXX I'm not sure this revset is useful
2925
9efedcedd9dd evolve: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
   625
@eh.revset('suspended()')
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   626
def revsetsuspended(repo, subset, x):
2925
9efedcedd9dd evolve: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
   627
    """Obsolete changesets with non-obsolete descendants.
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   628
    """
1307
677c5da57b9c evolve: remove unused variables
Laurent Charignon <lcharignon@fb.com>
parents: 1306
diff changeset
   629
    revset.getargs(x, 0, 0, 'suspended takes no arguments')
1382
c431f827f366 evolve: move 'suspended()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1381
diff changeset
   630
    suspended = revset.baseset(getrevs(repo, 'suspended'))
c431f827f366 evolve: move 'suspended()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1381
diff changeset
   631
    suspended.sort()
c431f827f366 evolve: move 'suspended()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1381
diff changeset
   632
    return subset & suspended
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   633
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   634
2925
9efedcedd9dd evolve: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
   635
@eh.revset('precursors(set)')
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   636
def revsetprecursors(repo, subset, x):
2925
9efedcedd9dd evolve: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
   637
    """Immediate precursors of changesets in set.
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   638
    """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
   639
    s = revset.getset(repo, revset.fullreposet(repo), x)
1383
cf62abb62941 evolve: move 'precursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1382
diff changeset
   640
    s = revset.baseset(_precursors(repo, s))
cf62abb62941 evolve: move 'precursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1382
diff changeset
   641
    s.sort()
cf62abb62941 evolve: move 'precursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1382
diff changeset
   642
    return subset & s
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   643
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   644
2925
9efedcedd9dd evolve: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
   645
@eh.revset('allprecursors(set)')
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   646
def revsetallprecursors(repo, subset, x):
2925
9efedcedd9dd evolve: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
   647
    """Transitive precursors of changesets in set.
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   648
    """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
   649
    s = revset.getset(repo, revset.fullreposet(repo), x)
1384
64c8b8c27811 evolve: move 'allprecursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1383
diff changeset
   650
    s = revset.baseset(_allprecursors(repo, s))
64c8b8c27811 evolve: move 'allprecursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1383
diff changeset
   651
    s.sort()
64c8b8c27811 evolve: move 'allprecursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1383
diff changeset
   652
    return subset & s
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   653
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   654
2925
9efedcedd9dd evolve: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
   655
@eh.revset('successors(set)')
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   656
def revsetsuccessors(repo, subset, x):
2925
9efedcedd9dd evolve: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
   657
    """Immediate successors of changesets in set.
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   658
    """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
   659
    s = revset.getset(repo, revset.fullreposet(repo), x)
1385
c2584407afbf evolve: move 'successors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1384
diff changeset
   660
    s = revset.baseset(_successors(repo, s))
c2584407afbf evolve: move 'successors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1384
diff changeset
   661
    s.sort()
c2584407afbf evolve: move 'successors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1384
diff changeset
   662
    return subset & s
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   663
2925
9efedcedd9dd evolve: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
   664
@eh.revset('allsuccessors(set)')
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   665
def revsetallsuccessors(repo, subset, x):
2925
9efedcedd9dd evolve: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
   666
    """Transitive successors of changesets in set.
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   667
    """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
   668
    s = revset.getset(repo, revset.fullreposet(repo), x)
1386
b5eaec8a53d0 evolve: move 'allsuccessors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1385
diff changeset
   669
    s = revset.baseset(_allsuccessors(repo, s))
b5eaec8a53d0 evolve: move 'allsuccessors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1385
diff changeset
   670
    s.sort()
b5eaec8a53d0 evolve: move 'allsuccessors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1385
diff changeset
   671
    return subset & s
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   672
1399
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
   673
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   674
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   675
### Various trouble warning                                       ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   676
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   677
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   678
# This section take care of issue warning to the user when troubles appear
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   679
3363
380fa6e8baf2 evolve: don't show working directory obsolete message if we were on it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3362
diff changeset
   680
def _warnobsoletewc(ui, repo, prevnode=None, wasobs=None):
2289
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   681
    rev = repo['.']
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   682
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   683
    if not rev.obsolete():
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   684
        return
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   685
3363
380fa6e8baf2 evolve: don't show working directory obsolete message if we were on it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3362
diff changeset
   686
    if rev.node() == prevnode and wasobs:
380fa6e8baf2 evolve: don't show working directory obsolete message if we were on it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3362
diff changeset
   687
        return
2289
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   688
    msg = _("working directory parent is obsolete! (%s)\n")
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   689
    shortnode = node.short(rev.node())
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   690
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   691
    ui.warn(msg % shortnode)
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   692
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   693
    # Check that evolve is activated for performance reasons
3455
f7ecb11d71bb update: show "use 'hg evolve' to..." hint iff evolve command enabled
Martin von Zweigbergk <martinvonz@google.com>
parents: 3427
diff changeset
   694
    evolvecommandenabled = any('evolve' in e for e in cmdtable)
f7ecb11d71bb update: show "use 'hg evolve' to..." hint iff evolve command enabled
Martin von Zweigbergk <martinvonz@google.com>
parents: 3427
diff changeset
   695
    if ui.quiet or not evolvecommandenabled:
2289
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   696
        return
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   697
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   698
    # Show a warning for helping the user to solve the issue
2488
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
   699
    reason, successors = obshistory._getobsfateandsuccs(repo, rev.node())
2289
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   700
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   701
    if reason == 'pruned':
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   702
        solvemsg = _("use 'hg evolve' to update to its parent successor")
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   703
    elif reason == 'diverged':
3154
406992d0d611 evolve: rename --contentdivergent flag to --content-divergent
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   704
        debugcommand = "hg evolve --list --content-divergent"
2289
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   705
        basemsg = _("%s has diverged, use '%s' to resolve the issue")
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   706
        solvemsg = basemsg % (shortnode, debugcommand)
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   707
    elif reason == 'superseed':
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   708
        msg = _("use 'hg evolve' to update to its successor: %s")
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   709
        solvemsg = msg % successors[0]
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   710
    elif reason == 'superseed_split':
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   711
        msg = _("use 'hg evolve' to update to its tipmost successor: %s")
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   712
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   713
        if len(successors) <= 2:
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   714
            solvemsg = msg % ", ".join(successors)
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   715
        else:
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   716
            firstsuccessors = ", ".join(successors[:2])
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   717
            remainingnumber = len(successors) - 2
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   718
            successorsmsg = _("%s and %d more") % (firstsuccessors, remainingnumber)
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   719
            solvemsg = msg % successorsmsg
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   720
    else:
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   721
        raise ValueError(reason)
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   722
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
   723
    ui.warn("(%s)\n" % solvemsg)
1527
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
   724
2293
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   725
if util.safehasattr(context, '_filterederror'):
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   726
    # if < hg-4.2 we do not update the message
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   727
    @eh.wrapfunction(context, '_filterederror')
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   728
    def evolve_filtererror(original, repo, changeid):
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   729
        """build an exception to be raised about a filtered changeid
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   730
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   731
        This is extracted in a function to help extensions (eg: evolve) to
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   732
        experiment with various message variants."""
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   733
        if repo.filtername.startswith('visible'):
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   734
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   735
            unfilteredrepo = repo.unfiltered()
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   736
            rev = unfilteredrepo[changeid]
2488
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
   737
            reason, successors = obshistory._getobsfateandsuccs(unfilteredrepo, rev.node())
2293
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   738
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   739
            # Be more precise in cqse the revision is superseed
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   740
            if reason == 'superseed':
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   741
                reason = _("successor: %s") % successors[0]
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   742
            elif reason == 'superseed_split':
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   743
                if len(successors) <= 2:
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   744
                    reason = _("successors: %s") % ", ".join(successors)
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   745
                else:
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   746
                    firstsuccessors = ", ".join(successors[:2])
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   747
                    remainingnumber = len(successors) - 2
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   748
                    successorsmsg = _("%s and %d more") % (firstsuccessors, remainingnumber)
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   749
                    reason = _("successors: %s") % successorsmsg
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   750
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   751
            msg = _("hidden revision '%s'") % changeid
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   752
            hint = _('use --hidden to access hidden revisions; %s') % reason
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   753
            return error.FilteredRepoLookupError(msg, hint=hint)
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   754
        msg = _("filtered revision '%s' (not in '%s' subset)")
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   755
        msg %= (changeid, repo.filtername)
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   756
        return error.FilteredRepoLookupError(msg)
1659b42c28c2 compat: only install the better filtered message for mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2292
diff changeset
   757
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   758
@eh.wrapcommand("update")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   759
@eh.wrapcommand("pull")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   760
def wrapmayobsoletewc(origfn, ui, repo, *args, **opts):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   761
    """Warn that the working directory parent is an obsolete changeset"""
3363
380fa6e8baf2 evolve: don't show working directory obsolete message if we were on it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3362
diff changeset
   762
    ctx = repo['.']
380fa6e8baf2 evolve: don't show working directory obsolete message if we were on it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3362
diff changeset
   763
    node = ctx.node()
380fa6e8baf2 evolve: don't show working directory obsolete message if we were on it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3362
diff changeset
   764
    isobs = ctx.obsolete()
380fa6e8baf2 evolve: don't show working directory obsolete message if we were on it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3362
diff changeset
   765
1452
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
   766
    def warnobsolete():
3363
380fa6e8baf2 evolve: don't show working directory obsolete message if we were on it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3362
diff changeset
   767
        _warnobsoletewc(ui, repo, node, isobs)
1452
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
   768
    wlock = None
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
   769
    try:
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
   770
        wlock = repo.wlock()
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
   771
        repo._afterlock(warnobsolete)
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
   772
        res = origfn(ui, repo, *args, **opts)
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
   773
    finally:
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
   774
        lockmod.release(wlock)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   775
    return res
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   776
1527
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
   777
@eh.wrapcommand("parents")
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
   778
def wrapparents(origfn, ui, repo, *args, **opts):
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
   779
    res = origfn(ui, repo, *args, **opts)
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
   780
    _warnobsoletewc(ui, repo)
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
   781
    return res
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
   782
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   783
# XXX this could wrap transaction code
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   784
# XXX (but this is a bit a layer violation)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   785
@eh.wrapcommand("commit")
763
966e2659e989 import: warn about new unstable changesets
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 762
diff changeset
   786
@eh.wrapcommand("import")
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   787
@eh.wrapcommand("push")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   788
@eh.wrapcommand("pull")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   789
@eh.wrapcommand("graft")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   790
@eh.wrapcommand("phase")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   791
@eh.wrapcommand("unbundle")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   792
def warnobserrors(orig, ui, repo, *args, **kwargs):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   793
    """display warning is the command resulted in more instable changeset"""
3427
cbeee8d31d58 trouble-reports: yield to in code reporting of new troubles
Martin von Zweigbergk <martinvonz@google.com>
parents: 3395
diff changeset
   794
    # hg < 4.4 does not have the feature built in. bail out otherwise.
cbeee8d31d58 trouble-reports: yield to in code reporting of new troubles
Martin von Zweigbergk <martinvonz@google.com>
parents: 3395
diff changeset
   795
    if util.safehasattr(scmutil, '_reportstroubledchangesets'):
cbeee8d31d58 trouble-reports: yield to in code reporting of new troubles
Martin von Zweigbergk <martinvonz@google.com>
parents: 3395
diff changeset
   796
        return orig(ui, repo, *args, **kwargs)
cbeee8d31d58 trouble-reports: yield to in code reporting of new troubles
Martin von Zweigbergk <martinvonz@google.com>
parents: 3395
diff changeset
   797
658
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
   798
    # part of the troubled stuff may be filtered (stash ?)
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
   799
    # This needs a better implementation but will probably wait for core.
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
   800
    filtered = repo.changelog.filteredrevs
2845
9fc6a4615ae5 revset: unstable volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2844
diff changeset
   801
    priorunstables = len(set(getrevs(repo, 'orphan')) - filtered)
2847
a1805a65ce21 revset: bumped volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2846
diff changeset
   802
    priorbumpeds = len(set(getrevs(repo, 'phasedivergent')) - filtered)
2846
9c019996bce0 revset: divergent volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2845
diff changeset
   803
    priordivergents = len(set(getrevs(repo, 'contentdivergent')) - filtered)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   804
    ret = orig(ui, repo, *args, **kwargs)
658
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
   805
    filtered = repo.changelog.filteredrevs
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   806
    newunstables = \
2845
9fc6a4615ae5 revset: unstable volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2844
diff changeset
   807
        len(set(getrevs(repo, 'orphan')) - filtered) - priorunstables
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   808
    newbumpeds = \
2847
a1805a65ce21 revset: bumped volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2846
diff changeset
   809
        len(set(getrevs(repo, 'phasedivergent')) - filtered) - priorbumpeds
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   810
    newdivergents = \
2846
9c019996bce0 revset: divergent volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2845
diff changeset
   811
        len(set(getrevs(repo, 'contentdivergent')) - filtered) - priordivergents
2854
66796d7b5415 warning: rename unstable warning message
Boris Feld <boris.feld@octobus.net>
parents: 2847
diff changeset
   812
66796d7b5415 warning: rename unstable warning message
Boris Feld <boris.feld@octobus.net>
parents: 2847
diff changeset
   813
    base_msg = _('%i new %s changesets\n')
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   814
    if newunstables > 0:
2854
66796d7b5415 warning: rename unstable warning message
Boris Feld <boris.feld@octobus.net>
parents: 2847
diff changeset
   815
        ui.warn(base_msg % (newunstables, compat.TROUBLES['ORPHAN']))
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
   816
    if newbumpeds > 0:
2855
1db0137297f4 warning: rename bumped warning message
Boris Feld <boris.feld@octobus.net>
parents: 2854
diff changeset
   817
        ui.warn(base_msg % (newbumpeds, compat.TROUBLES['PHASEDIVERGENT']))
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
   818
    if newdivergents > 0:
2857
0c286d054bcd warning: use 'divergent', not 'contentdivergent' on old Mercurial
Martin von Zweigbergk <martinvonz@google.com>
parents: 2856
diff changeset
   819
        ui.warn(base_msg % (newdivergents, compat.TROUBLES['CONTENTDIVERGENT']))
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   820
    return ret
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   821
1122
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   822
@eh.wrapfunction(mercurial.exchange, 'push')
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   823
def push(orig, repo, *args, **opts):
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
   824
    """Add a hint for "hg evolve" when troubles make push fails
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   825
    """
1122
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   826
    try:
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   827
        return orig(repo, *args, **opts)
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
   828
    except error.Abort as ex:
1122
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   829
        hint = _("use 'hg evolve' to get a stable history "
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   830
                 "or --force to ignore warnings")
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   831
        if (len(ex.args) >= 1
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   832
            and ex.args[0].startswith('push includes ')
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   833
            and ex.hint is None):
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   834
            ex.hint = hint
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   835
        raise
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   836
788
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
   837
def summaryhook(ui, repo):
3457
82e9f9603b1b evolvestate: rename the file to state.py and class name to cmdstate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3456
diff changeset
   838
    evolvestate = state.cmdstate(repo)
82e9f9603b1b evolvestate: rename the file to state.py and class name to cmdstate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3456
diff changeset
   839
    if evolvestate:
1640
bbf897714e70 evolve: add --continue note to summary
timeless@gmail.com
parents: 1639
diff changeset
   840
        # i18n: column positioning for "hg summary"
3198
390c87f8c65d summaryhook: respect -q flag
Martin von Zweigbergk <martinvonz@google.com>
parents: 3197
diff changeset
   841
        ui.status(_('evolve: (evolve --continue)\n'))
788
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
   842
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
   843
@eh.extsetup
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
   844
def obssummarysetup(ui):
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
   845
    cmdutil.summaryhooks.add('evolve', summaryhook)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   846
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   847
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   848
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   849
### Core Other extension compat                                   ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   850
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   851
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   852
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   853
@eh.extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   854
def _rebasewrapping(ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   855
    # warning about more obsolete
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   856
    try:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   857
        rebase = extensions.find('rebase')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   858
        if rebase:
572
dc107acd0bd2 adapt to core rebase support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 571
diff changeset
   859
            extensions.wrapcommand(rebase.cmdtable, 'rebase', warnobserrors)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   860
    except KeyError:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
   861
        pass # rebase not found
678
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
   862
    try:
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
   863
        histedit = extensions.find('histedit')
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
   864
        if histedit:
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
   865
            extensions.wrapcommand(histedit.cmdtable, 'histedit', warnobserrors)
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
   866
    except KeyError:
1575
0c8548df67fe merge with stable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1568 1574
diff changeset
   867
        pass # histedit not found
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   868
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   869
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   870
### Old Evolve extension content                                  ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   871
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   872
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   873
### new command
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   874
#############################
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
   875
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   876
@eh.uisetup
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   877
def _installimportobsolete(ui):
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   878
    entry = cmdutil.findcmd('import', commands.table)[1]
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   879
    entry[1].append(('', 'obsolete', False,
1162
5c07f464981e help: fix typo in help for 'obsolete' option added to import command
Mike Edgar <adgar@google.com>
parents: 1160
diff changeset
   880
                    _('mark the old node as obsoleted by '
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   881
                      'the created commit')))
930
cac35bef8aee import: --obsolete flag for automatic obsolescence marker creation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 927
diff changeset
   882
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   883
@eh.wrapfunction(mercurial.cmdutil, 'tryimportone')
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   884
def tryimportone(orig, ui, repo, hunk, parents, opts, *args, **kwargs):
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   885
    extracted = patch.extract(ui, hunk)
1830
53aae4b4e791 compat: drop compatibility layer for 'tryimportone'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1829
diff changeset
   886
    expected = extracted.get('nodeid')
1115
cc19b6400dae import: fix the "is None" check for the Node
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1109
diff changeset
   887
    if expected is not None:
1055
cfe1b9d3e5d9 import: handle patch with no node information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1054
diff changeset
   888
        expected = node.bin(expected)
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   889
    oldextract = patch.extract
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   890
    try:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   891
        patch.extract = lambda ui, hunk: extracted
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   892
        ret = orig(ui, repo, hunk, parents, opts, *args, **kwargs)
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   893
    finally:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   894
        patch.extract = oldextract
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   895
    created = ret[1]
1055
cfe1b9d3e5d9 import: handle patch with no node information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1054
diff changeset
   896
    if (opts['obsolete'] and None not in (created, expected)
cfe1b9d3e5d9 import: handle patch with no node information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1054
diff changeset
   897
        and created != expected):
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   898
            tr = repo.transaction('import-obs')
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   899
            try:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   900
                metadata = {'user': ui.username()}
1054
93e920feff5e import: compare binary node with binary node when using --obsolete
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1052
diff changeset
   901
                repo.obsstore.create(tr, expected, (created,),
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   902
                                     metadata=metadata)
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   903
                tr.close()
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   904
            finally:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   905
                tr.release()
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   906
    return ret
930
cac35bef8aee import: --obsolete flag for automatic obsolescence marker creation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 927
diff changeset
   907
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   908
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   909
def _deprecatealias(oldalias, newalias):
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   910
    '''Deprecates an alias for a command in favour of another
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   911
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   912
    Creates a new entry in the command table for the old alias. It creates a
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   913
    wrapper that has its synopsis set to show that is has been deprecated.
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   914
    The documentation will be replace with a pointer to the new alias.
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   915
    If a user invokes the command a deprecation warning will be printed and
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   916
    the command of the *new* alias will be invoked.
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   917
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   918
    This function is loosely based on the extensions.wrapcommand function.
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   919
    '''
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   920
    try:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   921
        aliases, entry = cmdutil.findcmd(newalias, cmdtable)
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   922
    except error.UnknownCommand:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   923
        # Commands may be disabled
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   924
        return
1680
7caa5f2040c5 py3: use items() instead of iteritems()
timeless@gmail.com
parents: 1679
diff changeset
   925
    for alias, e in cmdtable.items():
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   926
        if e is entry:
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   927
            break
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   928
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   929
    synopsis = '(DEPRECATED)'
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   930
    if len(entry) > 2:
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   931
        fn, opts, _syn = entry
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   932
    else:
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   933
        fn, opts, = entry
1496
62aa11956a40 evolve: _() should not contain %
timeless@mozdev.org
parents: 1495
diff changeset
   934
    deprecationwarning = _('%s have been deprecated in favor of %s\n') % (
62aa11956a40 evolve: _() should not contain %
timeless@mozdev.org
parents: 1495
diff changeset
   935
        oldalias, newalias)
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
   936
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   937
    def newfn(*args, **kwargs):
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   938
        ui = args[0]
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   939
        ui.warn(deprecationwarning)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   940
        util.checksignature(fn)(*args, **kwargs)
2952
f1bbc536602a gup/gdown: properly mark these commands as deprecated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2925
diff changeset
   941
    newfn.__doc__ = deprecationwarning + ' (DEPRECATED)'
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
   942
    cmdwrapper = eh.command(oldalias, opts, synopsis)
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   943
    cmdwrapper(newfn)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   944
895
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
   945
@eh.extsetup
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
   946
def deprecatealiases(ui):
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
   947
    _deprecatealias('gup', 'next')
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
   948
    _deprecatealias('gdown', 'previous')
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   949
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   950
def _singlesuccessor(repo, p):
1369
4ed67cce8c23 evolve: properly evolve stacked unstable with --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1364
diff changeset
   951
    """returns p (as rev) if not obsolete or its unique latest successors
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   952
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   953
    fail if there are no such successor"""
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   954
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   955
    if not p.obsolete():
1369
4ed67cce8c23 evolve: properly evolve stacked unstable with --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1364
diff changeset
   956
        return p.rev()
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   957
    obs = repo[p]
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   958
    ui = repo.ui
2693
f4b0351fa813 evolve: adapt to function migrate to obsutil
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2689
diff changeset
   959
    newer = compat.successorssets(repo, obs.node())
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
   960
    # search of a parent which is not killed
1440
afe46c3b15db evolve: clarify code in _singlesuccessor
Laurent Charignon <lcharignon@fb.com>
parents: 1428
diff changeset
   961
    while not newer:
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
   962
        ui.debug("stabilize target %s is plain dead,"
1145
fb51113a1c08 evolve: add the missing newline to output messages where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 1144
diff changeset
   963
                 " trying to stabilize on its parent\n" %
1144
b2a78b950a51 evolve: add the missing argument to a debug statement
Matt Harbison <matt_harbison@yahoo.com>
parents: 1143
diff changeset
   964
                 obs)
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
   965
        obs = obs.parents()[0]
2693
f4b0351fa813 evolve: adapt to function migrate to obsutil
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2689
diff changeset
   966
        newer = compat.successorssets(repo, obs.node())
1428
20a3b0b27bfe evolve: raise MultipleSuccessorsError when computing dependency for split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1427
diff changeset
   967
    if len(newer) > 1 or len(newer[0]) > 1:
3467
41ce24cf288d utility: move MultipleSuccessorsError from __init__.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   968
        raise utility.MultipleSuccessorsError(newer)
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
   969
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   970
    return repo[newer[0][0]].rev()
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   971
1361
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
   972
def builddependencies(repo, revs):
1411
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
   973
    """returns dependency graphs giving an order to solve instability of revs
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
   974
    (see _orderrevs for more information on usage)"""
1361
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
   975
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   976
    # For each troubled revision we keep track of what instability if any should
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   977
    # be resolved in order to resolve it. Example:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   978
    # dependencies = {3: [6], 6:[]}
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   979
    # Means that: 6 has no dependency, 3 depends on 6 to be solved
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   980
    dependencies = {}
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   981
    # rdependencies is the inverted dict of dependencies
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   982
    rdependencies = collections.defaultdict(set)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   983
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   984
    for r in revs:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   985
        dependencies[r] = set()
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   986
        for p in repo[r].parents():
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
   987
            try:
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
   988
                succ = _singlesuccessor(repo, p)
3467
41ce24cf288d utility: move MultipleSuccessorsError from __init__.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   989
            except utility.MultipleSuccessorsError as exc:
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
   990
                dependencies[r] = exc.successorssets
1418
ed9a8b1ee9bd evolve: fix error in builddependencies
Laurent Charignon <lcharignon@fb.com>
parents: 1415
diff changeset
   991
                continue
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   992
            if succ in revs:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   993
                dependencies[r].add(succ)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
   994
                rdependencies[succ].add(r)
1361
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
   995
    return dependencies, rdependencies
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
   996
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
   997
1411
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
   998
def _orderrevs(repo, revs):
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
   999
    """Compute an ordering to solve instability for the given revs
1361
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
  1000
1571
0e8936e7cb89 evolve: improve the confusing docstring for _orderrevs()
Greg Ward <greg@gerg.ca>
parents: 1570
diff changeset
  1001
    revs is a list of unstable revisions.
0e8936e7cb89 evolve: improve the confusing docstring for _orderrevs()
Greg Ward <greg@gerg.ca>
parents: 1570
diff changeset
  1002
0e8936e7cb89 evolve: improve the confusing docstring for _orderrevs()
Greg Ward <greg@gerg.ca>
parents: 1570
diff changeset
  1003
    Returns the same revisions ordered to solve their instability from the
1361
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
  1004
    bottom to the top of the stack that the stabilization process will produce
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
  1005
    eventually.
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
  1006
1571
0e8936e7cb89 evolve: improve the confusing docstring for _orderrevs()
Greg Ward <greg@gerg.ca>
parents: 1570
diff changeset
  1007
    This ensures the minimal number of stabilizations, as we can stabilize each
0e8936e7cb89 evolve: improve the confusing docstring for _orderrevs()
Greg Ward <greg@gerg.ca>
parents: 1570
diff changeset
  1008
    revision on its final stabilized destination.
1361
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
  1009
    """
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
  1010
    # Step 1: Build the dependency graph
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
  1011
    dependencies, rdependencies = builddependencies(repo, revs)
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1012
    # Step 2: Build the ordering
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1013
    # Remove the revisions with no dependency(A) and add them to the ordering.
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1014
    # Removing these revisions leads to new revisions with no dependency (the
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1015
    # one depending on A) that we can remove from the dependency graph and add
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1016
    # to the ordering. We progress in a similar fashion until the ordering is
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1017
    # built
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1018
    solvablerevs = collections.deque([r for r in sorted(dependencies.keys())
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1019
                                      if not dependencies[r]])
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1020
    ordering = []
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1021
    while solvablerevs:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1022
        rev = solvablerevs.popleft()
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1023
        for dependent in rdependencies[rev]:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1024
            dependencies[dependent].remove(rev)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1025
            if not dependencies[dependent]:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1026
                solvablerevs.append(dependent)
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1027
        del dependencies[rev]
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1028
        ordering.append(rev)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1029
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1030
    ordering.extend(sorted(dependencies))
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1031
    return ordering
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1032
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1033
@eh.command(
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1034
    '^evolve|stabilize|solve',
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1035
    [('n', 'dry-run', False,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1036
      _('do not perform actions, just print what would be done')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1037
     ('', 'confirm', False,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1038
      _('ask for confirmation before performing the action')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1039
     ('A', 'any', False,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1040
      _('also consider troubled changesets unrelated to current working '
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1041
        'directory')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1042
     ('r', 'rev', [], _('solves troubles of these revisions')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1043
     ('', 'bumped', False, _('solves only bumped changesets')),
3155
b237c1c6dc19 evolve: rename --phasedivergent flag to --phase-divergent
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3154
diff changeset
  1044
     ('', 'phase-divergent', False, _('solves only phase-divergent changesets')),
2859
2a228fb6c23e evolve: undo change from "divergent" to "phasedivergent" for --divergent
Martin von Zweigbergk <martinvonz@google.com>
parents: 2858
diff changeset
  1045
     ('', 'divergent', False, _('solves only divergent changesets')),
3154
406992d0d611 evolve: rename --contentdivergent flag to --content-divergent
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
  1046
     ('', 'content-divergent', False, _('solves only content-divergent changesets')),
2834
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2803
diff changeset
  1047
     ('', 'unstable', False, _('solves only unstable changesets')),
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2803
diff changeset
  1048
     ('', 'orphan', False, _('solves only orphan changesets (default)')),
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1049
     ('a', 'all', False, _('evolve all troubled changesets related to the '
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1050
                           'current  working directory and its descendants')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1051
     ('c', 'continue', False, _('continue an interrupted evolution')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1052
     ('l', 'list', False, 'provide details on troubled changesets in the repo'),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1053
    ] + mergetoolopts,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1054
    _('[OPTIONS]...')
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1055
)
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
  1056
def evolve(ui, repo, **opts):
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1057
    """solve troubled changesets in your repository
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1058
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1059
    Modifying history can lead to various types of troubled changesets:
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1060
    unstable, bumped, or divergent. The evolve command resolves your troubles
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1061
    by executing one of the following actions:
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1062
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1063
    - update working copy to a successor
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1064
    - rebase an unstable changeset
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1065
    - extract the desired changes from a bumped changeset
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1066
    - fuse divergent changesets back together
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1067
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1068
    If you pass no arguments, evolve works in automatic mode: it will execute a
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1069
    single action to reduce instability related to your working copy. There are
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1070
    two cases for this action. First, if the parent of your working copy is
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1071
    obsolete, evolve updates to the parent's successor. Second, if the working
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1072
    copy parent is not obsolete but has obsolete predecessors, then evolve
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1073
    determines if there is an unstable changeset that can be rebased onto the
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1074
    working copy parent in order to reduce instability.
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1075
    If so, evolve rebases that changeset. If not, evolve refuses to guess your
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1076
    intention, and gives a hint about what you might want to do next.
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1077
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1078
    Any time evolve creates a changeset, it updates the working copy to the new
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1079
    changeset. (Currently, every successful evolve operation involves an update
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1080
    as well; this may change in future.)
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1081
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1082
    Automatic mode only handles common use cases. For example, it avoids taking
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1083
    action in the case of ambiguity, and it ignores unstable changesets that
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1084
    are not related to your working copy.
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3198
diff changeset
  1085
    It also refuses to solve bumped or divergent changesets unless you
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3198
diff changeset
  1086
    explicitly request such behavior (see below).
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1087
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1088
    Eliminating all instability around your working copy may require multiple
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1089
    invocations of :hg:`evolve`. Alternately, use ``--all`` to recursively
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1090
    select and evolve all unstable changesets that can be rebased onto the
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1091
    working copy parent.
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1092
    This is more powerful than successive invocations, since ``--all`` handles
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1093
    ambiguous cases (e.g. unstable changesets with multiple children) by
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1094
    evolving all branches.
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1095
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1096
    When your repository cannot be handled by automatic mode, you might need to
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1097
    use ``--rev`` to specify a changeset to evolve. For example, if you have
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1098
    an unstable changeset that is not related to the working copy parent,
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1099
    you could use ``--rev`` to evolve it. Or, if some changeset has multiple
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1100
    unstable children, evolve in automatic mode refuses to guess which one to
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1101
    evolve; you have to use ``--rev`` in that case.
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1102
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1103
    Alternately, ``--any`` makes evolve search for the next evolvable changeset
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1104
    regardless of whether it is related to the working copy parent.
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1105
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1106
    You can supply multiple revisions to evolve multiple troubled changesets
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1107
    in a single invocation. In revset terms, ``--any`` is equivalent to ``--rev
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1108
    first(unstable())``. ``--rev`` and ``--all`` are mutually exclusive, as are
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1109
    ``--rev`` and ``--any``.
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1110
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1111
    ``hg evolve --any --all`` is useful for cleaning up instability across all
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1112
    branches, letting evolve figure out the appropriate order and destination.
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1113
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1114
    When you have troubled changesets that are not unstable, :hg:`evolve`
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1115
    refuses to consider them unless you specify the category of trouble you
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1116
    wish to resolve, with ``--bumped`` or ``--divergent``. These options are
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1117
    currently mutually exclusive with each other and with ``--unstable``
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1118
    (the default). You can combine ``--bumped`` or ``--divergent`` with
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1119
    ``--rev``, ``--all``, or ``--any``.
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
  1120
1634
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
  1121
    You can also use the evolve command to list the troubles affecting your
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
  1122
    repository by using the --list flag. You can choose to display only some
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
  1123
    categories of troubles with the --unstable, --divergent or --bumped flags.
269
6c6bb7a23bb5 stabilize: improve unstable selection heuristic
Patrick Mezard <patrick@mezard.eu>
parents: 268
diff changeset
  1124
    """
145
928f217c1701 stabilize: stabilize my topological branch only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 142
diff changeset
  1125
3466
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1126
    opts = evolvecmd._checkevolveopts(repo, opts)
1325
1fe3da0b4601 evolve: add --rev option to the evolve command
Laurent Charignon <lcharignon@fb.com>
parents: 1324
diff changeset
  1127
    # Options
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1128
    contopt = opts['continue']
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1129
    anyopt = opts['any']
704
2ec7c3673679 evolve: add --all argument.
Levi Bard <levi@unity3d.com>
parents: 703
diff changeset
  1130
    allopt = opts['all']
1318
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
  1131
    startnode = repo['.']
703
a246b02499d9 evolve: extract evolve --any implementation into a function.
Levi Bard <levi@unity3d.com>
parents: 663
diff changeset
  1132
    dryrunopt = opts['dry_run']
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1133
    confirmopt = opts['confirm']
1325
1fe3da0b4601 evolve: add --rev option to the evolve command
Laurent Charignon <lcharignon@fb.com>
parents: 1324
diff changeset
  1134
    revopt = opts['rev']
2834
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2803
diff changeset
  1135
3155
b237c1c6dc19 evolve: rename --phasedivergent flag to --phase-divergent
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3154
diff changeset
  1136
    troublecategories = ['phase_divergent', 'content_divergent', 'orphan']
3154
406992d0d611 evolve: rename --contentdivergent flag to --content-divergent
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
  1137
    specifiedcategories = [t.replace('_', '')
406992d0d611 evolve: rename --contentdivergent flag to --content-divergent
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
  1138
                           for t in troublecategories
406992d0d611 evolve: rename --contentdivergent flag to --content-divergent
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
  1139
                           if opts[t]]
3386
2a51107e60cf evolve: add a utility fn to check validity of opts passed to `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3385
diff changeset
  1140
    if opts['list']:
3068
8adf34767c29 pager: add support to `hg evolve --list`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2953
diff changeset
  1141
        compat.startpager(ui, 'evolve')
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1142
        evolvecmd.listtroubles(ui, repo, specifiedcategories, **opts)
1634
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
  1143
        return
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
  1144
2834
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2803
diff changeset
  1145
    targetcat = 'orphan'
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1146
    if 1 < len(specifiedcategories):
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1147
        msg = _('cannot specify more than one trouble category to solve (yet)')
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1148
        raise error.Abort(msg)
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1149
    elif len(specifiedcategories) == 1:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1150
        targetcat = specifiedcategories[0]
1409
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1151
    elif repo['.'].obsolete():
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1152
        displayer = cmdutil.show_changeset(ui, repo,
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1153
                                           {'template': shorttemplate})
1409
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1154
        # no args and parent is obsolete, update to successors
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1155
        try:
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1156
            ctx = repo[_singlesuccessor(repo, repo['.'])]
3467
41ce24cf288d utility: move MultipleSuccessorsError from __init__.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
  1157
        except utility.MultipleSuccessorsError as exc:
1409
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1158
            repo.ui.write_err('parent is obsolete with multiple successors:\n')
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1159
            for ln in exc.successorssets:
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1160
                for n in ln:
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1161
                    displayer.show(repo[n])
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1162
            return 2
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1163
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1164
        ui.status(_('update:'))
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1165
        if not ui.quiet:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1166
            displayer.show(ctx)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1167
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1168
        if dryrunopt:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1169
            return 0
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1170
        res = hg.update(repo, ctx.rev())
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1171
        if ctx != startnode:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1172
            ui.status(_('working directory is now at %s\n') % ctx)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1173
        return res
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1174
986
c1f8ece4182d evolve: add --tool option so we don't have to use HGMERGE
Greg Ward <greg@gerg.ca>
parents: 985
diff changeset
  1175
    ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'evolve')
1323
603104c880f7 evolve: simplify the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1322
diff changeset
  1176
    troubled = set(repo.revs('troubled()'))
145
928f217c1701 stabilize: stabilize my topological branch only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 142
diff changeset
  1177
1318
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
  1178
    # Progress handling
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
  1179
    seen = 1
1323
603104c880f7 evolve: simplify the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1322
diff changeset
  1180
    count = allopt and len(troubled) or 1
1319
8376fe35ebda evolve: add new variable and comment
Laurent Charignon <lcharignon@fb.com>
parents: 1318
diff changeset
  1181
    showprogress = allopt
1318
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
  1182
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
  1183
    def progresscb():
1325
1fe3da0b4601 evolve: add --rev option to the evolve command
Laurent Charignon <lcharignon@fb.com>
parents: 1324
diff changeset
  1184
        if revopt or allopt:
1624
081605c2e9b6 evolve: mark progress units for translation
Anton Shestakov <av6@dwimlabs.net>
parents: 1623
diff changeset
  1185
            ui.progress(_('evolve'), seen, unit=_('changesets'), total=count)
1099
bac4e0bc9f6a evolve: write a status message when the working directory changes
David Soria Parra <davidsp@fb.com>
parents: 1067
diff changeset
  1186
1319
8376fe35ebda evolve: add new variable and comment
Laurent Charignon <lcharignon@fb.com>
parents: 1318
diff changeset
  1187
    # Continuation handling
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1188
    if contopt:
3457
82e9f9603b1b evolvestate: rename the file to state.py and class name to cmdstate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3456
diff changeset
  1189
        evolvestate = state.cmdstate(repo)
82e9f9603b1b evolvestate: rename the file to state.py and class name to cmdstate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3456
diff changeset
  1190
        if not evolvestate:
1597
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
  1191
            raise error.Abort('no evolve to continue')
3457
82e9f9603b1b evolvestate: rename the file to state.py and class name to cmdstate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3456
diff changeset
  1192
        evolvestate.load()
82e9f9603b1b evolvestate: rename the file to state.py and class name to cmdstate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3456
diff changeset
  1193
        orig = repo[evolvestate['current']]
3385
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1194
        with repo.wlock(), repo.lock():
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1195
            ctx = orig
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1196
            source = ctx.extra().get('source')
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1197
            extra = {}
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1198
            if source:
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1199
                extra['source'] = source
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1200
                extra['intermediate-source'] = ctx.hex()
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1201
            else:
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1202
                extra['source'] = ctx.hex()
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1203
            user = ctx.user()
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1204
            date = ctx.date()
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1205
            message = ctx.description()
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1206
            ui.status(_('evolving %d:%s "%s"\n') % (ctx.rev(), ctx,
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1207
                                                    message.split('\n', 1)[0]))
3388
be41e4740a25 evolve: use phases.new-commit config to retain phase information (issue5720)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3386
diff changeset
  1208
            targetphase = max(ctx.phase(), phases.draft)
be41e4740a25 evolve: use phases.new-commit config to retain phase information (issue5720)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3386
diff changeset
  1209
            overrides = {('phases', 'new-commit'): targetphase}
be41e4740a25 evolve: use phases.new-commit config to retain phase information (issue5720)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3386
diff changeset
  1210
be41e4740a25 evolve: use phases.new-commit config to retain phase information (issue5720)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3386
diff changeset
  1211
            with repo.ui.configoverride(overrides, 'evolve-continue'):
be41e4740a25 evolve: use phases.new-commit config to retain phase information (issue5720)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3386
diff changeset
  1212
                node = repo.commit(text=message, user=user,
be41e4740a25 evolve: use phases.new-commit config to retain phase information (issue5720)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3386
diff changeset
  1213
                                   date=date, extra=extra)
be41e4740a25 evolve: use phases.new-commit config to retain phase information (issue5720)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3386
diff changeset
  1214
3385
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1215
            obsolete.createmarkers(repo, [(ctx, (repo[node],))])
3457
82e9f9603b1b evolvestate: rename the file to state.py and class name to cmdstate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3456
diff changeset
  1216
            evolvestate.delete()
3385
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1217
            return
823031b51d81 evolve: don't use graftstate for continuing `hg evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3375
diff changeset
  1218
1402
08ae023882f1 evolve: check for uncommited change earlier
Laurent Charignon <lcharignon@fb.com>
parents: 1398
diff changeset
  1219
    cmdutil.bailifchanged(repo)
08ae023882f1 evolve: check for uncommited change earlier
Laurent Charignon <lcharignon@fb.com>
parents: 1398
diff changeset
  1220
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1221
    revs = evolvecmd._selectrevs(repo, allopt, revopt, anyopt, targetcat)
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1222
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1223
    if not revs:
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1224
        return evolvecmd._handlenotrouble(ui, repo, allopt, revopt, anyopt, targetcat)
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1225
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1226
    # For the progress bar to show
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1227
    count = len(revs)
3459
218fbcc3220c evolve: store the replacements occurred during `hg evolve` at top level
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3458
diff changeset
  1228
    replacements = {}
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1229
    # Order the revisions
2834
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2803
diff changeset
  1230
    if targetcat == 'orphan':
1411
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
  1231
        revs = _orderrevs(repo, revs)
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1232
    for rev in revs:
3459
218fbcc3220c evolve: store the replacements occurred during `hg evolve` at top level
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3458
diff changeset
  1233
        curctx = repo[rev]
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1234
        progresscb()
3461
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3460
diff changeset
  1235
        ret = evolvecmd._solveone(ui, repo, curctx, dryrunopt, confirmopt,
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3460
diff changeset
  1236
                                  progresscb, targetcat)
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1237
        seen += 1
3459
218fbcc3220c evolve: store the replacements occurred during `hg evolve` at top level
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3458
diff changeset
  1238
        if ret[0]:
218fbcc3220c evolve: store the replacements occurred during `hg evolve` at top level
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3458
diff changeset
  1239
            replacements[curctx.node()] = [ret[1]]
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1240
    progresscb()
3466
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1241
    evolvecmd._cleanup(ui, repo, startnode, showprogress)
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1242
2745
b38112b43a27 prev: allow to update to 't0' from 't1'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2743
diff changeset
  1243
def _gettopic(ctx):
b38112b43a27 prev: allow to update to 't0' from 't1'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2743
diff changeset
  1244
    """handle topic fetching with or without the extension"""
b38112b43a27 prev: allow to update to 't0' from 't1'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2743
diff changeset
  1245
    return getattr(ctx, 'topic', lambda: '')()
b38112b43a27 prev: allow to update to 't0' from 't1'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2743
diff changeset
  1246
b38112b43a27 prev: allow to update to 't0' from 't1'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2743
diff changeset
  1247
def _gettopicidx(ctx):
b38112b43a27 prev: allow to update to 't0' from 't1'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2743
diff changeset
  1248
    """handle topic fetching with or without the extension"""
b38112b43a27 prev: allow to update to 't0' from 't1'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2743
diff changeset
  1249
    return getattr(ctx, 'topicidx', lambda: None)()
b38112b43a27 prev: allow to update to 't0' from 't1'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2743
diff changeset
  1250
2742
64fb1a082f58 prev: add '_getcurrenttopic' helper and use it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2741
diff changeset
  1251
def _getcurrenttopic(repo):
64fb1a082f58 prev: add '_getcurrenttopic' helper and use it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2741
diff changeset
  1252
    return getattr(repo, 'currenttopic', '')
64fb1a082f58 prev: add '_getcurrenttopic' helper and use it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2741
diff changeset
  1253
2736
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1254
def _prevupdate(repo, displayer, target, bookmark, dryrun):
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1255
    if dryrun:
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1256
        repo.ui.write(('hg update %s;\n' % target.rev()))
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1257
        if bookmark is not None:
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1258
            repo.ui.write(('hg bookmark %s -r %s;\n'
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1259
                           % (bookmark, target.rev())))
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1260
    else:
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1261
        ret = hg.update(repo, target.rev())
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1262
        if not ret:
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1263
            tr = lock = None
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1264
            try:
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1265
                lock = repo.lock()
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1266
                tr = repo.transaction('previous')
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1267
                if bookmark is not None:
2752
4457aa1d81aa compat: add a compatibility layer for bookmark move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2748
diff changeset
  1268
                    bmchanges = [(bookmark, target.node())]
4457aa1d81aa compat: add a compatibility layer for bookmark move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2748
diff changeset
  1269
                    compat.bookmarkapplychanges(repo, tr, bmchanges)
2736
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1270
                else:
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1271
                    bookmarksmod.deactivate(repo)
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1272
                tr.close()
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1273
            finally:
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1274
                lockmod.release(tr, lock)
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1275
3196
94e5235e95f5 evolve: make prev/next respect --quiet flag (issue5742)
Martin von Zweigbergk <martinvonz@google.com>
parents: 3185
diff changeset
  1276
    if not repo.ui.quiet:
94e5235e95f5 evolve: make prev/next respect --quiet flag (issue5742)
Martin von Zweigbergk <martinvonz@google.com>
parents: 3185
diff changeset
  1277
        displayer.show(target)
2739
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1278
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1279
def _findprevtarget(repo, displayer, movebookmark=False, topic=True):
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1280
    target = bookmark = None
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1281
    wkctx = repo[None]
2741
51d669b16fa8 prev: explicitly use 'p1' as a variable name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2739
diff changeset
  1282
    p1 = wkctx.parents()[0]
51d669b16fa8 prev: explicitly use 'p1' as a variable name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2739
diff changeset
  1283
    parents = p1.parents()
2742
64fb1a082f58 prev: add '_getcurrenttopic' helper and use it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2741
diff changeset
  1284
    currenttopic = _getcurrenttopic(repo)
2745
b38112b43a27 prev: allow to update to 't0' from 't1'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2743
diff changeset
  1285
b38112b43a27 prev: allow to update to 't0' from 't1'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2743
diff changeset
  1286
    # we do not filter in the 1 case to allow prev to t0
b38112b43a27 prev: allow to update to 't0' from 't1'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2743
diff changeset
  1287
    if currenttopic and topic and _gettopicidx(p1) != 1:
3362
92b414710d2e prev: jump to parent's successor if parent is obsolete and topic is involved
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
  1288
        parents = [repo[_singlesuccessor(repo, ctx)] if ctx.mutable() else ctx
92b414710d2e prev: jump to parent's successor if parent is obsolete and topic is involved
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
  1289
                   for ctx in parents]
2739
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1290
        parents = [ctx for ctx in parents if ctx.topic() == currenttopic]
2741
51d669b16fa8 prev: explicitly use 'p1' as a variable name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2739
diff changeset
  1291
51d669b16fa8 prev: explicitly use 'p1' as a variable name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2739
diff changeset
  1292
    # issue message for the various case
51d669b16fa8 prev: explicitly use 'p1' as a variable name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2739
diff changeset
  1293
    if p1.node() == node.nullid:
2739
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1294
        repo.ui.warn(_('already at repository root\n'))
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1295
    elif not parents and currenttopic:
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1296
        repo.ui.warn(_('no parent in topic "%s"\n') % currenttopic)
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1297
        repo.ui.warn(_('(do you want --no-topic)\n'))
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1298
    elif len(parents) == 1:
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1299
        target = parents[0]
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1300
        bookmark = None
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1301
        if movebookmark:
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1302
            bookmark = repo._activebookmark
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1303
    else:
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1304
        for p in parents:
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1305
            displayer.show(p)
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1306
        repo.ui.warn(_('multiple parents, explicitly update to one\n'))
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1307
    return target, bookmark
2736
3c87d5276394 prev: extract the function performing the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2735
diff changeset
  1308
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1309
@eh.command(
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1310
    '^previous',
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1311
    [('B', 'move-bookmark', False,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1312
        _('move active bookmark after update')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1313
     ('', 'merge', False, _('bring uncommitted change along')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1314
     ('', 'no-topic', False, _('ignore topic and move topologically')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1315
     ('n', 'dry-run', False,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1316
        _('do not perform actions, just print what would be done'))],
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1317
    '[OPTION]...')
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
  1318
def cmdprevious(ui, repo, **opts):
1572
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
  1319
    """update to parent revision
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
  1320
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
  1321
    Displays the summary line of the destination for clarity."""
1742
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
  1322
    wlock = None
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
  1323
    dryrunopt = opts['dry_run']
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
  1324
    if not dryrunopt:
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
  1325
        wlock = repo.wlock()
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
  1326
    try:
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1327
        wkctx = repo[None]
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1328
        wparents = wkctx.parents()
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1329
        if len(wparents) != 1:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1330
            raise error.Abort('merge in progress')
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1331
        if not opts['merge']:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1332
            try:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1333
                cmdutil.bailifchanged(repo)
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1334
            except error.Abort as exc:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1335
                exc.hint = _('do you want --merge?')
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1336
                raise
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1337
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1338
        displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
2743
2fe562f94ead prev: retrieve the 'no-topic' result is a clear and reusable option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2742
diff changeset
  1339
        topic = not opts.get("no_topic", False)
2739
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1340
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1341
        target, bookmark = _findprevtarget(repo, displayer,
2743
2fe562f94ead prev: retrieve the 'no-topic' result is a clear and reusable option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2742
diff changeset
  1342
                                           opts.get('move_bookmark'), topic)
2739
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1343
        if target is not None:
2795
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2782
diff changeset
  1344
            backup = repo.ui.backupconfig('_internal', 'keep-topic')
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2782
diff changeset
  1345
            try:
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2782
diff changeset
  1346
                if topic and _getcurrenttopic(repo) != _gettopic(target):
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2782
diff changeset
  1347
                    repo.ui.setconfig('_internal', 'keep-topic', 'yes',
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2782
diff changeset
  1348
                                      source='topic-extension')
2745
b38112b43a27 prev: allow to update to 't0' from 't1'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2743
diff changeset
  1349
                _prevupdate(repo, displayer, target, bookmark, dryrunopt)
2795
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2782
diff changeset
  1350
            finally:
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2782
diff changeset
  1351
                repo.ui.restoreconfig(backup)
2739
7d86594cb829 prev: extract the code computing the destination
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2738
diff changeset
  1352
            return 0
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  1353
        else:
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1354
            return 1
1742
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
  1355
    finally:
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
  1356
        lockmod.release(wlock)
127
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1357
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1358
@eh.command(
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1359
    '^next',
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1360
    [('B', 'move-bookmark', False,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1361
        _('move active bookmark after update')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1362
     ('', 'merge', False, _('bring uncommitted change along')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1363
     ('', 'evolve', False, _('evolve the next changeset if necessary')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1364
     ('', 'no-topic', False, _('ignore topic and move topologically')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1365
     ('n', 'dry-run', False,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1366
      _('do not perform actions, just print what would be done'))],
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1367
    '[OPTION]...')
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
  1368
def cmdnext(ui, repo, **opts):
1572
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
  1369
    """update to next child revision
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
  1370
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
  1371
    Use the ``--evolve`` flag to evolve unstable children on demand.
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
  1372
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
  1373
    Displays the summary line of the destination for clarity.
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
  1374
    """
1742
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
  1375
    wlock = None
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
  1376
    dryrunopt = opts['dry_run']
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
  1377
    if not dryrunopt:
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
  1378
        wlock = repo.wlock()
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
  1379
    try:
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1380
        wkctx = repo[None]
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1381
        wparents = wkctx.parents()
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1382
        if len(wparents) != 1:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1383
            raise error.Abort('merge in progress')
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1384
        if not opts['merge']:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1385
            try:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1386
                cmdutil.bailifchanged(repo)
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1387
            except error.Abort as exc:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1388
                exc.hint = _('do you want --merge?')
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1389
                raise
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1390
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1391
        children = [ctx for ctx in wparents[0].children() if not ctx.obsolete()]
2803
843311b8876e next: use the utility to retrieve the current topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2795
diff changeset
  1392
        topic = _getcurrenttopic(repo)
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1393
        filtered = []
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1394
        if topic and not opts.get("no_topic", False):
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1395
            filtered = [ctx for ctx in children if ctx.topic() != topic]
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1396
            # XXX N-square membership on children
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1397
            children = [ctx for ctx in children if ctx not in filtered]
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1398
        displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1399
        if len(children) == 1:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1400
            c = children[0]
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
  1401
            bm = repo._activebookmark
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1402
            shouldmove = opts.get('move_bookmark') and bm is not None
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1403
            if dryrunopt:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1404
                ui.write(('hg update %s;\n' % c.rev()))
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1405
                if shouldmove:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1406
                    ui.write(('hg bookmark %s -r %s;\n' % (bm, c.rev())))
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1407
            else:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1408
                ret = hg.update(repo, c.rev())
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1409
                if not ret:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1410
                    lock = tr = None
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1411
                    try:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1412
                        lock = repo.lock()
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1413
                        tr = repo.transaction('next')
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1414
                        if shouldmove:
2752
4457aa1d81aa compat: add a compatibility layer for bookmark move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2748
diff changeset
  1415
                            bmchanges = [(bm, c.node())]
4457aa1d81aa compat: add a compatibility layer for bookmark move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2748
diff changeset
  1416
                            compat.bookmarkapplychanges(repo, tr, bmchanges)
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1417
                        else:
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
  1418
                            bookmarksmod.deactivate(repo)
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1419
                        tr.close()
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1420
                    finally:
1742
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
  1421
                        lockmod.release(tr, lock)
3196
94e5235e95f5 evolve: make prev/next respect --quiet flag (issue5742)
Martin von Zweigbergk <martinvonz@google.com>
parents: 3185
diff changeset
  1422
            if not ui.quiet:
94e5235e95f5 evolve: make prev/next respect --quiet flag (issue5742)
Martin von Zweigbergk <martinvonz@google.com>
parents: 3185
diff changeset
  1423
                displayer.show(c)
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1424
            result = 0
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1425
        elif children:
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3198
diff changeset
  1426
            ui.warn(_("ambiguous next changeset:\n"))
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1427
            for c in children:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1428
                displayer.show(c)
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1429
            ui.warn(_('explicitly update to one of them\n'))
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1430
            result = 1
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  1431
        else:
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1432
            aspchildren = evolvecmd._aspiringchildren(repo, [repo['.'].rev()])
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1433
            if topic:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1434
                filtered.extend(repo[c] for c in children
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1435
                                if repo[c].topic() != topic)
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1436
                # XXX N-square membership on children
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1437
                aspchildren = [ctx for ctx in aspchildren if ctx not in filtered]
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1438
            if not opts['evolve'] or not aspchildren:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1439
                if filtered:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1440
                    ui.warn(_('no children on topic "%s"\n') % topic)
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1441
                    ui.warn(_('do you want --no-topic\n'))
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1442
                else:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1443
                    ui.warn(_('no children\n'))
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1444
                if aspchildren:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1445
                    msg = _('(%i unstable changesets to be evolved here, '
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1446
                            'do you want --evolve?)\n')
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1447
                    ui.warn(msg % len(aspchildren))
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1448
                result = 1
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1449
            elif 1 < len(aspchildren):
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3198
diff changeset
  1450
                ui.warn(_("ambiguous next (unstable) changeset:\n"))
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1451
                for c in aspchildren:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1452
                    displayer.show(repo[c])
1756
a7dcfff8c4a9 evolve: use single quotes in usage messages
Martin von Zweigbergk <martinvonz@google.com>
parents: 1755
diff changeset
  1453
                ui.warn(_("(run 'hg evolve --rev REV' on one of them)\n"))
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1454
                return 1
1628
db19b1dc5c45 topic: restrict 'hg prev' to current topic unless --no-topic is passed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1627
diff changeset
  1455
            else:
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1456
                cmdutil.bailifchanged(repo)
3461
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3460
diff changeset
  1457
                result = evolvecmd._solveone(ui, repo, repo[aspchildren[0]],
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3460
diff changeset
  1458
                                             dryrunopt, False, lambda: None,
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3460
diff changeset
  1459
                                             category='orphan')
3458
210132852a3d evolve: make the _solve* functions return a tuple
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3457
diff changeset
  1460
                # making sure a next commit is formed
210132852a3d evolve: make the _solve* functions return a tuple
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3457
diff changeset
  1461
                if result[0] and result[1]:
2405
4ff849709fea label: add a label for the node in the "wc now at" message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2404
diff changeset
  1462
                    ui.status(_('working directory now at %s\n')
2443
6a23a55f77d2 next: prevent a color related crash when evolve
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2442
diff changeset
  1463
                              % ui.label(str(repo['.']), 'evolve.node'))
3458
210132852a3d evolve: make the _solve* functions return a tuple
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3457
diff changeset
  1464
                return 0
1449
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  1465
            return 1
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
  1466
        return result
1742
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
  1467
    finally:
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
  1468
        lockmod.release(wlock)
87
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 82
diff changeset
  1469
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  1470
@eh.wrapcommand('commit')
116
64ca29eef349 Add a -o option to commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 113
diff changeset
  1471
def commitwrapper(orig, ui, repo, *arg, **kwargs):
1558
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
  1472
    tr = None
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  1473
    if kwargs.get('amend', False):
1255
a2d4901e211e commit: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1253
diff changeset
  1474
        wlock = lock = None
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  1475
    else:
1255
a2d4901e211e commit: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1253
diff changeset
  1476
        wlock = repo.wlock()
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  1477
        lock = repo.lock()
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1478
    try:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1479
        obsoleted = kwargs.get('obsolete', [])
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1480
        if obsoleted:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1481
            obsoleted = repo.set('%lr', obsoleted)
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1482
        result = orig(ui, repo, *arg, **kwargs)
1659
c450d134aac4 Spelling: succeeded
timeless@gmail.com
parents: 1646
diff changeset
  1483
        if not result: # commit succeeded
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1484
            new = repo['-1']
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1485
            oldbookmarks = []
444
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
  1486
            markers = []
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1487
            for old in obsoleted:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1488
                oldbookmarks.extend(repo.nodebookmarks(old.node()))
444
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
  1489
                markers.append((old, (new,)))
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
  1490
            if markers:
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
  1491
                obsolete.createmarkers(repo, markers)
2752
4457aa1d81aa compat: add a compatibility layer for bookmark move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2748
diff changeset
  1492
            bmchanges = []
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1493
            for book in oldbookmarks:
2752
4457aa1d81aa compat: add a compatibility layer for bookmark move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2748
diff changeset
  1494
                bmchanges.append((book, new.node()))
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1495
            if oldbookmarks:
1558
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
  1496
                if not wlock:
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
  1497
                    wlock = repo.wlock()
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
  1498
                if not lock:
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
  1499
                    lock = repo.lock()
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
  1500
                tr = repo.transaction('commit')
2752
4457aa1d81aa compat: add a compatibility layer for bookmark move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2748
diff changeset
  1501
                compat.bookmarkapplychanges(repo, tr, bmchanges)
1558
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
  1502
                tr.close()
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1503
        return result
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1504
    finally:
1558
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
  1505
        lockmod.release(tr, lock, wlock)
116
64ca29eef349 Add a -o option to commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 113
diff changeset
  1506
1220
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1507
@eh.wrapcommand('strip', extension='strip', opts=[
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1508
    ('', 'bundle', None, _("delete the commit entirely and move it to a "
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
  1509
                           "backup bundle")),
1220
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1510
    ])
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1511
def stripwrapper(orig, ui, repo, *revs, **kwargs):
3080
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3074
diff changeset
  1512
    if (not ui.configbool('experimental', 'prunestrip', False) or
1220
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1513
        kwargs.get('bundle', False)):
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1514
        return orig(ui, repo, *revs, **kwargs)
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1515
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1516
    if kwargs.get('force'):
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1517
        ui.warn(_("warning: --force has no effect during strip with evolve "
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1518
                  "enabled\n"))
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1519
    if kwargs.get('no_backup', False):
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1520
        ui.warn(_("warning: --no-backup has no effect during strips with "
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1521
                  "evolve enabled\n"))
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1522
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1523
    revs = list(revs) + kwargs.pop('rev', [])
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1524
    revs = set(scmutil.revrange(repo, revs))
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1525
    revs = repo.revs("(%ld)::", revs)
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1526
    kwargs['rev'] = []
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1527
    kwargs['new'] = []
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1528
    kwargs['succ'] = []
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1529
    kwargs['biject'] = False
2772
394b836e475b commands: rewrite the 'evocommands' module to 'cmdrewrite'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2766
diff changeset
  1530
    return cmdrewrite.cmdprune(ui, repo, *revs, **kwargs)
1220
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  1531
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  1532
@eh.wrapcommand('graft')
117
438fe133b068 Add a -o and -O option to graft.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 116
diff changeset
  1533
def graftwrapper(orig, ui, repo, *revs, **kwargs):
419
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
  1534
    kwargs = dict(kwargs)
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
  1535
    revs = list(revs) + kwargs.get('rev', [])
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
  1536
    kwargs['rev'] = []
417
a1fb18ad29a1 evolve: avoid duplication in graft wrapper
Patrick Mezard <patrick@mezard.eu>
parents: 416
diff changeset
  1537
    obsoleted = kwargs.setdefault('obsolete', [])
419
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
  1538
1256
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
  1539
    wlock = lock = None
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  1540
    try:
1256
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
  1541
        wlock = repo.wlock()
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
  1542
        lock = repo.lock()
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  1543
        if kwargs.get('old_obsolete'):
418
18a0d96ed559 evolve: graft --continue is optional, test
Patrick Mezard <patrick@mezard.eu>
parents: 417
diff changeset
  1544
            if kwargs.get('continue'):
2051
74934195747b evolve: switch away from deprecated repo.opener
Martin von Zweigbergk <martinvonz@google.com>
parents: 2049
diff changeset
  1545
                obsoleted.extend(repo.vfs.read('graftstate').splitlines())
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  1546
            else:
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  1547
                obsoleted.extend(revs)
151
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
  1548
        # convert obsolete target into revs to avoid alias joke
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
  1549
        obsoleted[:] = [str(i) for i in repo.revs('%lr', obsoleted)]
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
  1550
        if obsoleted and len(revs) > 1:
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
  1551
743
af74a5cdf96b conform to the Mercurial custom of lowercase messages
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 742
diff changeset
  1552
            raise error.Abort(_('cannot graft multiple revisions while '
151
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
  1553
                                'obsoleting (for now).'))
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
  1554
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
  1555
        return commitwrapper(orig, ui, repo, *revs, **kwargs)
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  1556
    finally:
1256
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
  1557
        lockmod.release(lock, wlock)
117
438fe133b068 Add a -o and -O option to graft.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 116
diff changeset
  1558
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  1559
@eh.extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  1560
def oldevolveextsetup(ui):
1631
7463f5880ce9 prune: remove the kill alias
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1630
diff changeset
  1561
    for cmd in ['prune', 'uncommit', 'touch', 'fold']:
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  1562
        try:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  1563
            entry = extensions.wrapcommand(cmdtable, cmd,
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  1564
                                           warnobserrors)
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  1565
        except error.UnknownCommand:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  1566
            # Commands may be disabled
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  1567
            continue
356
56d4c6207ef9 Move obserror warning into the obsolete extension.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 355
diff changeset
  1568
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  1569
    entry = cmdutil.findcmd('commit', commands.table)[1]
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  1570
    entry[1].append(('o', 'obsolete', [],
1008
a010ba5a0ffb evolve: deprecated --obsolete and --old-obsolete option on commit and graft
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1007
diff changeset
  1571
                     _("make commit obsolete this revision (DEPRECATED)")))
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  1572
    entry = cmdutil.findcmd('graft', commands.table)[1]
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  1573
    entry[1].append(('o', 'obsolete', [],
1008
a010ba5a0ffb evolve: deprecated --obsolete and --old-obsolete option on commit and graft
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1007
diff changeset
  1574
                     _("make graft obsoletes this revision (DEPRECATED)")))
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  1575
    entry[1].append(('O', 'old-obsolete', False,
1008
a010ba5a0ffb evolve: deprecated --obsolete and --old-obsolete option on commit and graft
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1007
diff changeset
  1576
                     _("make graft obsoletes its source (DEPRECATED)")))
211
69a37d56c7fb evolve: issue the "%i new unstable changeset" in more place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 196
diff changeset
  1577
1302
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  1578
@eh.wrapfunction(obsolete, '_checkinvalidmarkers')
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  1579
def _checkinvalidmarkers(orig, markers):
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  1580
    """search for marker with invalid data and raise error if needed
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  1581
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  1582
    Exist as a separated function to allow the evolve extension for a more
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  1583
    subtle handling.
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  1584
    """
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  1585
    if 'debugobsconvert' in sys.argv:
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  1586
        return
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  1587
    for mark in markers:
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  1588
        if node.nullid in mark[1]:
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
  1589
            msg = _('bad obsolescence marker detected: invalid successors nullid')
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
  1590
            hint = _('You should run `hg debugobsconvert`')
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
  1591
            raise error.Abort(msg, hint=hint)
1202
4099b087f672 evolve: handle invalid obsmarkers in the `debugobsconvert`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1198
diff changeset
  1592
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
  1593
@eh.command(
1159
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
  1594
    'debugobsconvert',
2053
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2051
diff changeset
  1595
    [('', 'new-format', obsexchange._bestformat, _('Destination format for markers.'))],
1159
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
  1596
    '')
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
  1597
def debugobsconvert(ui, repo, new_format):
1507
6f574c76c142 debugobsconvert: make sure obsstore is loaded before version comparison
Yuya Nishihara <yuya@tcha.org>
parents: 1506
diff changeset
  1598
    origmarkers = repo.obsstore._all  # settle version
1159
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
  1599
    if new_format == repo.obsstore._version:
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
  1600
        msg = _('New format is the same as the old format, not upgrading!')
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
  1601
        raise error.Abort(msg)
2748
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1602
    with repo.lock():
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1603
        f = repo.svfs('obsstore', 'wb', atomictemp=True)
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1604
        known = set()
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1605
        markers = []
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1606
        for m in origmarkers:
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1607
            # filter out invalid markers
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1608
            if nullid in m[1]:
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1609
                m = list(m)
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1610
                m[1] = tuple(s for s in m[1] if s != nullid)
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1611
                m = tuple(m)
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1612
            if m in known:
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1613
                continue
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1614
            known.add(m)
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1615
            markers.append(m)
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1616
        ui.write(_('Old store is version %d, will rewrite in version %d\n') % (
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1617
            repo.obsstore._version, new_format))
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1618
        map(f.write, obsolete.encodemarkers(markers, True, new_format))
723f5b505c48 debugobsconvert: take the lock when writing the obsstore file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2745
diff changeset
  1619
        f.close()
1159
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
  1620
    ui.write(_('Done!\n'))
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
  1621
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  1622
1827
15ec53d46f44 compat: drop handling of ancestral 'helploader' caller
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1826
diff changeset
  1623
def _helploader(ui):
1414
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  1624
    return help.gettext(evolutionhelptext)
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  1625
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  1626
@eh.uisetup
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  1627
def _setuphelp(ui):
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  1628
    for entry in help.helptable:
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  1629
        if entry[0] == "evolution":
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  1630
            break
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  1631
    else:
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  1632
        help.helptable.append((["evolution"], _("Safely Rewriting History"),
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
  1633
                              _helploader))
1414
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  1634
        help.helptable.sort()
1567
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
  1635
1597
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
  1636
evolvestateversion = 0
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
  1637
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
  1638
@eh.uisetup
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
  1639
def setupevolveunfinished(ui):
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
  1640
    data = ('evolvestate', True, False, _('evolve in progress'),
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
  1641
            _("use 'hg evolve --continue' or 'hg update -C .' to abort"))
1597
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
  1642
    cmdutil.unfinishedstates.append(data)
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
  1643
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
  1644
@eh.wrapfunction(hg, 'clean')
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
  1645
def clean(orig, repo, *args, **kwargs):
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
  1646
    ret = orig(repo, *args, **kwargs)
2070
9105c3c54045 cleanup: stop using 'repo.join' methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2064
diff changeset
  1647
    util.unlinkpath(repo.vfs.join('evolvestate'), ignoremissing=True)
1597
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
  1648
    return ret