annotate hgext3rd/evolve/__init__.py @ 2442:a8fea2ae3c0b stable

prune: prevent a color related crash when the working copy is moved This was not caught by test because they run color less.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 19 May 2017 17:33:27 +0200
parents 23c0bef0b5d4
children 6a23a55f77d2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
23 With the extensions various evolution events will display warning (new unstable
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
f026e85bd0b2 evolve: update extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2290
diff changeset
35 Mercurial version 3.8).
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
26d638e419df auto-push: move config help in the extension help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
37 New Config:
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
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
47 """
2049
b81d3775006b evolve: move extension metadata in their own module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2048
diff changeset
48
584
af3b0d696e7f evolve: add tested with info
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 577
diff changeset
49
1414
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
50 evolutionhelptext = """
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
51 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
52 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
53
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
54 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
55 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
56 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
57 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
58 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
59 :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
60
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
61 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
62 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
63 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
64 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
65 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
66 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
67
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
68 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
69 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
70 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
71 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
72 of history concurrently.
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
73
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
74 Current feature status
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
75 ======================
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
76
1710
aec233d3cafd help: fix evolution help grammar
timeless@gmail.com
parents: 1709
diff changeset
77 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
78 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
79
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
80 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
81 assert support for the obsolescence feature (this can currently only be done
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
82 via an extension).""".strip()
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
83
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
84
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
85 import os
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
86 import sys
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
87 import random
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
88 import re
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
89 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
90 import errno
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
91 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
92
1676
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1675
diff changeset
93 try:
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1675
diff changeset
94 import StringIO as io
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1675
diff changeset
95 StringIO = io.StringIO
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1675
diff changeset
96 except ImportError:
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1675
diff changeset
97 import io
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1675
diff changeset
98 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
99
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
100
1825
377d94d6c889 evolve: proactively detect bad version early
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1824
diff changeset
101 try:
377d94d6c889 evolve: proactively detect bad version early
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1824
diff changeset
102 from mercurial import registrar
377d94d6c889 evolve: proactively detect bad version early
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1824
diff changeset
103 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
104 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
105 from . import metadata
1825
377d94d6c889 evolve: proactively detect bad version early
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1824
diff changeset
106 raise ImportError('evolve needs 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
107 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
108
670
97ce1f801309 evolve: drop unused import
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 663
diff changeset
109 import mercurial
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
110 from mercurial import util
1513
4f7e0e0318a5 prune: reuse revset from repair instead of copy-pasting code
Ryan McElroy <rmcelroy@fb.com>
parents: 1512
diff changeset
111 from mercurial import repair
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
112
1834
f23a97d14895 compat: drop compat for older wireproto implementation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1833
diff changeset
113 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
114 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
115 obsolete._enabled = True
617
469befc27b26 detect incompatibility with future mercurial 2.5
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 616
diff changeset
116
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
117 from mercurial import (
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
118 bookmarks as bookmarksmod,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
119 cmdutil,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
120 commands,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
121 context,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
122 copies,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
123 error,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
124 extensions,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
125 help,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
126 hg,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
127 lock as lockmod,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
128 merge,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
129 node,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
130 patch,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
131 phases,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
132 revset,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
133 scmutil,
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
134 templatekw,
2289
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
135 obsolete
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
136 )
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
137
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
138 from mercurial.commands import walkopts, commitopts, commitopts2, mergetoolopts
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
139 from mercurial.i18n import _
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
140 from mercurial.node import nullid
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
141
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
142 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
143 checkheads,
2123
cf7b4ab31f0c split: move the debugcommand into a dedicated module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2122
diff changeset
144 debugcmd,
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
145 exthelper,
2049
b81d3775006b evolve: move extension metadata in their own module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2048
diff changeset
146 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
147 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
148 obsexchange,
2286
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2275
diff changeset
149 safeguard,
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
150 utility,
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents: 2396
diff changeset
151 obshistory
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
152 )
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
153
2049
b81d3775006b evolve: move extension metadata in their own module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2048
diff changeset
154 __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
155 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
156 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
157 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
158
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
159 sha1re = re.compile(r'\b[0-9a-f]{6,40}\b')
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
160
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
161 # 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
162 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
163
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
164 obsexcmsg = utility.obsexcmsg
1838
6942750831bb serveronly: deduplicate code with the main evolve extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1836
diff changeset
165
2404
c07f752137f4 label: rename 'evolve.short_node' to 'evolve.node'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2403
diff changeset
166 colortable = {'evolve.node': 'yellow',
2337
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
167 'evolve.user': 'green',
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
168 'evolve.rev': 'blue',
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
169 'evolve.short_description': '',
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
170 'evolve.date': 'cyan',
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
171 'evolve.current_rev': 'bold',
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
172 'evolve.verb': '',
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
173 }
c0ed4adf965e obshistory: add some color
Boris Feld <boris.feld@octobus.net>
parents: 2336
diff changeset
174
820
a9a66143e2ec exchange: actually use _pushkeyescape fallback
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 819
diff changeset
175 _pack = struct.pack
1597
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
176 _unpack = struct.unpack
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
177
1296
23819e1d61fd evolve: add -i flag to amend command
Laurent Charignon <lcharignon@fb.com>
parents: 1281
diff changeset
178 aliases, entry = cmdutil.findcmd('commit', commands.table)
2100
e5b06a6d8d4b compat: drop some <hg-3.4 compatibility code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
179 interactiveopt = [['i', 'interactive', None, _('use interactive mode')]]
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
180 # This extension contains the following code
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
181 #
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
182 # - Extension Helper code
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
183 # - Obsolescence cache
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
184 # - ...
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
185 # - Older format compat
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
186
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
187 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
188 eh.merge(debugcmd.eh)
2053
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2051
diff changeset
189 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
190 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
191 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
192 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
193 eh.merge(obshistory.eh)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
194 uisetup = eh.final_uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
195 extsetup = eh.final_extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
196 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
197 cmdtable = eh.cmdtable
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
198
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
199 #####################################################################
1213
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
200 ### Option configuration ###
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
201 #####################################################################
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
202
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
203 @eh.reposetup # must be the first of its kin.
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
204 def _configureoptions(ui, repo):
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
205 # If no capabilities are specified, enable everything.
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
206 # This is so existing evolve users don't need to change their config.
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
207 evolveopts = ui.configlist('experimental', 'evolution')
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
208 if not evolveopts:
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
209 evolveopts = ['all']
1635
91ba7e0daff6 alias: report evolve as origin for aliases
timeless@gmail.com
parents: 1634
diff changeset
210 ui.setconfig('experimental', 'evolution', evolveopts, 'evolve')
1213
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
211
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
212 @eh.uisetup
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
213 def _configurecmdoptions(ui):
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
214 # Unregister evolve commands if the command capability is not specified.
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
215 #
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
216 # 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
217 # guarantee it happens after the above configuration, but before the
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
218 # extsetup functions.
1441
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
219 evolvecommands = ui.configlist('experimental', 'evolutioncommands')
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
220 evolveopts = ui.configlist('experimental', 'evolution')
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
221 if evolveopts and (commandopt not in evolveopts and
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
222 'all' not in evolveopts):
1441
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
223 # 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
224 whitelist = set()
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
225 for cmd in evolvecommands:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
226 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
227 if not matchingevolvecommands:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
228 raise error.Abort(_('unknown command: %s') % cmd)
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
229 elif len(matchingevolvecommands) > 1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
230 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
231 raise error.Abort(msg % (cmd, matchingevolvecommands))
1441
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
232 else:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
233 whitelist.add(matchingevolvecommands[0])
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
234 for disabledcmd in set(cmdtable) - whitelist:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
235 del cmdtable[disabledcmd]
1213
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
236
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
237 #####################################################################
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
238 ### 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
239 #####################################################################
66c02a2e8e2f prune: wrap mercurial internal to add parent information in prune marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 804
diff changeset
240
976
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
241 commitopts3 = [
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
242 ('D', 'current-date', None,
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
243 _('record the current date as commit date')),
985
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
244 ('U', 'current-user', None,
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
245 _('record the current user as committer')),
976
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
246 ]
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
247
985
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
248 def _resolveoptions(ui, opts):
976
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
249 """modify commit options dict to handle related options
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
250
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
251 For now, all it does is figure out the commit date: respect -D unless
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
252 -d was supplied.
577
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
253 """
976
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
254 # N.B. this is extremely similar to setupheaderopts() in mq.py
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
255 if not opts.get('date') and opts.get('current_date'):
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
256 opts['date'] = '%d %d' % util.makedate()
985
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
257 if not opts.get('user') and opts.get('current_user'):
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
258 opts['user'] = ui.username()
577
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
259
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
260 getrevs = obsolete.getrevs
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
261
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
262 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
263 ### Additional Utilities ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
264 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
265
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
266 # 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
267
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
268 # - Function to create markers
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
269 # - 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
270 # - "troubles" method on changectx
1661
48232457b704 Spelling: through
timeless@gmail.com
parents: 1659
diff changeset
271 # - 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
272 # - function to find useful changeset to stabilize
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
273
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
274
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
275 ### Useful alias
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
276
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
277 @eh.uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
278 def _installalias(ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
279 if ui.config('alias', 'pstatus', None) is None:
1635
91ba7e0daff6 alias: report evolve as origin for aliases
timeless@gmail.com
parents: 1634
diff changeset
280 ui.setconfig('alias', 'pstatus', 'status --rev .^', 'evolve')
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
281 if ui.config('alias', 'pdiff', None) is None:
1635
91ba7e0daff6 alias: report evolve as origin for aliases
timeless@gmail.com
parents: 1634
diff changeset
282 ui.setconfig('alias', 'pdiff', 'diff --rev .^', 'evolve')
497
43e1b2cab789 evolve: add the odiff alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 492
diff changeset
283 if ui.config('alias', 'odiff', None) is None:
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
284 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
285 "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
286 'evolve')
696
121e2d265e85 alias: add a grab alias
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 695
diff changeset
287 if ui.config('alias', 'grab', None) is None:
1104
cb36a4eb0157 evolve: fix the 'grab' alias to work on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1101
diff changeset
288 if os.name == 'nt':
cb36a4eb0157 evolve: fix the 'grab' alias to work on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1101
diff changeset
289 ui.setconfig('alias', 'grab',
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
290 "! " + util.hgexecutable()
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
291 + " rebase --dest . --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
292 + util.hgexecutable() + " up tip",
1635
91ba7e0daff6 alias: report evolve as origin for aliases
timeless@gmail.com
parents: 1634
diff changeset
293 'evolve')
1104
cb36a4eb0157 evolve: fix the 'grab' alias to work on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1101
diff changeset
294 else:
cb36a4eb0157 evolve: fix the 'grab' alias to work on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1101
diff changeset
295 ui.setconfig('alias', 'grab',
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
296 "! $HG rebase --dest . --rev $@ && $HG up tip",
1635
91ba7e0daff6 alias: report evolve as origin for aliases
timeless@gmail.com
parents: 1634
diff changeset
297 'evolve')
696
121e2d265e85 alias: add a grab alias
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 695
diff changeset
298
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
299
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
300 ### Troubled revset symbol
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
301
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
302 @eh.revset('troubled')
594
7f89b31fcb26 merge bumped rename
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 592 593
diff changeset
303 def revsettroubled(repo, subset, x):
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
304 """``troubled()``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
305 Changesets with troubles.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
306 """
993
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
307 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
308 troubled = set()
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
309 troubled.update(getrevs(repo, 'unstable'))
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
310 troubled.update(getrevs(repo, 'bumped'))
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
311 troubled.update(getrevs(repo, 'divergent'))
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
312 troubled = revset.baseset(troubled)
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
313 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
314 return subset & troubled
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
315
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
316 ### Obsolescence graph
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
317
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
318 # 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
319
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
320 def _precursors(repo, s):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
321 """Precursor of a changeset"""
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
322 cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
323 nm = repo.changelog.nodemap
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
324 markerbysubj = repo.obsstore.precursors
1377
01bdeb847f81 evolve: avoid creating changectx object in _precursors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1376
diff changeset
325 node = repo.changelog.node
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
326 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
327 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
328 pr = nm.get(p[0])
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
329 if pr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
330 cs.add(pr)
1383
cf62abb62941 evolve: move 'precursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1382
diff changeset
331 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
332 return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
333
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
334 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
335 """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
336 node = repo.changelog.node
a127f0f3bf5f evolve: avoid creating changectx object in _allprecursors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1377
diff changeset
337 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
338 seen = set()
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
339 allsubjects = repo.obsstore.precursors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
340 while toproceed:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
341 nc = toproceed.pop()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
342 for mark in allsubjects.get(nc, ()):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
343 np = mark[0]
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
344 if np not in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
345 seen.add(np)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
346 toproceed.append(np)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
347 nm = repo.changelog.nodemap
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
348 cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
349 for p in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
350 pr = nm.get(p)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
351 if pr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
352 cs.add(pr)
1384
64c8b8c27811 evolve: move 'allprecursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1383
diff changeset
353 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
354 return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
355
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
356 def _successors(repo, s):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
357 """Successors of a changeset"""
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
358 cs = set()
1379
693cdcd809f2 evolve: avoid creating changectx object in _successors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1378
diff changeset
359 node = repo.changelog.node
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
360 nm = repo.changelog.nodemap
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
361 markerbyobj = repo.obsstore.successors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
362 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
363 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
364 for sub in p[1]:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
365 sr = nm.get(sub)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
366 if sr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
367 cs.add(sr)
1385
c2584407afbf evolve: move 'successors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1384
diff changeset
368 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
369 return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
370
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
371 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
372 """transitive successors of a subset
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
373
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
374 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
375 marker. """
1380
43dcf62237be evolve: avoid creating changectx object in _allsuccessors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1379
diff changeset
376 node = repo.changelog.node
43dcf62237be evolve: avoid creating changectx object in _allsuccessors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1379
diff changeset
377 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
378 seen = set()
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
379 allobjects = repo.obsstore.successors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
380 while toproceed:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
381 nc = toproceed.pop()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
382 for mark in allobjects.get(nc, ()):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
383 if mark[2] & haltonflags:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
384 continue
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
385 for sub in mark[1]:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
386 if sub == nullid:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
387 continue # should not be here!
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
388 if sub not in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
389 seen.add(sub)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
390 toproceed.append(sub)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
391 nm = repo.changelog.nodemap
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
392 cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
393 for s in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
394 sr = nm.get(s)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
395 if sr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
396 cs.add(sr)
1386
b5eaec8a53d0 evolve: move 'allsuccessors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1385
diff changeset
397 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
398 return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
399
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
400 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
401 ### Extending revset and template ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
402 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
403
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
404 # 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
405 # they are subject to changes
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
406
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
407
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
408 ### XXX I'm not sure this revset is useful
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
409 @eh.revset('suspended')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
410 def revsetsuspended(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
411 """``suspended()``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
412 Obsolete changesets with non-obsolete descendants.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
413 """
1307
677c5da57b9c evolve: remove unused variables
Laurent Charignon <lcharignon@fb.com>
parents: 1306
diff changeset
414 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
415 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
416 suspended.sort()
c431f827f366 evolve: move 'suspended()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1381
diff changeset
417 return subset & suspended
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
418
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
419
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
420 @eh.revset('precursors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
421 def revsetprecursors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
422 """``precursors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
423 Immediate precursors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
424 """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
425 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
426 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
427 s.sort()
cf62abb62941 evolve: move 'precursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1382
diff changeset
428 return subset & s
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
429
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
430
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
431 @eh.revset('allprecursors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
432 def revsetallprecursors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
433 """``allprecursors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
434 Transitive precursors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
435 """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
436 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
437 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
438 s.sort()
64c8b8c27811 evolve: move 'allprecursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1383
diff changeset
439 return subset & s
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
440
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
441
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
442 @eh.revset('successors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
443 def revsetsuccessors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
444 """``successors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
445 Immediate successors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
446 """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
447 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
448 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
449 s.sort()
c2584407afbf evolve: move 'successors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1384
diff changeset
450 return subset & s
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
451
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
452 @eh.revset('allsuccessors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
453 def revsetallsuccessors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
454 """``allsuccessors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
455 Transitive successors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
456 """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
457 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
458 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
459 s.sort()
b5eaec8a53d0 evolve: move 'allsuccessors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1385
diff changeset
460 return subset & s
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 ### template keywords
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
463 # XXX it does not handle troubles well :-/
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 @eh.templatekw('obsolete')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
466 def obsoletekw(repo, ctx, templ, **args):
1732
f4047fba5e90 templates: change {obsolete} to emit only "obsolete" or ""
Martin von Zweigbergk <martinvonz@google.com>
parents: 1729
diff changeset
467 """:obsolete: String. Whether the changeset is ``obsolete``.
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
468 """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
469 if ctx.obsolete():
1732
f4047fba5e90 templates: change {obsolete} to emit only "obsolete" or ""
Martin von Zweigbergk <martinvonz@google.com>
parents: 1729
diff changeset
470 return 'obsolete'
f4047fba5e90 templates: change {obsolete} to emit only "obsolete" or ""
Martin von Zweigbergk <martinvonz@google.com>
parents: 1729
diff changeset
471 return ''
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
472
1399
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
473 @eh.templatekw('troubles')
2271
1af1b0debd4b template: pass all mapping data to showlist()
Yuya Nishihara <yuya@tcha.org>
parents: 2245
diff changeset
474 def showtroubles(**args):
1399
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
475 """:troubles: List of strings. Evolution troubles affecting the changeset
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
476 (zero or more of "unstable", "divergent" or "bumped")."""
2271
1af1b0debd4b template: pass all mapping data to showlist()
Yuya Nishihara <yuya@tcha.org>
parents: 2245
diff changeset
477 ctx = args['ctx']
2272
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
478 try:
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
479 # specify plural= explicitly to trigger TypeError on hg < 4.2
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
480 return templatekw.showlist('trouble', ctx.troubles(), args,
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
481 plural='troubles')
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
482 except TypeError:
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
483 return templatekw.showlist('trouble', ctx.troubles(), plural='troubles',
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
484 **args)
1399
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
485
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
486 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
487 ### Various trouble warning ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
488 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
489
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
490 # 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
491
1527
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
492
2289
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
493 def _getobsoletereason(repo, revnode):
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
494 """ Return a tuple containing:
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
495 - the reason a revision is obsolete (diverged, pruned or superseed)
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
496 - the list of successors short node if the revision is neither pruned
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
497 or has diverged
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
498 """
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
499 successorssets = obsolete.successorssets(repo, revnode)
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
500
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
501 if len(successorssets) == 0:
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
502 # The commit has been pruned
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
503 return ('pruned', [])
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
504 elif len(successorssets) > 1:
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
505 return ('diverged', [])
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
506 else:
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
507 # No divergence, only one set of successors
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
508 successors = [node.short(node_id) for node_id in successorssets[0]]
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
509
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
510 if len(successors) == 1:
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
511 return ('superseed', successors)
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
512 else:
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
513 return ('superseed_split', successors)
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
514
1527
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
515 def _warnobsoletewc(ui, repo):
2289
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
516 rev = repo['.']
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
517
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
518 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
519 return
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
520
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
521 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
522 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
523
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
524 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
525
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
526 # Check that evolve is activated for performance reasons
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
527 if ui.quiet or not obsolete.isenabled(repo, commandopt):
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
528 return
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
529
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
530 # Show a warning for helping the user to solve the issue
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
531 reason, successors = _getobsoletereason(repo, rev.node())
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
532
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
533 if reason == 'pruned':
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
534 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
535 elif reason == 'diverged':
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
536 debugcommand = "hg evolve -list --divergent"
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
537 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
538 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
539 elif reason == 'superseed':
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
540 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
541 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
542 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
543 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
544
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
545 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
546 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
547 else:
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
548 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
549 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
550 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
551 solvemsg = msg % successorsmsg
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
552 else:
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
553 raise ValueError(reason)
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
554
61d073590fb7 ui: add better messages when the working copy become obsolete.
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
555 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
556
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
557 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
558 # 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
559 @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
560 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
561 """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
562
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
563 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
564 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
565 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
566
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
567 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
568 rev = unfilteredrepo[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
569 reason, successors = _getobsoletereason(unfilteredrepo, rev.node())
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
570
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
571 # 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
572 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
573 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
574 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
575 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
576 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
577 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
578 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
579 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
580 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
581 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
582
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
583 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
584 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
585 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
586 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
587 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
588 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
589
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
590 @eh.wrapcommand("update")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
591 @eh.wrapcommand("pull")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
592 def wrapmayobsoletewc(origfn, ui, repo, *args, **opts):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
593 """Warn that the working directory parent is an obsolete changeset"""
1452
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
594 def warnobsolete():
1527
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
595 _warnobsoletewc(ui, repo)
1452
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
596 wlock = None
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
597 try:
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
598 wlock = repo.wlock()
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
599 repo._afterlock(warnobsolete)
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
600 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
601 finally:
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
602 lockmod.release(wlock)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
603 return res
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
604
1527
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
605 @eh.wrapcommand("parents")
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
606 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
607 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
608 _warnobsoletewc(ui, repo)
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
609 return res
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
610
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
611 # XXX this could wrap transaction code
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
612 # 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
613 @eh.wrapcommand("commit")
763
966e2659e989 import: warn about new unstable changesets
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 762
diff changeset
614 @eh.wrapcommand("import")
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
615 @eh.wrapcommand("push")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
616 @eh.wrapcommand("pull")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
617 @eh.wrapcommand("graft")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
618 @eh.wrapcommand("phase")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
619 @eh.wrapcommand("unbundle")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
620 def warnobserrors(orig, ui, repo, *args, **kwargs):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
621 """display warning is the command resulted in more instable changeset"""
658
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
622 # 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
623 # 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
624 filtered = repo.changelog.filteredrevs
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
625 priorunstables = len(set(getrevs(repo, 'unstable')) - filtered)
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
626 priorbumpeds = len(set(getrevs(repo, 'bumped')) - filtered)
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
627 priordivergents = len(set(getrevs(repo, 'divergent')) - filtered)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
628 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
629 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
630 newunstables = \
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
631 len(set(getrevs(repo, 'unstable')) - filtered) - priorunstables
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
632 newbumpeds = \
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
633 len(set(getrevs(repo, 'bumped')) - filtered) - priorbumpeds
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
634 newdivergents = \
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
635 len(set(getrevs(repo, 'divergent')) - filtered) - priordivergents
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
636 if newunstables > 0:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
637 ui.warn(_('%i new unstable changesets\n') % newunstables)
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
638 if newbumpeds > 0:
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
639 ui.warn(_('%i new bumped changesets\n') % newbumpeds)
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
640 if newdivergents > 0:
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
641 ui.warn(_('%i new divergent changesets\n') % newdivergents)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
642 return ret
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
643
1122
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
644 @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
645 def push(orig, repo, *args, **opts):
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
646 """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
647 """
1122
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
648 try:
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
649 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
650 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
651 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
652 "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
653 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
654 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
655 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
656 ex.hint = hint
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
657 raise
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
658
788
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
659 def summaryhook(ui, repo):
513
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
660 def write(fmt, count):
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
661 s = fmt % count
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
662 if count:
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
663 ui.write(s)
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
664 else:
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
665 ui.note(s)
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
666
1640
bbf897714e70 evolve: add --continue note to summary
timeless@gmail.com
parents: 1639
diff changeset
667 state = _evolvestateread(repo)
bbf897714e70 evolve: add --continue note to summary
timeless@gmail.com
parents: 1639
diff changeset
668 if state is not None:
bbf897714e70 evolve: add --continue note to summary
timeless@gmail.com
parents: 1639
diff changeset
669 # i18n: column positioning for "hg summary"
bbf897714e70 evolve: add --continue note to summary
timeless@gmail.com
parents: 1639
diff changeset
670 ui.write(_('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
671
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
672 @eh.extsetup
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
673 def obssummarysetup(ui):
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
674 cmdutil.summaryhooks.add('evolve', summaryhook)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
675
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 ### Core Other extension compat ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
679 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
680
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
681
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
682 @eh.extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
683 def _rebasewrapping(ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
684 # warning about more obsolete
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
685 try:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
686 rebase = extensions.find('rebase')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
687 if rebase:
572
dc107acd0bd2 adapt to core rebase support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 571
diff changeset
688 extensions.wrapcommand(rebase.cmdtable, 'rebase', warnobserrors)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
689 except KeyError:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
690 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
691 try:
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
692 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
693 if histedit:
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
694 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
695 except KeyError:
1575
0c8548df67fe merge with stable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1568 1574
diff changeset
696 pass # histedit not found
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
697
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
698 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
699 ### Old Evolve extension content ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
700 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
701
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
702 # XXX need clean up and proper sorting in other section
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
703
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
704 ### changeset rewriting logic
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
705 #############################
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
706
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
707 def rewrite(repo, old, updates, head, newbases, commitopts):
265
24943df310d4 amend: do not traceback on no-ops
Patrick Mezard <patrick@mezard.eu>
parents: 264
diff changeset
708 """Return (nodeid, created) where nodeid is the identifier of the
24943df310d4 amend: do not traceback on no-ops
Patrick Mezard <patrick@mezard.eu>
parents: 264
diff changeset
709 changeset generated by the rewrite process, and created is True if
24943df310d4 amend: do not traceback on no-ops
Patrick Mezard <patrick@mezard.eu>
parents: 264
diff changeset
710 nodeid was actually created. If created is False, nodeid
24943df310d4 amend: do not traceback on no-ops
Patrick Mezard <patrick@mezard.eu>
parents: 264
diff changeset
711 references a changeset existing before the rewrite call.
24943df310d4 amend: do not traceback on no-ops
Patrick Mezard <patrick@mezard.eu>
parents: 264
diff changeset
712 """
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
713 wlock = lock = tr = None
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
714 try:
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
715 wlock = repo.wlock()
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
716 lock = repo.lock()
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
717 tr = repo.transaction('rewrite')
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
718 if len(old.parents()) > 1: # XXX remove this unnecessary limitation.
1505
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
719 raise error.Abort(_('cannot amend merge changesets'))
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
720 base = old.p1()
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
721 updatebookmarks = _bookmarksupdater(repo, old.node(), tr)
1505
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
722
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
723 # commit a new version of the old changeset, including the update
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
724 # collect all files which might be affected
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
725 files = set(old.files())
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
726 for u in updates:
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
727 files.update(u.files())
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
728
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
729 # Recompute copies (avoid recording a -> b -> a)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
730 copied = copies.pathcopies(base, head)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
731
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
732 # prune files which were reverted by the updates
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
733 def samefile(f):
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
734 if f in head.manifest():
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
735 a = head.filectx(f)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
736 if f in base.manifest():
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
737 b = base.filectx(f)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
738 return (a.data() == b.data()
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
739 and a.flags() == b.flags())
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
740 else:
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
741 return False
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
742 else:
1505
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
743 return f not in base.manifest()
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
744 files = [f for f in files if not samefile(f)]
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
745 # commit version of these files as defined by head
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
746 headmf = head.manifest()
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
747
1505
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
748 def filectxfn(repo, ctx, path):
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
749 if path in headmf:
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
750 fctx = head[path]
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
751 flags = fctx.flags()
1828
2b80c01b3f58 compat: drop compatibility layer around memctx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1827
diff changeset
752 mctx = context.memfilectx(repo, fctx.path(), fctx.data(),
2b80c01b3f58 compat: drop compatibility layer around memctx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1827
diff changeset
753 islink='l' in flags,
2b80c01b3f58 compat: drop compatibility layer around memctx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1827
diff changeset
754 isexec='x' in flags,
2b80c01b3f58 compat: drop compatibility layer around memctx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1827
diff changeset
755 copied=copied.get(path))
1505
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
756 return mctx
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
757 return None
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
758
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
759 message = cmdutil.logmessage(repo.ui, commitopts)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
760 if not message:
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
761 message = old.description()
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
762
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
763 user = commitopts.get('user') or old.user()
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
764 date = commitopts.get('date') or None # old.date()
1510
b86eea66ed02 evolve: be more complete about copying extra from old revisions
Augie Fackler <raf@durin42.com>
parents: 1509
diff changeset
765 extra = dict(commitopts.get('extra', old.extra()))
1505
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
766 extra['branch'] = head.branch()
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
767
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
768 new = context.memctx(repo,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
769 parents=newbases,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
770 text=message,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
771 files=files,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
772 filectxfn=filectxfn,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
773 user=user,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
774 date=date,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
775 extra=extra)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
776
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
777 if commitopts.get('edit'):
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
778 new._text = cmdutil.commitforceeditor(repo, new, [])
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
779 revcount = len(repo)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
780 newid = repo.commitctx(new)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
781 new = repo[newid]
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
782 created = len(repo) != revcount
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
783 updatebookmarks(newid)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
784
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
785 tr.close()
1505
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
786 return newid, created
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
787 finally:
1554
59f5bb1f1877 transaction: fix release order in 'rewrite'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1547
diff changeset
788 lockmod.release(tr, lock, wlock)
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
789
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
790 class MergeFailure(error.Abort):
463
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
791 pass
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
792
1576
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
793 def relocate(repo, orig, dest, pctx=None, keepbranch=False):
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
794 """rewrite <rev> on dest"""
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
795 if orig.rev() == dest.rev():
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
796 raise error.Abort(_('tried to relocate a node on top of itself'),
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
797 hint=_("This shouldn't happen. If you still "
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
798 "need to move changesets, please do so "
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
799 "manually with nothing to rebase - working "
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
800 "directory parent is also destination"))
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
801
1576
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
802 if pctx is None:
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
803 if len(orig.parents()) == 2:
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
804 raise error.Abort(_("tried to relocate a merge commit without "
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
805 "specifying which parent should be moved"),
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
806 hint=_("Specify the parent by passing in pctx"))
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
807 pctx = orig.p1()
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
808
1106
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
809 commitmsg = orig.description()
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
810
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
811 cache = {}
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
812 sha1s = re.findall(sha1re, commitmsg)
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
813 unfi = repo.unfiltered()
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
814 for sha1 in sha1s:
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
815 ctx = None
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
816 try:
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
817 ctx = unfi[sha1]
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
818 except error.RepoLookupError:
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
819 continue
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
820
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
821 if not ctx.obsolete():
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
822 continue
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
823
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
824 successors = obsolete.successorssets(repo, ctx.node(), cache)
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
825
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
826 # We can't make any assumptions about how to update the hash if the
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
827 # cset in question was split or diverged.
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
828 if len(successors) == 1 and len(successors[0]) == 1:
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
829 newsha1 = node.hex(successors[0][0])
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
830 commitmsg = commitmsg.replace(sha1, newsha1[:len(sha1)])
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
831 else:
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
832 repo.ui.note(_('The stale commit message reference to %s could '
1145
fb51113a1c08 evolve: add the missing newline to output messages where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 1144
diff changeset
833 'not be updated\n') % sha1)
1106
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
834
1593
2f117c299325 evolve: remove meaningless transaction nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 1592
diff changeset
835 tr = repo.currenttransaction()
2f117c299325 evolve: remove meaningless transaction nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 1592
diff changeset
836 assert tr is not None
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
837 try:
1729
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
838 r = _evolvemerge(repo, orig, dest, pctx, keepbranch)
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
839 if r[-1]: # some conflict
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
840 raise error.Abort(_('unresolved merge conflicts '
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
841 '(see hg help resolve)'))
1729
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
842 nodenew = _relocatecommit(repo, orig, commitmsg)
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
843 except error.Abort as exc:
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
844 repo.dirstate.beginparentchange()
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
845 repo.setparents(repo['.'].node(), nullid)
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
846 repo.dirstate.write(tr)
1729
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
847 # fix up dirstate for copies and renames
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
848 copies.duplicatecopies(repo, dest.rev(), orig.p1().rev())
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
849 repo.dirstate.endparentchange()
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
850
1729
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
851 class LocalMergeFailure(MergeFailure, exc.__class__):
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
852 pass
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
853 exc.__class__ = LocalMergeFailure
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
854 tr.close() # to keep changes in this transaction (e.g. dirstate)
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
855 raise
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
856 _finalizerelocate(repo, orig, dest, nodenew, tr)
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
857 return nodenew
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
858
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
859 def _bookmarksupdater(repo, oldid, tr):
313
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
860 """Return a callable update(newid) updating the current bookmark
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
861 and bookmarks bound to oldid to newid.
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
862 """
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
863 def updatebookmarks(newid):
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
864 dirty = False
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
865 oldbookmarks = repo.nodebookmarks(oldid)
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
866 if oldbookmarks:
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
867 for b in oldbookmarks:
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
868 repo._bookmarks[b] = newid
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
869 dirty = True
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
870 if dirty:
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
871 repo._bookmarks.recordchange(tr)
313
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
872 return updatebookmarks
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
873
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
874 ### new command
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
875 #############################
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
876 metadataopts = [
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
877 ('d', 'date', '',
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
878 _('record the specified date in metadata'), _('DATE')),
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
879 ('u', 'user', '',
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
880 _('record the specified user in metadata'), _('USER')),
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
881 ]
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
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.uisetup
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
884 def _installimportobsolete(ui):
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
885 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
886 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
887 _('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
888 '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
889
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
890 @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
891 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
892 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
893 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
894 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
895 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
896 oldextract = patch.extract
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
897 try:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
898 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
899 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
900 finally:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
901 patch.extract = oldextract
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
902 created = ret[1]
1055
cfe1b9d3e5d9 import: handle patch with no node information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1054
diff changeset
903 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
904 and created != expected):
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
905 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
906 try:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
907 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
908 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
909 metadata=metadata)
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
910 tr.close()
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
911 finally:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
912 tr.release()
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
913 return ret
930
cac35bef8aee import: --obsolete flag for automatic obsolescence marker creation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 927
diff changeset
914
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
915
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
916 def _deprecatealias(oldalias, newalias):
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
917 '''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
918
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
919 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
920 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
921 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
922 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
923 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
924
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
925 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
926 '''
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
927 try:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
928 aliases, entry = cmdutil.findcmd(newalias, cmdtable)
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
929 except error.UnknownCommand:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
930 # Commands may be disabled
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
931 return
1678
7caa5f2040c5 py3: use items() instead of iteritems()
timeless@gmail.com
parents: 1677
diff changeset
932 for alias, e in cmdtable.items():
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
933 if e is entry:
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
934 break
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
935
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
936 synopsis = '(DEPRECATED)'
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
937 if len(entry) > 2:
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
938 fn, opts, _syn = entry
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
939 else:
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
940 fn, opts, = entry
1496
62aa11956a40 evolve: _() should not contain %
timeless@mozdev.org
parents: 1495
diff changeset
941 deprecationwarning = _('%s have been deprecated in favor of %s\n') % (
62aa11956a40 evolve: _() should not contain %
timeless@mozdev.org
parents: 1495
diff changeset
942 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
943
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
944 def newfn(*args, **kwargs):
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
945 ui = args[0]
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
946 ui.warn(deprecationwarning)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
947 util.checksignature(fn)(*args, **kwargs)
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
948 newfn.__doc__ = deprecationwarning
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
949 cmdwrapper = eh.command(oldalias, opts, synopsis)
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
950 cmdwrapper(newfn)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
951
895
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
952 @eh.extsetup
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
953 def deprecatealiases(ui):
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
954 _deprecatealias('gup', 'next')
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
955 _deprecatealias('gdown', 'previous')
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
956
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
957 def _solveone(ui, repo, ctx, dryrun, confirm, progresscb, category):
1320
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
958 """Resolve the troubles affecting one revision"""
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
959 wlock = lock = tr = None
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
960 try:
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
961 wlock = repo.wlock()
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
962 lock = repo.lock()
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
963 tr = repo.transaction("evolve")
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
964 if 'unstable' == category:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
965 result = _solveunstable(ui, repo, ctx, dryrun, confirm, progresscb)
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
966 elif 'bumped' == category:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
967 result = _solvebumped(ui, repo, ctx, dryrun, confirm, progresscb)
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
968 elif 'divergent' == category:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
969 result = _solvedivergent(ui, repo, ctx, dryrun, confirm,
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
970 progresscb)
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
971 else:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
972 assert False, "unknown trouble category: %s" % (category)
1320
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
973 tr.close()
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
974 return result
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
975 finally:
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
976 lockmod.release(tr, lock, wlock)
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
977
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
978 def _handlenotrouble(ui, repo, allopt, revopt, anyopt, targetcat):
1327
7821a00fb6de evolve: rename handlenotrouble to _handlenotrouble and add doc
Laurent Charignon <lcharignon@fb.com>
parents: 1326
diff changeset
979 """Used by the evolve function to display an error message when
7821a00fb6de evolve: rename handlenotrouble to _handlenotrouble and add doc
Laurent Charignon <lcharignon@fb.com>
parents: 1326
diff changeset
980 no troubles can be resolved"""
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
981 troublecategories = ['bumped', 'divergent', 'unstable']
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
982 unselectedcategories = [c for c in troublecategories if c != targetcat]
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
983 msg = None
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
984 hint = None
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
985
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
986 troubled = {
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
987 "unstable": repo.revs("unstable()"),
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
988 "divergent": repo.revs("divergent()"),
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
989 "bumped": repo.revs("bumped()"),
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
990 "all": repo.revs("troubled()"),
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
991 }
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
992
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
993 hintmap = {
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
994 'bumped': _("do you want to use --bumped"),
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
995 'bumped+divergent': _("do you want to use --bumped or --divergent"),
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
996 'bumped+unstable': _("do you want to use --bumped or --unstable"),
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
997 'divergent': _("do you want to use --divergent"),
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
998 'divergent+unstable': _("do you want to use --divergent"
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
999 " or --unstable"),
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
1000 'unstable': _("do you want to use --unstable"),
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
1001 'any+bumped': _("do you want to use --any (or --rev) and --bumped"),
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
1002 'any+bumped+divergent': _("do you want to use --any (or --rev) and"
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
1003 " --bumped or --divergent"),
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
1004 'any+bumped+unstable': _("do you want to use --any (or --rev) and"
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
1005 "--bumped or --unstable"),
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
1006 'any+divergent': _("do you want to use --any (or --rev) and"
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
1007 " --divergent"),
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
1008 'any+divergent+unstable': _("do you want to use --any (or --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
1009 " and --divergent or --unstable"),
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
1010 'any+unstable': _("do you want to use --any (or --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
1011 "and --unstable"),
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1012 }
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1013
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1014 if revopt:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1015 revs = scmutil.revrange(repo, revopt)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1016 if not revs:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1017 msg = _("set of specified revisions is empty")
1316
f11363699766 evolve: refactoring of the code displaying error when no trouble found
Laurent Charignon <lcharignon@fb.com>
parents: 1315
diff changeset
1018 else:
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1019 msg = _("no %s changesets in specified revisions") % targetcat
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1020 othertroubles = []
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1021 for cat in unselectedcategories:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1022 if revs & troubled[cat]:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1023 othertroubles.append(cat)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1024 if othertroubles:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1025 hint = hintmap['+'.join(othertroubles)]
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1026
1422
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
1027 elif anyopt:
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1028 msg = _("no %s changesets to evolve") % targetcat
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1029 othertroubles = []
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1030 for cat in unselectedcategories:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1031 if troubled[cat]:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1032 othertroubles.append(cat)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1033 if othertroubles:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1034 hint = hintmap['+'.join(othertroubles)]
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1035
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1036 else:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1037 # evolve without any option = relative to the current wdir
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1038 if targetcat == 'unstable':
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1039 msg = _("nothing to evolve on current working copy parent")
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1040 else:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1041 msg = _("current working copy parent is not %s") % targetcat
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1042
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1043 p1 = repo['.'].rev()
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1044 othertroubles = []
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1045 for cat in unselectedcategories:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1046 if p1 in troubled[cat]:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1047 othertroubles.append(cat)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1048 if othertroubles:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1049 hint = hintmap['+'.join(othertroubles)]
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1050 else:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1051 l = len(troubled[targetcat])
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1052 if l:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1053 hint = _("%d other %s in the repository, do you want --any "
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
1054 "or --rev") % (l, targetcat)
750
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
1055 else:
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1056 othertroubles = []
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1057 for cat in unselectedcategories:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1058 if troubled[cat]:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1059 othertroubles.append(cat)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1060 if othertroubles:
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
1061 hint = hintmap['any+' + ('+'.join(othertroubles))]
750
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
1062 else:
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1063 msg = _("no troubled changesets")
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1064
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1065 assert msg is not None
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
1066 ui.write_err("%s\n" % msg)
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1067 if hint:
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
1068 ui.write_err("(%s)\n" % hint)
1316
f11363699766 evolve: refactoring of the code displaying error when no trouble found
Laurent Charignon <lcharignon@fb.com>
parents: 1315
diff changeset
1069 return 2
f11363699766 evolve: refactoring of the code displaying error when no trouble found
Laurent Charignon <lcharignon@fb.com>
parents: 1315
diff changeset
1070 else:
f11363699766 evolve: refactoring of the code displaying error when no trouble found
Laurent Charignon <lcharignon@fb.com>
parents: 1315
diff changeset
1071 return 1
1324
739208d1ee62 evolve: extract cleanup logic in the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1323
diff changeset
1072
739208d1ee62 evolve: extract cleanup logic in the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1323
diff changeset
1073 def _cleanup(ui, repo, startnode, showprogress):
739208d1ee62 evolve: extract cleanup logic in the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1323
diff changeset
1074 if showprogress:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1075 ui.progress(_('evolve'), None)
1099
bac4e0bc9f6a evolve: write a status message when the working directory changes
David Soria Parra <davidsp@fb.com>
parents: 1067
diff changeset
1076 if repo['.'] != startnode:
bac4e0bc9f6a evolve: write a status message when the working directory changes
David Soria Parra <davidsp@fb.com>
parents: 1067
diff changeset
1077 ui.status(_('working directory is now at %s\n') % repo['.'])
bac4e0bc9f6a evolve: write a status message when the working directory changes
David Soria Parra <davidsp@fb.com>
parents: 1067
diff changeset
1078
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1079 class MultipleSuccessorsError(RuntimeError):
1569
bd1468c23d88 evolve: scattered typo fixes in comments, docstrings
Greg Ward <greg@gerg.ca>
parents: 1528
diff changeset
1080 """Exception raised by _singlesuccessor when multiple successor sets exists
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1081
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1082 The object contains the list of successorssets in its 'successorssets'
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1083 attribute to call to easily recover.
509
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
1084 """
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1085
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1086 def __init__(self, successorssets):
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1087 self.successorssets = successorssets
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1088
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1089 def _singlesuccessor(repo, p):
1369
4ed67cce8c23 evolve: properly evolve stacked unstable with --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1364
diff changeset
1090 """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
1091
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1092 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
1093
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1094 if not p.obsolete():
1369
4ed67cce8c23 evolve: properly evolve stacked unstable with --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1364
diff changeset
1095 return p.rev()
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1096 obs = repo[p]
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1097 ui = repo.ui
630
722b52c75f02 compat: adapt to upstreaming of divergent logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 622
diff changeset
1098 newer = obsolete.successorssets(repo, obs.node())
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
1099 # search of a parent which is not killed
1440
afe46c3b15db evolve: clarify code in _singlesuccessor
Laurent Charignon <lcharignon@fb.com>
parents: 1428
diff changeset
1100 while not newer:
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
1101 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
1102 " 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
1103 obs)
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
1104 obs = obs.parents()[0]
630
722b52c75f02 compat: adapt to upstreaming of divergent logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 622
diff changeset
1105 newer = obsolete.successorssets(repo, obs.node())
1428
20a3b0b27bfe evolve: raise MultipleSuccessorsError when computing dependency for split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1427
diff changeset
1106 if len(newer) > 1 or len(newer[0]) > 1:
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1107 raise MultipleSuccessorsError(newer)
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1108
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1109 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
1110
1361
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
1111 def builddependencies(repo, revs):
1411
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
1112 """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
1113 (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
1114
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1115 # 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
1116 # 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
1117 # dependencies = {3: [6], 6:[]}
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1118 # 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
1119 dependencies = {}
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1120 # 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
1121 rdependencies = collections.defaultdict(set)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1122
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1123 for r in revs:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1124 dependencies[r] = set()
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1125 for p in repo[r].parents():
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1126 try:
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1127 succ = _singlesuccessor(repo, p)
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1128 except MultipleSuccessorsError as exc:
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1129 dependencies[r] = exc.successorssets
1418
ed9a8b1ee9bd evolve: fix error in builddependencies
Laurent Charignon <lcharignon@fb.com>
parents: 1415
diff changeset
1130 continue
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1131 if succ in revs:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1132 dependencies[r].add(succ)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1133 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
1134 return dependencies, rdependencies
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
1135
1467
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1136 def _dedupedivergents(repo, revs):
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1137 """Dedupe the divergents revs in revs to get one from each group with the
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1138 lowest revision numbers
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1139 """
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1140 repo = repo.unfiltered()
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1141 res = set()
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1142 # To not reevaluate divergents of the same group once one is encountered
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1143 discarded = set()
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1144 for rev in revs:
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1145 if rev in discarded:
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1146 continue
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1147 divergent = repo[rev]
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1148 base, others = divergentdata(divergent)
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1149 othersrevs = [o.rev() for o in others]
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1150 res.add(min([divergent.rev()] + othersrevs))
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1151 discarded.update(othersrevs)
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1152 return res
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1153
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1154 def _selectrevs(repo, allopt, revopt, anyopt, targetcat):
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1155 """select troubles in repo matching according to given options"""
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1156 revs = set()
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1157 if allopt or revopt:
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
1158 revs = repo.revs("%s()" % targetcat)
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1159 if revopt:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1160 revs = scmutil.revrange(repo, revopt) & revs
1626
0edb545503fe topic: 'hg evolve --all' pick all trouble within current topic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1624
diff changeset
1161 elif not anyopt:
0edb545503fe topic: 'hg evolve --all' pick all trouble within current topic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1624
diff changeset
1162 topic = getattr(repo, 'currenttopic', '')
0edb545503fe topic: 'hg evolve --all' pick all trouble within current topic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1624
diff changeset
1163 if topic:
0edb545503fe topic: 'hg evolve --all' pick all trouble within current topic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1624
diff changeset
1164 revs = repo.revs('topic(%s)', topic) & revs
0edb545503fe topic: 'hg evolve --all' pick all trouble within current topic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1624
diff changeset
1165 elif targetcat == 'unstable':
0edb545503fe topic: 'hg evolve --all' pick all trouble within current topic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1624
diff changeset
1166 revs = _aspiringdescendant(repo,
0edb545503fe topic: 'hg evolve --all' pick all trouble within current topic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1624
diff changeset
1167 repo.revs('(.::) - obsolete()::'))
0edb545503fe topic: 'hg evolve --all' pick all trouble within current topic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1624
diff changeset
1168 revs = set(revs)
1467
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1169 if targetcat == 'divergent':
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1170 # Pick one divergent per group of divergents
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1171 revs = _dedupedivergents(repo, revs)
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1172 elif anyopt:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1173 revs = repo.revs('first(%s())' % (targetcat))
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1174 elif targetcat == 'unstable':
1421
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1175 revs = set(_aspiringchildren(repo, repo.revs('(.::) - obsolete()::')))
1420
0b714c4ad9ff evolve: consider all potential candidates on bare evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1419
diff changeset
1176 if 1 < len(revs):
0b714c4ad9ff evolve: consider all potential candidates on bare evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1419
diff changeset
1177 msg = "multiple evolve candidates"
0b714c4ad9ff evolve: consider all potential candidates on bare evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1419
diff changeset
1178 hint = (_("select one of %s with --rev")
0b714c4ad9ff evolve: consider all potential candidates on bare evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1419
diff changeset
1179 % ', '.join([str(repo[r]) for r in sorted(revs)]))
0b714c4ad9ff evolve: consider all potential candidates on bare evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1419
diff changeset
1180 raise error.Abort(msg, hint=hint)
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1181 elif targetcat in repo['.'].troubles():
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1182 revs = set([repo['.'].rev()])
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1183 return revs
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1184
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1185
1411
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
1186 def _orderrevs(repo, revs):
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
1187 """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
1188
1571
0e8936e7cb89 evolve: improve the confusing docstring for _orderrevs()
Greg Ward <greg@gerg.ca>
parents: 1570
diff changeset
1189 revs is a list of unstable revisions.
0e8936e7cb89 evolve: improve the confusing docstring for _orderrevs()
Greg Ward <greg@gerg.ca>
parents: 1570
diff changeset
1190
0e8936e7cb89 evolve: improve the confusing docstring for _orderrevs()
Greg Ward <greg@gerg.ca>
parents: 1570
diff changeset
1191 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
1192 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
1193 eventually.
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
1194
1571
0e8936e7cb89 evolve: improve the confusing docstring for _orderrevs()
Greg Ward <greg@gerg.ca>
parents: 1570
diff changeset
1195 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
1196 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
1197 """
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
1198 # 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
1199 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
1200 # Step 2: Build the ordering
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1201 # 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
1202 # 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
1203 # 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
1204 # 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
1205 # built
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1206 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
1207 if not dependencies[r]])
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1208 ordering = []
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1209 while solvablerevs:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1210 rev = solvablerevs.popleft()
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1211 for dependent in rdependencies[rev]:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1212 dependencies[dependent].remove(rev)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1213 if not dependencies[dependent]:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1214 solvablerevs.append(dependent)
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1215 del dependencies[rev]
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1216 ordering.append(rev)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1217
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1218 ordering.extend(sorted(dependencies))
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1219 return ordering
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1220
1634
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1221 def divergentsets(repo, ctx):
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1222 """Compute sets of commits divergent with a given one"""
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1223 cache = {}
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1224 base = {}
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1225 for n in obsolete.allprecursors(repo.obsstore, [ctx.node()]):
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1226 if n == ctx.node():
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1227 # a node can't be a base for divergence with itself
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1228 continue
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1229 nsuccsets = obsolete.successorssets(repo, n, cache)
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1230 for nsuccset in nsuccsets:
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1231 if ctx.node() in nsuccset:
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1232 # we are only interested in *other* successor sets
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1233 continue
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1234 if tuple(nsuccset) in base:
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1235 # we already know the latest base for this divergency
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1236 continue
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1237 base[tuple(nsuccset)] = n
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1238 divergence = []
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1239 for divset, b in base.iteritems():
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1240 divergence.append({
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1241 'divergentnodes': divset,
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1242 'commonprecursor': b
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1243 })
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1244
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1245 return divergence
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1246
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1247 def _preparelistctxs(items, condition):
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1248 return [item.hex() for item in items if condition(item)]
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1249
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1250 def _formatctx(fm, ctx):
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1251 fm.data(node=ctx.hex())
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1252 fm.data(desc=ctx.description())
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1253 fm.data(date=ctx.date())
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1254 fm.data(user=ctx.user())
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1255
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1256 def listtroubles(ui, repo, troublecategories, **opts):
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1257 """Print all the troubles for the repo (or given revset)"""
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1258 troublecategories = troublecategories or ['divergent', 'unstable', 'bumped']
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1259 showunstable = 'unstable' in troublecategories
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1260 showbumped = 'bumped' in troublecategories
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1261 showdivergent = 'divergent' in troublecategories
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1262
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1263 revs = repo.revs('+'.join("%s()" % t for t in troublecategories))
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1264 if opts.get('rev'):
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1265 revs = revs & repo.revs(opts.get('rev'))
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1266
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1267 fm = ui.formatter('evolvelist', opts)
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1268 for rev in revs:
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1269 ctx = repo[rev]
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1270 unpars = _preparelistctxs(ctx.parents(), lambda p: p.unstable())
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1271 obspars = _preparelistctxs(ctx.parents(), lambda p: p.obsolete())
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1272 imprecs = _preparelistctxs(repo.set("allprecursors(%n)", ctx.node()),
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1273 lambda p: not p.mutable())
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1274 dsets = divergentsets(repo, ctx)
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1275
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1276 fm.startitem()
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1277 # plain formatter section
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1278 hashlen, desclen = 12, 60
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1279 desc = ctx.description()
1637
078e6777ac15 list: limit to descriptions to firstline
timeless@gmail.com
parents: 1636
diff changeset
1280 if desc:
078e6777ac15 list: limit to descriptions to firstline
timeless@gmail.com
parents: 1636
diff changeset
1281 desc = desc.splitlines()[0]
1634
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1282 desc = (desc[:desclen] + '...') if len(desc) > desclen else desc
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1283 fm.plain('%s: ' % ctx.hex()[:hashlen])
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1284 fm.plain('%s\n' % desc)
1680
fe4b41a2af4e evolve: include node, rev, desc, and phase in list
timeless@gmail.com
parents: 1679
diff changeset
1285 fm.data(node=ctx.hex(), rev=ctx.rev(), desc=desc, phase=ctx.phasestr())
1634
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1286
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1287 for unpar in unpars if showunstable else []:
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1288 fm.plain(' unstable: %s (unstable parent)\n' % unpar[:hashlen])
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1289 for obspar in obspars if showunstable else []:
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1290 fm.plain(' unstable: %s (obsolete parent)\n' % obspar[:hashlen])
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1291 for imprec in imprecs if showbumped else []:
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1292 fm.plain(' bumped: %s (immutable precursor)\n' % imprec[:hashlen])
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1293
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1294 if dsets and showdivergent:
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1295 for dset in dsets:
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1296 fm.plain(' divergent: ')
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1297 first = True
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1298 for n in dset['divergentnodes']:
1646
7e1b49cda66c list: report the phase for divergent commits
timeless@gmail.com
parents: 1640
diff changeset
1299 t = "%s (%s)" if first else " %s (%s)"
1634
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1300 first = False
1646
7e1b49cda66c list: report the phase for divergent commits
timeless@gmail.com
parents: 1640
diff changeset
1301 fm.plain(t % (node.hex(n)[:hashlen], repo[n].phasestr()))
1634
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1302 comprec = node.hex(dset['commonprecursor'])[:hashlen]
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1303 fm.plain(" (precursor %s)\n" % comprec)
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1304 fm.plain("\n")
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1305
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1306 # templater-friendly section
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1307 _formatctx(fm, ctx)
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1308 troubles = []
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1309 for unpar in unpars:
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1310 troubles.append({'troubletype': 'unstable', 'sourcenode': unpar,
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1311 'sourcetype': 'unstableparent'})
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1312 for obspar in obspars:
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1313 troubles.append({'troubletype': 'unstable', 'sourcenode': obspar,
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1314 'sourcetype': 'obsoleteparent'})
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1315 for imprec in imprecs:
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1316 troubles.append({'troubletype': 'bumped', 'sourcenode': imprec,
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1317 'sourcetype': 'immutableprecursor'})
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1318 for dset in dsets:
1679
db1db8633b8c evolve: use hex in list output
timeless@gmail.com
parents: 1678
diff changeset
1319 divnodes = [{'node': node.hex(n),
1680
fe4b41a2af4e evolve: include node, rev, desc, and phase in list
timeless@gmail.com
parents: 1679
diff changeset
1320 'phase': repo[n].phasestr(),
1679
db1db8633b8c evolve: use hex in list output
timeless@gmail.com
parents: 1678
diff changeset
1321 } for n in dset['divergentnodes']]
1634
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1322 troubles.append({'troubletype': 'divergent',
1679
db1db8633b8c evolve: use hex in list output
timeless@gmail.com
parents: 1678
diff changeset
1323 'commonprecursor': node.hex(dset['commonprecursor']),
1634
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1324 'divergentnodes': divnodes})
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1325 fm.data(troubles=troubles)
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1326
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1327 fm.end()
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1328
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1329 @eh.command(
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1330 '^evolve|stabilize|solve',
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1331 [('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
1332 _('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
1333 ('', 'confirm', False,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1334 _('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
1335 ('A', 'any', False,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1336 _('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
1337 'directory')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1338 ('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
1339 ('', 'bumped', False, _('solves only bumped changesets')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1340 ('', 'divergent', False, _('solves only divergent changesets')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1341 ('', 'unstable', False, _('solves only unstable changesets (default)')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1342 ('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
1343 '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
1344 ('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
1345 ('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
1346 ] + mergetoolopts,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1347 _('[OPTIONS]...')
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1348 )
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
1349 def evolve(ui, repo, **opts):
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1350 """solve troubled changesets in your repository
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1351
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1352 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
1353 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
1354 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
1355
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1356 - update working copy to a successor
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1357 - rebase an unstable changeset
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1358 - 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
1359 - fuse divergent changesets back together
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1360
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1361 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
1362 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
1363 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
1364 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
1365 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
1366 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
1367 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
1368 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
1369 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
1370
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1371 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
1372 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
1373 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
1374
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1375 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
1376 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
1377 are not related to your working copy.
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1378 It also refuses to solve bumped or divergent changesets unless you explicity
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1379 request such behavior (see below).
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1380
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1381 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
1382 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
1383 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
1384 working copy parent.
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1385 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
1386 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
1387 evolving all branches.
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1388
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1389 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
1390 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
1391 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
1392 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
1393 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
1394 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
1395
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1396 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
1397 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
1398
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1399 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
1400 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
1401 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
1402 ``--rev`` and ``--any``.
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1403
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1404 ``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
1405 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
1406
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1407 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
1408 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
1409 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
1410 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
1411 (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
1412 ``--rev``, ``--all``, or ``--any``.
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1413
1634
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1414 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
1415 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
1416 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
1417 """
145
928f217c1701 stabilize: stabilize my topological branch only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 142
diff changeset
1418
1325
1fe3da0b4601 evolve: add --rev option to the evolve command
Laurent Charignon <lcharignon@fb.com>
parents: 1324
diff changeset
1419 # Options
1634
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1420 listopt = opts['list']
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
1421 contopt = opts['continue']
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
1422 anyopt = opts['any']
704
2ec7c3673679 evolve: add --all argument.
Levi Bard <levi@unity3d.com>
parents: 703
diff changeset
1423 allopt = opts['all']
1318
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
1424 startnode = repo['.']
703
a246b02499d9 evolve: extract evolve --any implementation into a function.
Levi Bard <levi@unity3d.com>
parents: 663
diff changeset
1425 dryrunopt = opts['dry_run']
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1426 confirmopt = opts['confirm']
1325
1fe3da0b4601 evolve: add --rev option to the evolve command
Laurent Charignon <lcharignon@fb.com>
parents: 1324
diff changeset
1427 revopt = opts['rev']
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1428 troublecategories = ['bumped', 'divergent', 'unstable']
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1429 specifiedcategories = [t for t in troublecategories if opts[t]]
1634
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1430 if listopt:
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1431 listtroubles(ui, repo, specifiedcategories, **opts)
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1432 return
9ae4e79a28f3 evolve--list: initial implementation
Kostia Balytskyi <ikostia@fb.com>
parents: 1633
diff changeset
1433
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1434 targetcat = 'unstable'
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1435 if 1 < len(specifiedcategories):
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1436 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
1437 raise error.Abort(msg)
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1438 elif len(specifiedcategories) == 1:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1439 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
1440 elif repo['.'].obsolete():
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1441 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
1442 {'template': shorttemplate})
1409
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
1443 # 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
1444 try:
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
1445 ctx = repo[_singlesuccessor(repo, repo['.'])]
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1446 except 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
1447 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
1448 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
1449 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
1450 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
1451 return 2
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
1452
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1453 ui.status(_('update:'))
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1454 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
1455 displayer.show(ctx)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1456
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1457 if dryrunopt:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1458 return 0
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1459 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
1460 if ctx != startnode:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1461 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
1462 return res
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1463
986
c1f8ece4182d evolve: add --tool option so we don't have to use HGMERGE
Greg Ward <greg@gerg.ca>
parents: 985
diff changeset
1464 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'evolve')
1323
603104c880f7 evolve: simplify the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1322
diff changeset
1465 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
1466
1318
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
1467 # Progress handling
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
1468 seen = 1
1323
603104c880f7 evolve: simplify the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1322
diff changeset
1469 count = allopt and len(troubled) or 1
1319
8376fe35ebda evolve: add new variable and comment
Laurent Charignon <lcharignon@fb.com>
parents: 1318
diff changeset
1470 showprogress = allopt
1318
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
1471
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
1472 def progresscb():
1325
1fe3da0b4601 evolve: add --rev option to the evolve command
Laurent Charignon <lcharignon@fb.com>
parents: 1324
diff changeset
1473 if revopt or allopt:
1624
081605c2e9b6 evolve: mark progress units for translation
Anton Shestakov <av6@dwimlabs.net>
parents: 1623
diff changeset
1474 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
1475
1319
8376fe35ebda evolve: add new variable and comment
Laurent Charignon <lcharignon@fb.com>
parents: 1318
diff changeset
1476 # Continuation handling
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
1477 if contopt:
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
1478 if anyopt:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1479 raise error.Abort('cannot specify both "--any" and "--continue"')
704
2ec7c3673679 evolve: add --all argument.
Levi Bard <levi@unity3d.com>
parents: 703
diff changeset
1480 if allopt:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1481 raise error.Abort('cannot specify both "--all" and "--continue"')
1597
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
1482 state = _evolvestateread(repo)
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
1483 if state is None:
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
1484 raise error.Abort('no evolve to continue')
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
1485 orig = repo[state['current']]
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
1486 # XXX This is a terrible terrible hack, please get rid of it.
1722
b4be34677fda continue: ensure we hold the wlock before writing file to disk
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1720
diff changeset
1487 lock = repo.wlock()
1597
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
1488 try:
2051
74934195747b evolve: switch away from deprecated repo.opener
Martin von Zweigbergk <martinvonz@google.com>
parents: 2049
diff changeset
1489 repo.vfs.write('graftstate', orig.hex() + '\n')
1722
b4be34677fda continue: ensure we hold the wlock before writing file to disk
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1720
diff changeset
1490 try:
b4be34677fda continue: ensure we hold the wlock before writing file to disk
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1720
diff changeset
1491 graftcmd = commands.table['graft'][0]
b4be34677fda continue: ensure we hold the wlock before writing file to disk
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1720
diff changeset
1492 ret = graftcmd(ui, repo, old_obsolete=True, **{'continue': True})
b4be34677fda continue: ensure we hold the wlock before writing file to disk
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1720
diff changeset
1493 _evolvestatedelete(repo)
b4be34677fda continue: ensure we hold the wlock before writing file to disk
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1720
diff changeset
1494 return ret
b4be34677fda continue: ensure we hold the wlock before writing file to disk
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1720
diff changeset
1495 finally:
2070
9105c3c54045 cleanup: stop using 'repo.join' methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2064
diff changeset
1496 util.unlinkpath(repo.vfs.join('graftstate'), ignoremissing=True)
1597
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
1497 finally:
1722
b4be34677fda continue: ensure we hold the wlock before writing file to disk
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1720
diff changeset
1498 lock.release()
1402
08ae023882f1 evolve: check for uncommited change earlier
Laurent Charignon <lcharignon@fb.com>
parents: 1398
diff changeset
1499 cmdutil.bailifchanged(repo)
08ae023882f1 evolve: check for uncommited change earlier
Laurent Charignon <lcharignon@fb.com>
parents: 1398
diff changeset
1500
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1501 if revopt and allopt:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1502 raise error.Abort('cannot specify both "--rev" and "--all"')
1405
eaf82490af76 evolve: prevent using --rev and --any together
Laurent Charignon <lcharignon@fb.com>
parents: 1404
diff changeset
1503 if revopt and anyopt:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1504 raise error.Abort('cannot specify both "--rev" and "--any"')
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1505
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1506 revs = _selectrevs(repo, allopt, revopt, anyopt, targetcat)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1507
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1508 if not revs:
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1509 return _handlenotrouble(ui, repo, allopt, revopt, anyopt, targetcat)
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1510
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1511 # For the progress bar to show
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1512 count = len(revs)
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1513 # Order the revisions
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1514 if targetcat == 'unstable':
1411
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
1515 revs = _orderrevs(repo, revs)
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1516 for rev in revs:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1517 progresscb()
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1518 _solveone(ui, repo, repo[rev], dryrunopt, confirmopt,
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
1519 progresscb, targetcat)
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1520 seen += 1
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1521 progresscb()
1324
739208d1ee62 evolve: extract cleanup logic in the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1323
diff changeset
1522 _cleanup(ui, repo, startnode, showprogress)
1099
bac4e0bc9f6a evolve: write a status message when the working directory changes
David Soria Parra <davidsp@fb.com>
parents: 1067
diff changeset
1523
1421
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1524 def _possibledestination(repo, rev):
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1525 """return all changesets that may be a new parent for REV"""
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1526 tonode = repo.changelog.node
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1527 parents = repo.changelog.parentrevs
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1528 torev = repo.changelog.rev
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1529 dest = set()
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1530 tovisit = list(parents(rev))
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1531 while tovisit:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1532 r = tovisit.pop()
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1533 succsets = obsolete.successorssets(repo, tonode(r))
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1534 if not succsets:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1535 tovisit.extend(parents(r))
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1536 else:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1537 # We should probably pick only one destination from split
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1538 # (case where '1 < len(ss)'), This could be the currently tipmost
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1539 # but logic is less clear when result of the split are now on
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1540 # multiple branches.
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1541 for ss in succsets:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1542 for n in ss:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1543 dest.add(torev(n))
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1544 return dest
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1545
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1546 def _aspiringchildren(repo, revs):
1420
0b714c4ad9ff evolve: consider all potential candidates on bare evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1419
diff changeset
1547 """Return a list of changectx which can be stabilized on top of pctx or
1421
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1548 one of its descendants. Empty list if none can be found."""
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1549 target = set(revs)
1420
0b714c4ad9ff evolve: consider all potential candidates on bare evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1419
diff changeset
1550 result = []
1421
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1551 for r in repo.revs('unstable() - %ld', revs):
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1552 dest = _possibledestination(repo, r)
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1553 if target & dest:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1554 result.append(r)
1420
0b714c4ad9ff evolve: consider all potential candidates on bare evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1419
diff changeset
1555 return result
468
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
1556
1422
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
1557 def _aspiringdescendant(repo, revs):
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
1558 """Return a list of changectx which can be stabilized on top of pctx or
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
1559 one of its descendants recursively. Empty list if none can be found."""
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
1560 target = set(revs)
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
1561 result = set(target)
1423
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1562 paths = collections.defaultdict(set)
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1563 for r in repo.revs('unstable() - %ld', revs):
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1564 for d in _possibledestination(repo, r):
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1565 paths[d].add(r)
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1566
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1567 result = set(target)
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1568 tovisit = list(revs)
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1569 while tovisit:
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1570 base = tovisit.pop()
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1571 for unstable in paths[base]:
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1572 if unstable not in result:
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1573 tovisit.append(unstable)
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1574 result.add(unstable)
1422
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
1575 return sorted(result - target)
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
1576
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1577 def _solveunstable(ui, repo, orig, dryrun=False, confirm=False,
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1578 progresscb=None):
1569
bd1468c23d88 evolve: scattered typo fixes in comments, docstrings
Greg Ward <greg@gerg.ca>
parents: 1528
diff changeset
1579 """Stabilize an unstable changeset"""
1576
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
1580 pctx = orig.p1()
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
1581 if len(orig.parents()) == 2:
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
1582 if not pctx.obsolete():
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
1583 pctx = orig.p2() # second parent is obsolete ?
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
1584 elif orig.p2().obsolete():
1639
ff0ff0f28a13 evolve: report merge node
timeless@gmail.com
parents: 1638
diff changeset
1585 hint = _("Redo the merge (%s) and use `hg prune <old> "
ff0ff0f28a13 evolve: report merge node
timeless@gmail.com
parents: 1638
diff changeset
1586 "--succ <new>` to obsolete the old one") % orig.hex()[:12]
1638
5b7596805f7f evolve: treat no support as non fatal
timeless@gmail.com
parents: 1637
diff changeset
1587 ui.warn(_("warning: no support for evolving merge changesets "
5b7596805f7f evolve: treat no support as non fatal
timeless@gmail.com
parents: 1637
diff changeset
1588 "with two obsolete parents yet\n") +
5b7596805f7f evolve: treat no support as non fatal
timeless@gmail.com
parents: 1637
diff changeset
1589 _("(%s)\n") % hint)
5b7596805f7f evolve: treat no support as non fatal
timeless@gmail.com
parents: 1637
diff changeset
1590 return False
1576
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
1591
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
1592 if not pctx.obsolete():
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1593 ui.warn(_("cannot solve instability of %s, skipping\n") % orig)
1354
b4a62d6f0353 evolve: don't crash on singled out revisions
Laurent Charignon <lcharignon@fb.com>
parents: 1351
diff changeset
1594 return False
1576
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
1595 obs = pctx
630
722b52c75f02 compat: adapt to upstreaming of divergent logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 622
diff changeset
1596 newer = obsolete.successorssets(repo, obs.node())
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
1597 # search of a parent which is not killed
588
89c8550019d0 mercurial: replace all `newerversion` call by `successorsset` call
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 587
diff changeset
1598 while not newer or newer == [()]:
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
1599 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
1600 " 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
1601 obs)
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
1602 obs = obs.parents()[0]
630
722b52c75f02 compat: adapt to upstreaming of divergent logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 622
diff changeset
1603 newer = obsolete.successorssets(repo, obs.node())
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
1604 if len(newer) > 1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1605 msg = _("skipping %s: divergent rewriting. can't choose "
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1606 "destination\n") % obs
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1607 ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1608 return 2
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
1609 targets = newer[0]
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
1610 assert targets
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
1611 if len(targets) > 1:
1481
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1612 # split target, figure out which one to pick, are they all in line?
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1613 targetrevs = [repo[r].rev() for r in targets]
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1614 roots = repo.revs('roots(%ld)', targetrevs)
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1615 heads = repo.revs('heads(%ld)', targetrevs)
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1616 if len(roots) > 1 or len(heads) > 1:
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1617 msg = "cannot solve split accross two branches\n"
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1618 ui.write_err(msg)
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1619 return 2
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1620 target = repo[heads.first()]
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1621 else:
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1622 target = targets[0]
139
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
1623 displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
1624 target = repo[target]
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1625 if not ui.quiet or confirm:
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
1626 repo.ui.write(_('move:'))
464
d88c761f97c4 stabilize: rename "node" variable to "orig"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 463
diff changeset
1627 displayer.show(orig)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
1628 repo.ui.write(_('atop:'))
146
e80a6c8ad452 stabilize: proper --quiet behavior
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 145
diff changeset
1629 displayer.show(target)
1390
03f202bed47f evolve: fix default value for --confirm
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1389
diff changeset
1630 if confirm and ui.prompt('perform evolve? [Ny]', 'n') != 'y':
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1631 raise error.Abort(_('evolve aborted by user'))
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
1632 if progresscb:
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 progresscb()
546
415540dee2bd fix missing --dest evolve output in dryrun
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 540
diff changeset
1634 todo = 'hg rebase -r %s -d %s\n' % (orig, target)
468
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
1635 if dryrun:
146
e80a6c8ad452 stabilize: proper --quiet behavior
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 145
diff changeset
1636 repo.ui.write(todo)
139
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
1637 else:
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
1638 repo.ui.note(todo)
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
1639 if progresscb:
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
1640 progresscb()
1141
ca17770d2ee9 evolve: preserve branch change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1140
diff changeset
1641 keepbranch = orig.p1().branch() != orig.branch()
139
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
1642 try:
1576
526253198860 evolve: handle merge commit with single obsolete parent (issue4389)
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 1575
diff changeset
1643 relocate(repo, orig, target, pctx, keepbranch)
463
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
1644 except MergeFailure:
1597
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
1645 _evolvestatewrite(repo, {'current': orig.node()})
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
1646 repo.ui.write_err(_('evolve failed!\n'))
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
1647 repo.ui.write_err(
1756
a7dcfff8c4a9 evolve: use single quotes in usage messages
Martin von Zweigbergk <martinvonz@google.com>
parents: 1755
diff changeset
1648 _("fix conflict and run 'hg evolve --continue'"
a7dcfff8c4a9 evolve: use single quotes in usage messages
Martin von Zweigbergk <martinvonz@google.com>
parents: 1755
diff changeset
1649 " or use 'hg update -C .' to abort\n"))
463
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
1650 raise
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
1651
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1652 def _solvebumped(ui, repo, bumped, dryrun=False, confirm=False,
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1653 progresscb=None):
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
1654 """Stabilize a bumped changeset"""
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1655 repo = repo.unfiltered()
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1656 bumped = repo[bumped.rev()]
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
1657 # For now we deny bumped merge
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
1658 if len(bumped.parents()) > 1:
1496
62aa11956a40 evolve: _() should not contain %
timeless@mozdev.org
parents: 1495
diff changeset
1659 msg = _('skipping %s : we do not handle merge yet\n') % bumped
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1660 ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1661 return 2
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
1662 prec = repo.set('last(allprecursors(%d) and public())', bumped).next()
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1663 # For now we deny target merge
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1664 if len(prec.parents()) > 1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1665 msg = _('skipping: %s: public version is a merge, '
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1666 'this is not handled yet\n') % prec
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1667 ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1668 return 2
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1669
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1670 displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1671 if not ui.quiet or confirm:
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
1672 repo.ui.write(_('recreate:'))
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
1673 displayer.show(bumped)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
1674 repo.ui.write(_('atop:'))
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1675 displayer.show(prec)
1390
03f202bed47f evolve: fix default value for --confirm
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1389
diff changeset
1676 if confirm and ui.prompt('perform evolve? [Ny]', 'n') != 'y':
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1677 raise error.Abort(_('evolve aborted by user'))
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1678 if dryrun:
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
1679 todo = 'hg rebase --rev %s --dest %s;\n' % (bumped, prec.p1())
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1680 repo.ui.write(todo)
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1681 repo.ui.write(('hg update %s;\n' % prec))
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1682 repo.ui.write(('hg revert --all --rev %s;\n' % bumped))
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1683 repo.ui.write(('hg commit --msg "bumped update to %s"'))
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1684 return 0
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
1685 if progresscb:
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
1686 progresscb()
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1687 newid = tmpctx = None
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1688 tmpctx = bumped
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1689 # Basic check for common parent. Far too complicated and fragile
1593
2f117c299325 evolve: remove meaningless transaction nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 1592
diff changeset
1690 tr = repo.currenttransaction()
2f117c299325 evolve: remove meaningless transaction nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 1592
diff changeset
1691 assert tr is not None
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
1692 bmupdate = _bookmarksupdater(repo, bumped.node(), tr)
1729
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1693 if not list(repo.set('parents(%d) and parents(%d)', bumped, prec)):
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1694 # Need to rebase the changeset at the right place
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1695 repo.ui.status(
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1696 _('rebasing to destination parent: %s\n') % prec.p1())
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1697 try:
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1698 tmpid = relocate(repo, bumped, prec.p1())
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1699 if tmpid is not None:
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1700 tmpctx = repo[tmpid]
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1701 obsolete.createmarkers(repo, [(bumped, (tmpctx,))])
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1702 except MergeFailure:
2051
74934195747b evolve: switch away from deprecated repo.opener
Martin von Zweigbergk <martinvonz@google.com>
parents: 2049
diff changeset
1703 repo.vfs.write('graftstate', bumped.hex() + '\n')
1729
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1704 repo.ui.write_err(_('evolution failed!\n'))
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
1705 msg = _("fix conflict and run 'hg evolve --continue'\n")
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
1706 repo.ui.write_err(msg)
1729
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1707 raise
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1708 # Create the new commit context
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1709 repo.ui.status(_('computing new diff\n'))
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1710 files = set()
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1711 copied = copies.pathcopies(prec, bumped)
1736
c9a79b432907 merge with stable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1732 1735
diff changeset
1712 precmanifest = prec.manifest().copy()
1729
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1713 # 3.3.2 needs a list.
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1714 # future 3.4 don't detect the size change during iteration
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1715 # this is fishy
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1716 for key, val in list(bumped.manifest().iteritems()):
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1717 precvalue = precmanifest.get(key, None)
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1718 if precvalue is not None:
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1719 del precmanifest[key]
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1720 if precvalue != val:
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1721 files.add(key)
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1722 files.update(precmanifest) # add missing files
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1723 # commit it
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1724 if files: # something to commit!
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1725 def filectxfn(repo, ctx, path):
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1726 if path in bumped:
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1727 fctx = bumped[path]
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1728 flags = fctx.flags()
1828
2b80c01b3f58 compat: drop compatibility layer around memctx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1827
diff changeset
1729 mctx = context.memfilectx(repo, fctx.path(), fctx.data(),
2b80c01b3f58 compat: drop compatibility layer around memctx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1827
diff changeset
1730 islink='l' in flags,
2b80c01b3f58 compat: drop compatibility layer around memctx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1827
diff changeset
1731 isexec='x' in flags,
2b80c01b3f58 compat: drop compatibility layer around memctx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1827
diff changeset
1732 copied=copied.get(path))
1729
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1733 return mctx
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1734 return None
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1735 text = 'bumped update to %s:\n\n' % prec
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1736 text += bumped.description()
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1737
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1738 new = context.memctx(repo,
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1739 parents=[prec.node(), node.nullid],
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1740 text=text,
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1741 files=files,
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1742 filectxfn=filectxfn,
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1743 user=bumped.user(),
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1744 date=bumped.date(),
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1745 extra=bumped.extra())
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1746
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1747 newid = repo.commitctx(new)
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1748 if newid is None:
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1749 obsolete.createmarkers(repo, [(tmpctx, ())])
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1750 newid = prec.node()
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1751 else:
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1752 phases.retractboundary(repo, tr, bumped.phase(), [newid])
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1753 obsolete.createmarkers(repo, [(tmpctx, (repo[newid],))],
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1754 flag=obsolete.bumpedfix)
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1755 bmupdate(newid)
8ed0266c58a3 evolve: removed redundant try/finally blocks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1726
diff changeset
1756 repo.ui.status(_('committed as %s\n') % node.short(newid))
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1757 # reroute the working copy parent to the new changeset
1112
c3e23fbf7bd7 evolve: wrap setparents calls in begin/endparentchange
Siddharth Agarwal <sid0@fb.com>
parents: 1111
diff changeset
1758 repo.dirstate.beginparentchange()
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1759 repo.dirstate.setparents(newid, node.nullid)
1112
c3e23fbf7bd7 evolve: wrap setparents calls in begin/endparentchange
Siddharth Agarwal <sid0@fb.com>
parents: 1111
diff changeset
1760 repo.dirstate.endparentchange()
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1761
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1762 def _solvedivergent(ui, repo, divergent, dryrun=False, confirm=False,
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1763 progresscb=None):
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1764 repo = repo.unfiltered()
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1765 divergent = repo[divergent.rev()]
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
1766 base, others = divergentdata(divergent)
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1767 if len(others) > 1:
760
bbb3a0e1dfea evolve: add more details when we abort for case not handled yet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 757
diff changeset
1768 othersstr = "[%s]" % (','.join([str(i) for i in others]))
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1769 msg = _("skipping %d:divergent with a changeset that got splitted"
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1770 " into multiple ones:\n"
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
1771 "|[%s]\n"
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
1772 "| This is not handled by automatic evolution yet\n"
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
1773 "| You have to fallback to manual handling with commands "
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
1774 "such as:\n"
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
1775 "| - hg touch -D\n"
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
1776 "| - hg prune\n"
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
1777 "| \n"
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
1778 "| You should contact your local evolution Guru for help.\n"
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
1779 ) % (divergent, othersstr)
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1780 ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1781 return 2
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1782 other = others[0]
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1783 if len(other.parents()) > 1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1784 msg = _("skipping %s: divergent changeset can't be "
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1785 "a merge (yet)\n") % divergent
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1786 ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1787 hint = _("You have to fallback to solving this by hand...\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1788 "| This probably means redoing the merge and using \n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1789 "| `hg prune` to kill older version.\n")
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1790 ui.write_err(hint)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1791 return 2
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
1792 if other.p1() not in divergent.parents():
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1793 msg = _("skipping %s: have a different parent than %s "
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1794 "(not handled yet)\n") % (divergent, other)
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1795 hint = _("| %(d)s, %(o)s are not based on the same changeset.\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1796 "| With the current state of its implementation, \n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1797 "| evolve does not work in that case.\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1798 "| rebase one of them next to the other and run \n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1799 "| this command again.\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1800 "| - either: hg rebase --dest 'p1(%(d)s)' -r %(o)s\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1801 "| - or: hg rebase --dest 'p1(%(o)s)' -r %(d)s\n"
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1802 ) % {'d': divergent, 'o': other}
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1803 ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1804 ui.write_err(hint)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1805 return 2
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1806
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1807 displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1808 if not ui.quiet or confirm:
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
1809 ui.write(_('merge:'))
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
1810 displayer.show(divergent)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
1811 ui.write(_('with: '))
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1812 displayer.show(other)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
1813 ui.write(_('base: '))
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1814 displayer.show(base)
1498
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
1815 if confirm and ui.prompt(_('perform evolve? [Ny]'), 'n') != 'y':
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1816 raise error.Abort(_('evolve aborted by user'))
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1817 if dryrun:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1818 ui.write(('hg update -c %s &&\n' % divergent))
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1819 ui.write(('hg merge %s &&\n' % other))
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1820 ui.write(('hg commit -m "auto merge resolving conflict between '
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1821 '%s and %s"&&\n' % (divergent, other)))
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1822 ui.write(('hg up -C %s &&\n' % base))
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1823 ui.write(('hg revert --all --rev tip &&\n'))
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1824 ui.write(('hg commit -m "`hg log -r %s --template={desc}`";\n'
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1825 % divergent))
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1826 return
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1827 if divergent not in repo[None].parents():
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1828 repo.ui.status(_('updating to "local" conflict\n'))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1829 hg.update(repo, divergent.rev())
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1830 repo.ui.note(_('merging divergent changeset\n'))
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
1831 if progresscb:
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
1832 progresscb()
1831
0195dc7bdfa4 compat: drop compatibility layer around update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1830
diff changeset
1833 stats = merge.update(repo,
0195dc7bdfa4 compat: drop compatibility layer around update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1830
diff changeset
1834 other.node(),
0195dc7bdfa4 compat: drop compatibility layer around update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1830
diff changeset
1835 branchmerge=True,
0195dc7bdfa4 compat: drop compatibility layer around update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1830
diff changeset
1836 force=False,
0195dc7bdfa4 compat: drop compatibility layer around update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1830
diff changeset
1837 ancestor=base.node(),
0195dc7bdfa4 compat: drop compatibility layer around update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1830
diff changeset
1838 mergeancestor=True)
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1839 hg._showstats(repo, stats)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1840 if stats[3]:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1841 repo.ui.status(_("use 'hg resolve' to retry unresolved file merges "
1755
6c78a5470583 evolve: prefer "abort" over "abandon" in messages for consistency
Martin von Zweigbergk <martinvonz@google.com>
parents: 1747
diff changeset
1842 "or 'hg update -C .' to abort\n"))
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1843 if stats[3] > 0:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1844 raise error.Abort('merge conflict between several amendments '
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
1845 '(this is not automated yet)',
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
1846 hint="""/!\ You can try:
534
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
1847 /!\ * manual merge + resolve => new cset X
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
1848 /!\ * hg up to the parent of the amended changeset (which are named W and Z)
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
1849 /!\ * hg revert --all -r X
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
1850 /!\ * hg ci -m "same message as the amended changeset" => new cset Y
1631
7463f5880ce9 prune: remove the kill alias
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1630
diff changeset
1851 /!\ * hg prune -n Y W Z
534
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
1852 """)
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
1853 if progresscb:
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
1854 progresscb()
1536
9afe9e0191a1 evolve: evolve --divergent failed when merge had nothing to do (issue4950)
Laurent Charignon <lcharignon@fb.com>
parents: 1532
diff changeset
1855 emtpycommitallowed = repo.ui.backupconfig('ui', 'allowemptycommit')
1593
2f117c299325 evolve: remove meaningless transaction nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 1592
diff changeset
1856 tr = repo.currenttransaction()
2f117c299325 evolve: remove meaningless transaction nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 1592
diff changeset
1857 assert tr is not None
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1858 try:
1636
13f830540a14 config: report evolve as origin for config
timeless@gmail.com
parents: 1635
diff changeset
1859 repo.ui.setconfig('ui', 'allowemptycommit', True, 'evolve')
1112
c3e23fbf7bd7 evolve: wrap setparents calls in begin/endparentchange
Siddharth Agarwal <sid0@fb.com>
parents: 1111
diff changeset
1860 repo.dirstate.beginparentchange()
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1861 repo.dirstate.setparents(divergent.node(), node.nullid)
1112
c3e23fbf7bd7 evolve: wrap setparents calls in begin/endparentchange
Siddharth Agarwal <sid0@fb.com>
parents: 1111
diff changeset
1862 repo.dirstate.endparentchange()
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1863 oldlen = len(repo)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1864 amend(ui, repo, message='', logfile='')
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1865 if oldlen == len(repo):
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1866 new = divergent
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1867 # no changes
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1868 else:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1869 new = repo['.']
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
1870 obsolete.createmarkers(repo, [(other, (new,))])
1069
356552e55489 evolve: always use the transaction version of phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1068
diff changeset
1871 phases.retractboundary(repo, tr, other.phase(), [new.node()])
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1872 finally:
1536
9afe9e0191a1 evolve: evolve --divergent failed when merge had nothing to do (issue4950)
Laurent Charignon <lcharignon@fb.com>
parents: 1532
diff changeset
1873 repo.ui.restoreconfig(emtpycommitallowed)
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1874
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
1875 def divergentdata(ctx):
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1876 """return base, other part of a conflict
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1877
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1878 This only return the first one.
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1879
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1880 XXX this woobly function won't survive XXX
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1881 """
1375
9e062e6598e9 evolve: search divergence within all precursors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1374
diff changeset
1882 repo = ctx._repo.unfiltered()
9e062e6598e9 evolve: search divergence within all precursors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1374
diff changeset
1883 for base in repo.set('reverse(allprecursors(%d))', ctx):
630
722b52c75f02 compat: adapt to upstreaming of divergent logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 622
diff changeset
1884 newer = obsolete.successorssets(ctx._repo, base.node())
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1885 # drop filter and solution including the original ctx
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1886 newer = [n for n in newer if n and ctx.node() not in n]
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1887 if newer:
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1888 return base, tuple(ctx._repo[o] for o in newer[0])
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1889 raise error.Abort("base of divergent changeset %s not found" % ctx,
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
1890 hint='this case is not yet handled')
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1891
2396
c1485ebdd6b9 color: update the shorttemplate to use colors
Boris Feld <boris.feld@octobus.net>
parents: 2350
diff changeset
1892 shorttemplate = "[{label('evolve.rev', rev)}] {desc|firstline}\n"
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
1893
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1894 @eh.command(
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1895 '^previous',
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1896 [('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
1897 _('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
1898 ('', '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
1899 ('', '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
1900 ('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
1901 _('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
1902 '[OPTION]...')
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
1903 def cmdprevious(ui, repo, **opts):
1572
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
1904 """update to parent revision
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
1905
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
1906 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
1907 wlock = None
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
1908 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
1909 if not dryrunopt:
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
1910 wlock = repo.wlock()
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
1911 try:
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1912 wkctx = repo[None]
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1913 wparents = wkctx.parents()
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1914 if len(wparents) != 1:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1915 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
1916 if not opts['merge']:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1917 try:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1918 cmdutil.bailifchanged(repo)
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1919 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
1920 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
1921 raise
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1922
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1923 parents = wparents[0].parents()
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1924 topic = getattr(repo, 'currenttopic', '')
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1925 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
1926 parents = [ctx for ctx in parents if ctx.topic() == topic]
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1927 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
1928 if not parents:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1929 ui.warn(_('no parent in topic "%s"\n') % topic)
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1930 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
1931 elif len(parents) == 1:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1932 p = parents[0]
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
1933 bm = repo._activebookmark
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1934 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
1935 if dryrunopt:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1936 ui.write(('hg update %s;\n' % p.rev()))
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1937 if shouldmove:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1938 ui.write(('hg bookmark %s -r %s;\n' % (bm, p.rev())))
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1939 else:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1940 ret = hg.update(repo, p.rev())
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1941 if not ret:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1942 tr = lock = None
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1943 try:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1944 lock = repo.lock()
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1945 tr = repo.transaction('previous')
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1946 if shouldmove:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1947 repo._bookmarks[bm] = p.node()
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1948 repo._bookmarks.recordchange(tr)
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1949 else:
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
1950 bookmarksmod.deactivate(repo)
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1951 tr.close()
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1952 finally:
1742
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
1953 lockmod.release(tr, lock)
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
1954
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1955 displayer.show(p)
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1956 return 0
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
1957 else:
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1958 for p in parents:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1959 displayer.show(p)
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1960 ui.warn(_('multiple parents, explicitly update to one\n'))
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1961 return 1
1742
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
1962 finally:
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
1963 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
1964
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1965 @eh.command(
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1966 '^next',
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
1967 [('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
1968 _('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
1969 ('', '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
1970 ('', '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
1971 ('', '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
1972 ('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
1973 _('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
1974 '[OPTION]...')
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
1975 def cmdnext(ui, repo, **opts):
1572
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
1976 """update to next child revision
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
1977
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
1978 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
1979
44e9c0a264de evolve: improve help for prev, next commands
Greg Ward <greg@gerg.ca>
parents: 1571
diff changeset
1980 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
1981 """
1742
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
1982 wlock = None
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
1983 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
1984 if not dryrunopt:
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
1985 wlock = repo.wlock()
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
1986 try:
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1987 wkctx = repo[None]
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1988 wparents = wkctx.parents()
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1989 if len(wparents) != 1:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1990 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
1991 if not opts['merge']:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1992 try:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1993 cmdutil.bailifchanged(repo)
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1994 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
1995 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
1996 raise
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1997
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1998 children = [ctx for ctx in wparents[0].children() if not ctx.obsolete()]
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
1999 topic = getattr(repo, 'currenttopic', '')
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2000 filtered = []
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2001 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
2002 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
2003 # 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
2004 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
2005 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
2006 if len(children) == 1:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2007 c = children[0]
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
2008 bm = repo._activebookmark
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2009 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
2010 if dryrunopt:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2011 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
2012 if shouldmove:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2013 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
2014 else:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2015 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
2016 if not ret:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2017 lock = tr = None
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2018 try:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2019 lock = repo.lock()
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2020 tr = repo.transaction('next')
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2021 if shouldmove:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2022 repo._bookmarks[bm] = c.node()
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2023 repo._bookmarks.recordchange(tr)
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2024 else:
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
2025 bookmarksmod.deactivate(repo)
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2026 tr.close()
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2027 finally:
1742
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
2028 lockmod.release(tr, lock)
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2029 displayer.show(c)
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2030 result = 0
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2031 elif children:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2032 ui.warn(_("ambigious next changeset:\n"))
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2033 for c in children:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2034 displayer.show(c)
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2035 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
2036 result = 1
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
2037 else:
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2038 aspchildren = _aspiringchildren(repo, [repo['.'].rev()])
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2039 if topic:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2040 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
2041 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
2042 # 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
2043 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
2044 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
2045 if filtered:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2046 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
2047 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
2048 else:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2049 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
2050 if aspchildren:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2051 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
2052 '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
2053 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
2054 result = 1
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2055 elif 1 < len(aspchildren):
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2056 ui.warn(_("ambigious next (unstable) changeset:\n"))
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2057 for c in aspchildren:
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2058 displayer.show(repo[c])
1756
a7dcfff8c4a9 evolve: use single quotes in usage messages
Martin von Zweigbergk <martinvonz@google.com>
parents: 1755
diff changeset
2059 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
2060 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
2061 else:
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2062 cmdutil.bailifchanged(repo)
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2063 result = _solveone(ui, repo, repo[aspchildren[0]], dryrunopt,
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
2064 False, lambda: None, category='unstable')
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2065 if not result:
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
2066 ui.status(_('working directory now at %s\n')
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
2067 % ui.label(repo['.'], 'evolve.node'))
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2068 return result
1449
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2069 return 1
1741
8c05184672ae evolve: indent cmdnext and cmdprev ready for locking change (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1739
diff changeset
2070 return result
1742
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
2071 finally:
970a4c13ebc3 evolve: lock the working copy early in next and prev (issue5244)
Simon Farnsworth <simonfar@fb.com>
parents: 1741
diff changeset
2072 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
2073
1563
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2074 def _reachablefrombookmark(repo, revs, bookmarks):
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2075 """filter revisions and bookmarks reachable from the given bookmark
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2076 yoinked from mq.py
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2077 """
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2078 repomarks = repo._bookmarks
1563
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2079 if not bookmarks.issubset(repomarks):
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2080 raise error.Abort(_("bookmark '%s' not found") %
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
2081 ','.join(sorted(bookmarks - set(repomarks.keys()))))
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2082
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2083 # If the requested bookmark is not the only one pointing to a
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2084 # a revision we have to only delete the bookmark and not strip
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2085 # anything. revsets cannot detect that case.
1563
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2086 nodetobookmarks = {}
2024
10d80adec0c2 evolve: prevent global variable shadowing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2023
diff changeset
2087 for mark, bnode in repomarks.iteritems():
10d80adec0c2 evolve: prevent global variable shadowing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2023
diff changeset
2088 nodetobookmarks.setdefault(bnode, []).append(mark)
1563
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2089 for marks in nodetobookmarks.values():
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2090 if bookmarks.issuperset(marks):
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
2091 rsrevs = repair.stripbmrevset(repo, marks[0])
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
2092 revs = set(revs)
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
2093 revs.update(set(rsrevs))
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
2094 revs = sorted(revs)
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2095 return repomarks, revs
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2096
1563
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2097 def _deletebookmark(repo, repomarks, bookmarks):
1501
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
2098 wlock = lock = tr = None
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
2099 try:
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
2100 wlock = repo.wlock()
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
2101 lock = repo.lock()
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
2102 tr = repo.transaction('prune')
1563
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2103 for bookmark in bookmarks:
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2104 del repomarks[bookmark]
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2105 repomarks.recordchange(tr)
1501
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
2106 tr.close()
1563
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2107 for bookmark in sorted(bookmarks):
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2108 repo.ui.write(_("bookmark '%s' deleted\n") % bookmark)
1501
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
2109 finally:
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
2110 lockmod.release(tr, lock, wlock)
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2111
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2112 def _getmetadata(**opts):
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2113 metadata = {}
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2114 date = opts.get('date')
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2115 user = opts.get('user')
818
fcdd9b8c970b prune: accept '0 0' as a valide --date value
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 757
diff changeset
2116 if date:
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2117 metadata['date'] = '%i %i' % util.parsedate(date)
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2118 if user:
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2119 metadata['user'] = user
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2120 return metadata
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2121
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2122 @eh.command(
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2123 '^prune|obsolete',
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2124 [('n', 'new', [], _("successor changeset (DEPRECATED)")),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2125 ('s', 'succ', [], _("successor changeset")),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2126 ('r', 'rev', [], _("revisions to prune")),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2127 ('k', 'keep', None, _("does not modify working copy during prune")),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2128 ('', 'biject', False, _("do a 1-1 map between rev and successor ranges")),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2129 ('', 'fold', False,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2130 _("record a fold (multiple precursors, one successors)")),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2131 ('', 'split', False,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2132 _("record a split (on precursor, multiple successors)")),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2133 ('B', 'bookmark', [], _("remove revs only reachable from given"
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2134 " bookmark"))] + metadataopts,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2135 _('[OPTION] [-r] REV...'))
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
2136 # XXX -U --noupdate option to prevent wc update and or bookmarks update ?
681
eff18fcaaddc prune: improve command function name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 680
diff changeset
2137 def cmdprune(ui, repo, *revs, **opts):
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
2138 """hide changesets by marking them obsolete
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
2139
1574
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2140 Pruned changesets are obsolete with no successors. If they also have no
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2141 descendants, they are hidden (invisible to all commands).
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2142
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2143 Non-obsolete descendants of pruned changesets become "unstable". Use :hg:`evolve`
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2144 to handle this situation.
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2145
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2146 When you prune the parent of your working copy, Mercurial updates the working
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2147 copy to a non-obsolete parent.
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2148
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2149 You can use ``--succ`` to tell Mercurial that a newer version (successor) of the
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2150 pruned changeset exists. Mercurial records successor revisions in obsolescence
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2151 markers.
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2152
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2153 You can use the ``--biject`` option to specify a 1-1 mapping (bijection) between
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2154 revisions to pruned (precursor) and successor changesets. This option may be
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2155 removed in a future release (with the functionality provided automatically).
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2156
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2157 If you specify multiple revisions in ``--succ``, you are recording a "split" and
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2158 must acknowledge it by passing ``--split``. Similarly, when you prune multiple
dcfe3afe548b evolve: rewrite help for prune command
Greg Ward <greg@gerg.ca>
parents: 1573
diff changeset
2159 changesets with a single successor, you must pass the ``--fold`` option.
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2160 """
1134
7173c70ab2c3 prune: stop reinjecting all selected revisions back into the revrange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1132
diff changeset
2161 revs = scmutil.revrange(repo, list(revs) + opts.get('rev'))
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2162 succs = opts['new'] + opts['succ']
1564
42c30774e63d prune: changing bookmark argument to be a list
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1563
diff changeset
2163 bookmarks = set(opts.get('bookmark'))
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2164 metadata = _getmetadata(**opts)
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
2165 biject = opts.get('biject')
1471
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2166 fold = opts.get('fold')
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2167 split = opts.get('split')
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2168
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2169 options = [o for o in ('biject', 'fold', 'split') if opts.get(o)]
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2170 if 1 < len(options):
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2171 raise error.Abort(_("can only specify one of %s") % ', '.join(options))
689
d48aae167b9d prune: documentation update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 688
diff changeset
2172
1563
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2173 if bookmarks:
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2174 repomarks, revs = _reachablefrombookmark(repo, revs, bookmarks)
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2175 if not revs:
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2176 # no revisions to prune - delete bookmark immediately
1563
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2177 _deletebookmark(repo, repomarks, bookmarks)
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2178
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2179 if not revs:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2180 raise error.Abort(_('nothing to prune'))
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2181
1295
1ac05eef72ca prune: prune fix transaction pattern
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1294
diff changeset
2182 wlock = lock = tr = None
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
2183 try:
1019
0c733dab0036 prune: lock inside the try
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1018
diff changeset
2184 wlock = repo.wlock()
444
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
2185 lock = repo.lock()
1294
d1c29db2e055 prune: fix pruning w/ bookmarks and inhibit
Durham Goode <durham@fb.com>
parents: 1283
diff changeset
2186 tr = repo.transaction('prune')
691
6e63b4185a5c prune: update inline documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 690
diff changeset
2187 # defines pruned changesets
684
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
2188 precs = []
1134
7173c70ab2c3 prune: stop reinjecting all selected revisions back into the revrange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1132
diff changeset
2189 revs.sort()
7173c70ab2c3 prune: stop reinjecting all selected revisions back into the revrange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1132
diff changeset
2190 for p in revs:
684
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
2191 cp = repo[p]
687
6c1fbef2952e prune: test and improve message of immutable aborting.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 685
diff changeset
2192 if not cp.mutable():
927
154510dc4318 evolve: fix grammar in a comment
Greg Ward <greg@gerg.ca>
parents: 925
diff changeset
2193 # note: createmarkers() would have raised something anyway
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2194 raise error.Abort('cannot prune immutable changeset: %s' % cp,
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
2195 hint="see 'hg help phases' for details")
684
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
2196 precs.append(cp)
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
2197 if not precs:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2198 raise error.Abort('nothing to prune')
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
2199
1682
40d7b0c4abb1 evolve: factor out check for creating unstable commits
Siddharth Agarwal <sid0@fb.com>
parents: 1681
diff changeset
2200 if _disallowednewunstable(repo, revs):
1778
ba9fabaca91b prune: improve error message if unstable changes are disallowed
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1777
diff changeset
2201 raise error.Abort(_("cannot prune in the middle of a stack"),
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
2202 hint=_("new unstable changesets are not allowed"))
1397
35f2f54b557c evolve: make prune respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1396
diff changeset
2203
691
6e63b4185a5c prune: update inline documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 690
diff changeset
2204 # defines successors changesets
1135
db16c4ad15d0 fixup previous changesets (after forgot to amend).
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1134
diff changeset
2205 sucs = scmutil.revrange(repo, succs)
db16c4ad15d0 fixup previous changesets (after forgot to amend).
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1134
diff changeset
2206 sucs.sort()
db16c4ad15d0 fixup previous changesets (after forgot to amend).
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1134
diff changeset
2207 sucs = tuple(repo[n] for n in sucs)
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
2208 if not biject and len(sucs) > 1 and len(precs) > 1:
684
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
2209 msg = "Can't use multiple successors for multiple precursors"
1687
60752ed8d2d4 prune: suggest --biject in error "hint"
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1686
diff changeset
2210 hint = _("use --biject to mark a series as a replacement"
60752ed8d2d4 prune: suggest --biject in error "hint"
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1686
diff changeset
2211 " for another")
60752ed8d2d4 prune: suggest --biject in error "hint"
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1686
diff changeset
2212 raise error.Abort(msg, hint=hint)
1471
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2213 elif biject and len(sucs) != len(precs):
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
2214 msg = "Can't use %d successors for %d precursors" \
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
2215 % (len(sucs), len(precs))
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2216 raise error.Abort(msg)
1471
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2217 elif (len(precs) == 1 and len(sucs) > 1) and not split:
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2218 msg = "please add --split if you want to do a split"
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2219 raise error.Abort(msg)
1471
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2220 elif len(sucs) == 1 and len(precs) > 1 and not fold:
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2221 msg = "please add --fold if you want to do a fold"
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2222 raise error.Abort(msg)
1471
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2223 elif biject:
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
2224 relations = [(p, (s,)) for p, s in zip(precs, sucs)]
1471
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2225 else:
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2226 relations = [(p, sucs) for p in precs]
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
2227
683
6d24bd455f79 simplify locking in prune
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 682
diff changeset
2228 wdp = repo['.']
931
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
2229
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
2230 if len(sucs) == 1 and len(precs) == 1 and wdp in precs:
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
2231 # '.' killed, so update to the successor
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
2232 newnode = sucs[0]
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
2233 else:
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
2234 # update to an unkilled parent
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
2235 newnode = wdp
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
2236
1239
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
2237 while newnode in precs or newnode.obsolete():
931
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
2238 newnode = newnode.parents()[0]
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
2239
683
6d24bd455f79 simplify locking in prune
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 682
diff changeset
2240 if newnode.node() != wdp.node():
1221
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2241 if opts.get('keep', False):
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2242 # This is largely the same as the implementation in
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2243 # strip.stripcmd(). We might want to refactor this somewhere
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2244 # common at some point.
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2245
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2246 # only reset the dirstate for files that would actually change
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2247 # between the working context and uctx
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2248 descendantrevs = repo.revs("%d::." % newnode.rev())
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2249 changedfiles = []
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2250 for rev in descendantrevs:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2251 # blindly reset the files, regardless of what actually
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2252 # changed
1221
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2253 changedfiles.extend(repo[rev].files())
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2254
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2255 # reset files that only changed in the dirstate too
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2256 dirstate = repo.dirstate
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2257 dirchanges = [f for f in dirstate if dirstate[f] != 'n']
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2258 changedfiles.extend(dirchanges)
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2259 repo.dirstate.rebuild(newnode.node(), newnode.manifest(),
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2260 changedfiles)
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
2261 dirstate.write(tr)
1221
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2262 else:
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
2263 bookactive = repo._activebookmark
1344
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
2264 # Active bookmark that we don't want to delete (with -B option)
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
2265 # we deactivate and move it before the update and reactivate it
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
2266 # after
1563
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2267 movebookmark = bookactive and not bookmarks
1344
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
2268 if movebookmark:
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
2269 bookmarksmod.deactivate(repo)
1344
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
2270 repo._bookmarks[bookactive] = newnode.node()
1555
0ff262537f98 prune: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1554
diff changeset
2271 repo._bookmarks.recordchange(tr)
1221
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2272 commands.update(ui, repo, newnode.rev())
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
2273 ui.status(_('working directory now at %s\n')
2442
a8fea2ae3c0b prune: prevent a color related crash when the working copy is moved
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2416
diff changeset
2274 % ui.label(str(newnode), 'evolve.node'))
1344
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
2275 if movebookmark:
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
2276 bookmarksmod.activate(repo, bookactive)
1342
16017e1bb2a1 prune: with active bookmark should stay active
Laurent Charignon <lcharignon@fb.com>
parents: 1340
diff changeset
2277
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2278 # update bookmarks
1563
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2279 if bookmarks:
6a9f0261b181 prune: remove a list of bookmarks
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1561
diff changeset
2280 _deletebookmark(repo, repomarks, bookmarks)
1239
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
2281
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
2282 # create markers
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
2283 obsolete.createmarkers(repo, relations, metadata=metadata)
1468
bc6cf6cc06fd evolve: remove trailing spaces
André Sintzoff <andre.sintzoff@gmail.com>
parents: 1467
diff changeset
2284
1239
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
2285 # informs that changeset have been pruned
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
2286 ui.status(_('%i changesets pruned\n') % len(precs))
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
2287
693
d3c1fe0035d1 prune: handle bookmark
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 691
diff changeset
2288 for ctx in repo.unfiltered().set('bookmark() and %ld', precs):
1101
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2289 # used to be:
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2290 #
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2291 # ldest = list(repo.set('max((::%d) - obsolete())', ctx))
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2292 # if ldest:
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2293 # c = ldest[0]
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2294 #
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2295 # but then revset took a lazy arrow in the knee and became much
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2296 # slower. The new forms makes as much sense and a much faster.
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2297 for dest in ctx.ancestors():
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2298 if not dest.obsolete():
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
2299 updatebookmarks = _bookmarksupdater(repo, ctx.node(), tr)
1101
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2300 updatebookmarks(dest.node())
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2301 break
1294
d1c29db2e055 prune: fix pruning w/ bookmarks and inhibit
Durham Goode <durham@fb.com>
parents: 1283
diff changeset
2302
d1c29db2e055 prune: fix pruning w/ bookmarks and inhibit
Durham Goode <durham@fb.com>
parents: 1283
diff changeset
2303 tr.close()
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
2304 finally:
1295
1ac05eef72ca prune: prune fix transaction pattern
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1294
diff changeset
2305 lockmod.release(tr, lock, wlock)
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
2306
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2307 @eh.command(
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2308 'amend|refresh',
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2309 [('A', 'addremove', None,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2310 _('mark new/missing files as added/removed before committing')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2311 ('e', 'edit', False, _('invoke editor on commit messages')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2312 ('', 'close-branch', None,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2313 _('mark a branch as closed, hiding it from the branch list')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2314 ('s', 'secret', None, _('use the secret phase for committing')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2315 ] + walkopts + commitopts + commitopts2 + commitopts3 + interactiveopt,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2316 _('[OPTION]... [FILE]...'))
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2317 def amend(ui, repo, *pats, **opts):
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2318 """combine a changeset with updates and replace it with a new one
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2319
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2320 Commits a new changeset incorporating both the changes to the given files
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2321 and all the changes from the current parent changeset into the repository.
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2322
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2323 See :hg:`commit` for details about committing changes.
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2324
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2325 If you don't specify -m, the parent's message will be reused.
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2326
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2327 Behind the scenes, Mercurial first commits the update as a regular child
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2328 of the current parent. Then it creates a new commit on the parent's parents
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2329 with the updated contents. Then it changes the working copy parent to this
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2330 new combined changeset. Finally, the old changeset and its update are hidden
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2331 from :hg:`log` (unless you use --hidden with log).
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2332
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2333 Returns 0 on success, 1 if nothing changed.
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2334 """
742
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
2335 opts = opts.copy()
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
2336 edit = opts.pop('edit', False)
1140
b7d85cd8ec7b amend: allow the --logfile argument to work properly
Matt Harbison <matt_harbison@yahoo.com>
parents: 1137
diff changeset
2337 log = opts.get('logfile')
742
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
2338 opts['amend'] = True
1140
b7d85cd8ec7b amend: allow the --logfile argument to work properly
Matt Harbison <matt_harbison@yahoo.com>
parents: 1137
diff changeset
2339 if not (edit or opts['message'] or log):
742
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
2340 opts['message'] = repo['.'].description()
985
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
2341 _resolveoptions(ui, opts)
742
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
2342 _alias, commitcmd = cmdutil.findcmd('commit', commands.table)
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
2343 return commitcmd[0](ui, repo, *pats, **opts)
116
64ca29eef349 Add a -o option to commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 113
diff changeset
2344
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2345
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2346 def _touchedbetween(repo, source, dest, match=None):
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2347 touched = set()
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2348 for files in repo.status(source, dest, match=match)[:3]:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2349 touched.update(files)
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2350 return touched
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2351
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2352 def _commitfiltered(repo, ctx, match, target=None):
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2353 """Recommit ctx with changed files not in match. Return the new
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2354 node identifier, or None if nothing changed.
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2355 """
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2356 base = ctx.p1()
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2357 if target is None:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2358 target = base
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2359 # ctx
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2360 initialfiles = _touchedbetween(repo, base, ctx)
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2361 if base == target:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2362 affected = set(f for f in initialfiles if match(f))
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2363 newcontent = set()
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2364 else:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2365 affected = _touchedbetween(repo, target, ctx, match=match)
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2366 newcontent = _touchedbetween(repo, target, base, match=match)
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2367 # The commit touchs all existing files
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2368 # + all file that needs a new content
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2369 # - the file affected bny uncommit with the same content than base.
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2370 files = (initialfiles - affected) | newcontent
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2371 if not newcontent and files == initialfiles:
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2372 return None
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2373
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2374 # Filter copies
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2375 copied = copies.pathcopies(target, ctx)
1786
b674277ea4ef uncommit: don't lose copy information of remaining files (issue5403)
Martin von Zweigbergk <martinvonz@google.com>
parents: 1784
diff changeset
2376 copied = dict((dst, src) for dst, src in copied.iteritems()
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2377 if dst in files)
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
2378
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2379 def filectxfn(repo, memctx, path, contentctx=ctx, redirect=newcontent):
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2380 if path in redirect:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2381 return filectxfn(repo, memctx, path, contentctx=target, redirect=())
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2382 if path not in contentctx:
1086
96b9e0c31cc1 compat: adapt to change to memctx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1085
diff changeset
2383 return None
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2384 fctx = contentctx[path]
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2385 flags = fctx.flags()
1828
2b80c01b3f58 compat: drop compatibility layer around memctx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1827
diff changeset
2386 mctx = context.memfilectx(repo, fctx.path(), fctx.data(),
2b80c01b3f58 compat: drop compatibility layer around memctx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1827
diff changeset
2387 islink='l' in flags,
2b80c01b3f58 compat: drop compatibility layer around memctx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1827
diff changeset
2388 isexec='x' in flags,
2b80c01b3f58 compat: drop compatibility layer around memctx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1827
diff changeset
2389 copied=copied.get(path))
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2390 return mctx
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2391
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2392 new = context.memctx(repo,
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2393 parents=[base.node(), node.nullid],
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2394 text=ctx.description(),
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2395 files=files,
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2396 filectxfn=filectxfn,
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2397 user=ctx.user(),
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2398 date=ctx.date(),
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2399 extra=ctx.extra())
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2400 # commitctx always create a new revision, no need to check
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2401 newid = repo.commitctx(new)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2402 return newid
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2403
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2404 def _uncommitdirstate(repo, oldctx, match):
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2405 """Fix the dirstate after switching the working directory from
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2406 oldctx to a copy of oldctx not containing changed files matched by
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2407 match.
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2408 """
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2409 ctx = repo['.']
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2410 ds = repo.dirstate
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2411 copies = dict(ds.copies())
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2412 m, a, r = repo.status(oldctx.p1(), oldctx, match=match)[:3]
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2413 for f in m:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2414 if ds[f] == 'r':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2415 # modified + removed -> removed
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2416 continue
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2417 ds.normallookup(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2418
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2419 for f in a:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2420 if ds[f] == 'r':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2421 # added + removed -> unknown
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2422 ds.drop(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2423 elif ds[f] != 'a':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2424 ds.add(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2425
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2426 for f in r:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2427 if ds[f] == 'a':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2428 # removed + added -> normal
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2429 ds.normallookup(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2430 elif ds[f] != 'r':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2431 ds.remove(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2432
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2433 # Merge old parent and old working dir copies
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2434 oldcopies = {}
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2435 for f in (m + a):
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2436 src = oldctx[f].renamed()
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2437 if src:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2438 oldcopies[f] = src[0]
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2439 oldcopies.update(copies)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2440 copies = dict((dst, oldcopies.get(src, src))
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2441 for dst, src in oldcopies.iteritems())
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2442 # Adjust the dirstate copies
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2443 for dst, src in copies.iteritems():
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2444 if (src not in ctx or dst in ctx or ds[dst] != 'a'):
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2445 src = None
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2446 ds.copy(src, dst)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2447
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2448 @eh.command(
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2449 '^uncommit',
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2450 [('a', 'all', None, _('uncommit all changes when no arguments given')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2451 ('r', 'rev', '', _('revert commit content to REV instead')),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2452 ] + commands.walkopts,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2453 _('[OPTION]... [NAME]'))
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2454 def uncommit(ui, repo, *pats, **opts):
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2455 """move changes from parent revision to working directory
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2456
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
2457 Changes to selected files in the checked out revision appear again as
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2458 uncommitted changed in the working directory. A new revision
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
2459 without the selected changes is created, becomes the checked out
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
2460 revision, and obsoletes the previous one.
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2461
867
6a67606e1c34 evolve: fix typos in uncommit docstring
André Sintzoff <andre.sintzoff@gmail.com>
parents: 858
diff changeset
2462 The --include option specifies patterns to uncommit.
6a67606e1c34 evolve: fix typos in uncommit docstring
André Sintzoff <andre.sintzoff@gmail.com>
parents: 858
diff changeset
2463 The --exclude option specifies patterns to keep in the commit.
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2464
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2465 The --rev argument let you change the commit file to a content of another
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2466 revision. It still does not change the content of your file in the working
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2467 directory.
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2468
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2469 Return 0 if changed files are uncommitted.
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2470 """
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2471
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
2472 wlock = lock = tr = None
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2473 try:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2474 wlock = repo.wlock()
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2475 lock = repo.lock()
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2476 wctx = repo[None]
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2477 if len(wctx.parents()) <= 0:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2478 raise error.Abort(_("cannot uncommit null changeset"))
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2479 if len(wctx.parents()) > 1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2480 raise error.Abort(_("cannot uncommit while merging"))
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2481 old = repo['.']
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2482 if old.phase() == phases.public:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2483 raise error.Abort(_("cannot rewrite immutable changeset"))
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2484 if len(old.parents()) > 1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2485 raise error.Abort(_("cannot uncommit merge changeset"))
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2486 oldphase = old.phase()
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
2487
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2488 rev = None
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2489 if opts.get('rev'):
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2490 rev = scmutil.revsingle(repo, opts.get('rev'))
1143
160fd06312fc uncommit: abort when rev specifies the current changeset
Nathan Goldbaum <ngoldbau@ucsc.edu>
parents: 1141
diff changeset
2491 ctx = repo[None]
160fd06312fc uncommit: abort when rev specifies the current changeset
Nathan Goldbaum <ngoldbau@ucsc.edu>
parents: 1141
diff changeset
2492 if ctx.p1() == rev or ctx.p2() == rev:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2493 raise error.Abort(_("cannot uncommit to parent changeset"))
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2494
1364
f00d91365ab9 evolve: make uncommit respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1361
diff changeset
2495 onahead = old.rev() in repo.changelog.headrevs()
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2496 disallowunstable = not obsolete.isenabled(repo,
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2497 obsolete.allowunstableopt)
1364
f00d91365ab9 evolve: make uncommit respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1361
diff changeset
2498 if disallowunstable and not onahead:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2499 raise error.Abort(_("cannot uncommit in the middle of a stack"))
1364
f00d91365ab9 evolve: make uncommit respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1361
diff changeset
2500
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2501 # Recommit the filtered changeset
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
2502 tr = repo.transaction('uncommit')
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
2503 updatebookmarks = _bookmarksupdater(repo, old.node(), tr)
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2504 newid = None
1351
69e5de3e6129 evolve: small refactoring of the uncommit function
Laurent Charignon <lcharignon@fb.com>
parents: 1350
diff changeset
2505 includeorexclude = opts.get('include') or opts.get('exclude')
69e5de3e6129 evolve: small refactoring of the uncommit function
Laurent Charignon <lcharignon@fb.com>
parents: 1350
diff changeset
2506 if (pats or includeorexclude or opts.get('all')):
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2507 match = scmutil.match(old, pats, opts)
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2508 newid = _commitfiltered(repo, old, match, target=rev)
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2509 if newid is None:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2510 raise error.Abort(_('nothing to uncommit'),
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
2511 hint=_("use --all to uncommit all files"))
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2512 # Move local changes on filtered changeset
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
2513 obsolete.createmarkers(repo, [(old, (repo[newid],))])
1069
356552e55489 evolve: always use the transaction version of phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1068
diff changeset
2514 phases.retractboundary(repo, tr, oldphase, [newid])
1112
c3e23fbf7bd7 evolve: wrap setparents calls in begin/endparentchange
Siddharth Agarwal <sid0@fb.com>
parents: 1111
diff changeset
2515 repo.dirstate.beginparentchange()
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2516 repo.dirstate.setparents(newid, node.nullid)
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2517 _uncommitdirstate(repo, old, match)
1112
c3e23fbf7bd7 evolve: wrap setparents calls in begin/endparentchange
Siddharth Agarwal <sid0@fb.com>
parents: 1111
diff changeset
2518 repo.dirstate.endparentchange()
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2519 updatebookmarks(newid)
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2520 if not repo[newid].files():
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2521 ui.warn(_("new changeset is empty\n"))
1756
a7dcfff8c4a9 evolve: use single quotes in usage messages
Martin von Zweigbergk <martinvonz@google.com>
parents: 1755
diff changeset
2522 ui.status(_("(use 'hg prune .' to remove it)\n"))
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
2523 tr.close()
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2524 finally:
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
2525 lockmod.release(tr, lock, wlock)
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2526
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
2527 @eh.wrapcommand('commit')
116
64ca29eef349 Add a -o option to commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 113
diff changeset
2528 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
2529 tr = None
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
2530 if kwargs.get('amend', False):
1255
a2d4901e211e commit: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1253
diff changeset
2531 wlock = lock = None
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
2532 else:
1255
a2d4901e211e commit: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1253
diff changeset
2533 wlock = repo.wlock()
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
2534 lock = repo.lock()
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2535 try:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2536 obsoleted = kwargs.get('obsolete', [])
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2537 if obsoleted:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2538 obsoleted = repo.set('%lr', obsoleted)
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2539 result = orig(ui, repo, *arg, **kwargs)
1659
c450d134aac4 Spelling: succeeded
timeless@gmail.com
parents: 1646
diff changeset
2540 if not result: # commit succeeded
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2541 new = repo['-1']
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2542 oldbookmarks = []
444
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
2543 markers = []
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2544 for old in obsoleted:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2545 oldbookmarks.extend(repo.nodebookmarks(old.node()))
444
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
2546 markers.append((old, (new,)))
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
2547 if markers:
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
2548 obsolete.createmarkers(repo, markers)
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2549 for book in oldbookmarks:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2550 repo._bookmarks[book] = new.node()
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2551 if oldbookmarks:
1558
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2552 if not wlock:
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2553 wlock = repo.wlock()
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2554 if not lock:
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2555 lock = repo.lock()
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2556 tr = repo.transaction('commit')
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2557 repo._bookmarks.recordchange(tr)
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2558 tr.close()
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2559 return result
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2560 finally:
1558
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2561 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
2562
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2563 @eh.command(
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2564 '^split',
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2565 [('r', 'rev', [], _("revision to split")),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2566 ] + commitopts + commitopts2,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2567 _('hg split [OPTION]... [-r] REV'))
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2568 def cmdsplit(ui, repo, *revs, **opts):
1575
0c8548df67fe merge with stable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1568 1574
diff changeset
2569 """split a changeset into smaller changesets
1573
0b4cec85d4ab evolve: improve help for split command
Greg Ward <greg@gerg.ca>
parents: 1572
diff changeset
2570
0b4cec85d4ab evolve: improve help for split command
Greg Ward <greg@gerg.ca>
parents: 1572
diff changeset
2571 By default, split the current revision by prompting for all its hunks to be
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2572 redistributed into new changesets.
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2573
1573
0b4cec85d4ab evolve: improve help for split command
Greg Ward <greg@gerg.ca>
parents: 1572
diff changeset
2574 Use --rev to split a given changeset instead.
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2575 """
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2576 tr = wlock = lock = None
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2577 newcommits = []
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2578
1598
2a08ef812b84 evolve: make split respect rev args passed without --rev or -r
Kostia Balytskyi <ikostia@fb.com>
parents: 1597
diff changeset
2579 revarg = (list(revs) + opts.get('rev')) or ['.']
2a08ef812b84 evolve: make split respect rev args passed without --rev or -r
Kostia Balytskyi <ikostia@fb.com>
parents: 1597
diff changeset
2580 if len(revarg) != 1:
2a08ef812b84 evolve: make split respect rev args passed without --rev or -r
Kostia Balytskyi <ikostia@fb.com>
parents: 1597
diff changeset
2581 msg = _("more than one revset is given")
2a08ef812b84 evolve: make split respect rev args passed without --rev or -r
Kostia Balytskyi <ikostia@fb.com>
parents: 1597
diff changeset
2582 hnt = _("use either `hg split <rs>` or `hg split --rev <rs>`, not both")
2a08ef812b84 evolve: make split respect rev args passed without --rev or -r
Kostia Balytskyi <ikostia@fb.com>
parents: 1597
diff changeset
2583 raise error.Abort(msg, hint=hnt)
2a08ef812b84 evolve: make split respect rev args passed without --rev or -r
Kostia Balytskyi <ikostia@fb.com>
parents: 1597
diff changeset
2584
2a08ef812b84 evolve: make split respect rev args passed without --rev or -r
Kostia Balytskyi <ikostia@fb.com>
parents: 1597
diff changeset
2585 rev = scmutil.revsingle(repo, revarg[0])
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2586 try:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2587 wlock = repo.wlock()
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2588 lock = repo.lock()
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2589 cmdutil.bailifchanged(repo)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2590 tr = repo.transaction('split')
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2591 ctx = repo[rev]
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2592 r = ctx.rev()
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2593 disallowunstable = not obsolete.isenabled(repo,
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2594 obsolete.allowunstableopt)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2595 if disallowunstable:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2596 # XXX We should check head revs
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2597 if repo.revs("(%d::) - %d", rev, rev):
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2598 raise error.Abort(_("cannot split commit: %s not a head") % ctx)
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2599
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2600 if len(ctx.parents()) > 1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2601 raise error.Abort(_("cannot split merge commits"))
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2602 prev = ctx.p1()
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
2603 bmupdate = _bookmarksupdater(repo, ctx.node(), tr)
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
2604 bookactive = repo._activebookmark
1485
1ba64be11bf8 split: handle bookmarks instead of leaving them on precursor
Laurent Charignon <lcharignon@fb.com>
parents: 1484
diff changeset
2605 if bookactive is not None:
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
2606 repo.ui.status(_("(leaving bookmark %s)\n") % repo._activebookmark)
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
2607 bookmarksmod.deactivate(repo)
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2608 hg.update(repo, prev)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2609
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2610 commands.revert(ui, repo, rev=r, all=True)
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
2611
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2612 def haschanges():
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2613 modified, added, removed, deleted = repo.status()[:4]
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2614 return modified or added or removed or deleted
1675
48c3a472aec7 split: rewrite the pre-split commit message
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 1669
diff changeset
2615 msg = ("HG: This is the original pre-split commit message. "
48c3a472aec7 split: rewrite the pre-split commit message
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 1669
diff changeset
2616 "Edit it as appropriate.\n\n")
1531
47f48af730ce split: preserve original changesets description
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1528
diff changeset
2617 msg += ctx.description()
47f48af730ce split: preserve original changesets description
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1528
diff changeset
2618 opts['message'] = msg
47f48af730ce split: preserve original changesets description
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1528
diff changeset
2619 opts['edit'] = True
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2620 while haschanges():
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2621 pats = ()
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2622 cmdutil.dorecord(ui, repo, commands.commit, 'commit', False,
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2623 cmdutil.recordfilter, *pats, **opts)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2624 # TODO: Does no seem like the best way to do this
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2625 # We should make dorecord return the newly created commit
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2626 newcommits.append(repo['.'])
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2627 if haschanges():
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2628 if ui.prompt('Done splitting? [yN]', default='n') == 'y':
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2629 commands.commit(ui, repo, **opts)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2630 newcommits.append(repo['.'])
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2631 break
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2632 else:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2633 ui.status(_("no more change to split\n"))
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2634
1739
904ae1b2087b split: avoid trying to split an empty commit (issue5191)
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 1735
diff changeset
2635 if newcommits:
904ae1b2087b split: avoid trying to split an empty commit (issue5191)
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 1735
diff changeset
2636 tip = repo[newcommits[-1]]
904ae1b2087b split: avoid trying to split an empty commit (issue5191)
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 1735
diff changeset
2637 bmupdate(tip.node())
904ae1b2087b split: avoid trying to split an empty commit (issue5191)
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 1735
diff changeset
2638 if bookactive is not None:
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
2639 bookmarksmod.activate(repo, bookactive)
1739
904ae1b2087b split: avoid trying to split an empty commit (issue5191)
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 1735
diff changeset
2640 obsolete.createmarkers(repo, [(repo[r], newcommits)])
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2641 tr.close()
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2642 finally:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2643 lockmod.release(tr, lock, wlock)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2644
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2645
1220
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2646 @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
2647 ('', '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
2648 "backup bundle")),
1220
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2649 ])
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2650 def stripwrapper(orig, ui, repo, *revs, **kwargs):
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2651 if (not ui.configbool('experimental', 'prunestrip') or
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2652 kwargs.get('bundle', False)):
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2653 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
2654
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2655 if kwargs.get('force'):
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2656 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
2657 "enabled\n"))
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2658 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
2659 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
2660 "evolve enabled\n"))
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2661
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2662 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
2663 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
2664 revs = repo.revs("(%ld)::", revs)
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2665 kwargs['rev'] = []
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2666 kwargs['new'] = []
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2667 kwargs['succ'] = []
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2668 kwargs['biject'] = False
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2669 return cmdprune(ui, repo, *revs, **kwargs)
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2670
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2671 @eh.command(
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2672 '^touch',
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2673 [('r', 'rev', [], 'revision to update'),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2674 ('D', 'duplicate', False,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2675 'do not mark the new revision as successor of the old one'),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2676 ('A', 'allowdivergence', False,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2677 'mark the new revision as successor of the old one potentially creating '
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2678 'divergence')],
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2679 # allow to choose the seed ?
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2680 _('[-r] revs'))
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2681 def touch(ui, repo, *revs, **opts):
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2682 """create successors that are identical to their predecessors except
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2683 for the changeset ID
517
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
2684
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
2685 This is used to "resurrect" changesets
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
2686 """
701
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
2687 duplicate = opts['duplicate']
1589
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2688 allowdivergence = opts['allowdivergence']
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2689 revs = list(revs)
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2690 revs.extend(opts['rev'])
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2691 if not revs:
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2692 revs = ['.']
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2693 revs = scmutil.revrange(repo, revs)
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2694 if not revs:
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2695 ui.write_err('no revision to touch\n')
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2696 return 1
701
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
2697 if not duplicate and repo.revs('public() and %ld', revs):
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2698 raise error.Abort("can't touch public revision")
1589
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2699 displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2700 wlock = lock = tr = None
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2701 try:
514
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
2702 wlock = repo.wlock()
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2703 lock = repo.lock()
514
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
2704 tr = repo.transaction('touch')
702
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
2705 revs.sort() # ensure parent are run first
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
2706 newmapping = {}
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2707 for r in revs:
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2708 ctx = repo[r]
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2709 extra = ctx.extra().copy()
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2710 extra['__touch-noise__'] = random.randint(0, 0xffffffff)
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2711 # search for touched parent
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2712 p1 = ctx.p1().node()
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2713 p2 = ctx.p2().node()
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2714 p1 = newmapping.get(p1, p1)
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2715 p2 = newmapping.get(p2, p2)
1589
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2716
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2717 if not (duplicate or allowdivergence):
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2718 # The user hasn't yet decided what to do with the revived
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2719 # cset, let's ask
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2720 sset = obsolete.successorssets(repo, ctx.node())
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
2721 nodivergencerisk = (len(sset) == 0 or
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
2722 (len(sset) == 1 and
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
2723 len(sset[0]) == 1 and
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
2724 repo[sset[0][0]].rev() == ctx.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
2725 ))
1589
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2726 if nodivergencerisk:
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2727 duplicate = False
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2728 else:
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2729 displayer.show(ctx)
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2730 index = ui.promptchoice(
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2731 _("reviving this changeset will create divergence"
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
2732 " unless you make a duplicate.\n(a)llow divergence or"
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
2733 " (d)uplicate the changeset? $$ &Allowdivergence $$ "
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
2734 "&Duplicate"), 0)
1589
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2735 choice = ['allowdivergence', 'duplicate'][index]
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2736 if choice == 'allowdivergence':
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2737 duplicate = False
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2738 else:
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2739 duplicate = True
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2740
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2741 new, unusedvariable = rewrite(repo, ctx, [], ctx,
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2742 [p1, p2],
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2743 commitopts={'extra': extra})
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2744 # store touched version to help potential children
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2745 newmapping[ctx.node()] = new
1589
d6630a6bff86 touch: prompt the user for what to do with the revived changeset
Laurent Charignon <lcharignon@fb.com>
parents: 1580
diff changeset
2746
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2747 if not duplicate:
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2748 obsolete.createmarkers(repo, [(ctx, (repo[new],))])
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2749 phases.retractboundary(repo, tr, ctx.phase(), [new])
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2750 if ctx in repo[None].parents():
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2751 repo.dirstate.beginparentchange()
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2752 repo.dirstate.setparents(new, node.nullid)
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2753 repo.dirstate.endparentchange()
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2754 tr.close()
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2755 finally:
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2756 lockmod.release(tr, lock, wlock)
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2757
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2758 @eh.command(
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2759 '^fold|squash',
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2760 [('r', 'rev', [], _("revision to fold")),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2761 ('', 'exact', None, _("only fold specified revisions")),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2762 ('', 'from', None, _("fold revisions linearly to working copy parent"))
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2763 ] + commitopts + commitopts2,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2764 _('hg fold [OPTION]... [-r] REV'))
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2765 def fold(ui, repo, *revs, **opts):
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2766 """fold multiple revisions into a single one
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2767
1781
a046e78c3290 fold: require --from flag for folding revisions to working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 1780
diff changeset
2768 With --from, folds all the revisions linearly between the given revisions
1463
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
2769 and the parent of the working directory.
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2770
1781
a046e78c3290 fold: require --from flag for folding revisions to working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 1780
diff changeset
2771 With --exact, folds only the specified revisions while ignoring the
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2772 parent of the working directory. In this case, the given revisions must
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2773 form a linear unbroken chain.
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2774
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2775 .. container:: verbose
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2776
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2777 Some examples:
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2778
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2779 - Fold the current revision with its parent::
702
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
2780
1781
a046e78c3290 fold: require --from flag for folding revisions to working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 1780
diff changeset
2781 hg fold --from .^
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2782
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2783 - Fold all draft revisions with working directory parent::
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2784
1781
a046e78c3290 fold: require --from flag for folding revisions to working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 1780
diff changeset
2785 hg fold --from 'draft()'
702
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
2786
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2787 See :hg:`help phases` for more about draft revisions and
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2788 :hg:`help revsets` for more about the `draft()` keyword
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2789
1469
fa1a27009c76 evolve: fix typo in fold docstring
André Sintzoff <andre.sintzoff@gmail.com>
parents: 1468
diff changeset
2790 - Fold revisions between 3 and 6 with the working directory parent::
1464
d830d4e9f212 fold: avoid using x:y in the help
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1463
diff changeset
2791
1781
a046e78c3290 fold: require --from flag for folding revisions to working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 1780
diff changeset
2792 hg fold --from 3::6
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2793
1463
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
2794 - Fold revisions 3 and 4:
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
2795
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
2796 hg fold "3 + 4" --exact
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
2797
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2798 - Only fold revisions linearly between foo and @::
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2799
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2800 hg fold foo::@ --exact
702
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
2801 """
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2802 revs = list(revs)
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2803 revs.extend(opts['rev'])
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2804 if not revs:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2805 raise error.Abort(_('no revisions specified'))
995
0f3a7efd6ee9 fold: emit error message when folding a single revision
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 994
diff changeset
2806
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2807 revs = scmutil.revrange(repo, revs)
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2808
1781
a046e78c3290 fold: require --from flag for folding revisions to working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 1780
diff changeset
2809 if opts['from'] and opts['exact']:
a046e78c3290 fold: require --from flag for folding revisions to working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 1780
diff changeset
2810 raise error.Abort(_('cannot use both --from and --exact'))
a046e78c3290 fold: require --from flag for folding revisions to working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 1780
diff changeset
2811 elif opts['from']:
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2812 # Try to extend given revision starting from the working directory
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2813 extrevs = repo.revs('(%ld::.) or (.::%ld)', revs, revs)
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2814 discardedrevs = [r for r in revs if r not in extrevs]
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2815 if discardedrevs:
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
2816 msg = _("cannot fold non-linear revisions")
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
2817 hint = _("given revisions are unrelated to parent of working"
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
2818 " directory")
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
2819 raise error.Abort(msg, hint=hint)
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2820 revs = extrevs
1781
a046e78c3290 fold: require --from flag for folding revisions to working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 1780
diff changeset
2821 elif opts['exact']:
a046e78c3290 fold: require --from flag for folding revisions to working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 1780
diff changeset
2822 # Nothing to do; "revs" is already set correctly
a046e78c3290 fold: require --from flag for folding revisions to working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 1780
diff changeset
2823 pass
a046e78c3290 fold: require --from flag for folding revisions to working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 1780
diff changeset
2824 else:
a046e78c3290 fold: require --from flag for folding revisions to working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 1780
diff changeset
2825 raise error.Abort(_('must specify either --from or --exact'))
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2826
1784
c3741a5adbb0 fold: cleanly abort on empty fold set (issue5453)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1765
diff changeset
2827 if not revs:
c3741a5adbb0 fold: cleanly abort on empty fold set (issue5453)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1765
diff changeset
2828 raise error.Abort(_('specified revisions evaluate to an empty set'),
c3741a5adbb0 fold: cleanly abort on empty fold set (issue5453)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1765
diff changeset
2829 hint=_('use different revision arguments'))
c3741a5adbb0 fold: cleanly abort on empty fold set (issue5453)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1765
diff changeset
2830 elif len(revs) == 1:
995
0f3a7efd6ee9 fold: emit error message when folding a single revision
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 994
diff changeset
2831 ui.write_err(_('single revision specified, nothing to fold\n'))
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2832 return 1
995
0f3a7efd6ee9 fold: emit error message when folding a single revision
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 994
diff changeset
2833
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2834 wlock = lock = None
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2835 try:
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2836 wlock = repo.wlock()
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2837 lock = repo.lock()
1685
73e0018c423f fold: move sanity check after locking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1684
diff changeset
2838
73e0018c423f fold: move sanity check after locking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1684
diff changeset
2839 root, head = _foldcheck(repo, revs)
73e0018c423f fold: move sanity check after locking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1684
diff changeset
2840
1780
39ef492603c6 fold: use 'fold', not 'touch', for transaction description
Martin von Zweigbergk <martinvonz@google.com>
parents: 1778
diff changeset
2841 tr = repo.transaction('fold')
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2842 try:
915
1ebe5c51919b fold: enable --date and --user options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 912
diff changeset
2843 commitopts = opts.copy()
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2844 allctx = [repo[r] for r in revs]
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2845 targetphase = max(c.phase() for c in allctx)
933
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2846
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2847 if commitopts.get('message') or commitopts.get('logfile'):
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2848 commitopts['edit'] = False
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2849 else:
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2850 msgs = ["HG: This is a fold of %d changesets." % len(allctx)]
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2851 msgs += ["HG: Commit message of changeset %s.\n\n%s\n" %
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2852 (c.rev(), c.description()) for c in allctx]
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
2853 commitopts['message'] = "\n".join(msgs)
933
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2854 commitopts['edit'] = True
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2855
993
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
2856 newid, unusedvariable = rewrite(repo, root, allctx, head,
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2857 [root.p1().node(),
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2858 root.p2().node()],
993
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
2859 commitopts=commitopts)
1069
356552e55489 evolve: always use the transaction version of phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1068
diff changeset
2860 phases.retractboundary(repo, tr, targetphase, [newid])
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
2861 obsolete.createmarkers(repo, [(ctx, (repo[newid],))
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
2862 for ctx in allctx])
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2863 tr.close()
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2864 finally:
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2865 tr.release()
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2866 ui.status('%i changesets folded\n' % len(revs))
632
cb0807646f5a fold: work around potential bug with filtering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 631
diff changeset
2867 if repo['.'].rev() in revs:
549
b047e9417d96 Properly update after fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 548
diff changeset
2868 hg.update(repo, newid)
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2869 finally:
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2870 lockmod.release(lock, wlock)
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2871
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2872 @eh.command(
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2873 '^metaedit',
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2874 [('r', 'rev', [], _("revision to edit")),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2875 ('', 'fold', None, _("also fold specified revisions into one")),
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2876 ] + commitopts + commitopts2,
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
2877 _('hg metaedit [OPTION]... [-r] [REV]'))
1683
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2878 def metaedit(ui, repo, *revs, **opts):
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2879 """edit commit information
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2880
1684
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2881 Edits the commit information for the specified revisions. By default, edits
1683
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2882 commit information for the working directory parent.
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2883
1684
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2884 With --fold, also folds multiple revisions into one if necessary. In this
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2885 case, the given revisions must form a linear unbroken chain.
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2886
1683
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2887 .. container:: verbose
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2888
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2889 Some examples:
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2890
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2891 - Edit the commit message for the working directory parent::
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2892
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2893 hg metaedit
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2894
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2895 - Change the username for the working directory parent::
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2896
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2897 hg metaedit --user 'New User <new-email@example.com>'
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2898
1684
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2899 - Combine all draft revisions that are ancestors of foo but not of @ into
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2900 one::
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2901
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2902 hg metaedit --fold 'draft() and only(foo,@)'
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2903
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2904 See :hg:`help phases` for more about draft revisions, and
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2905 :hg:`help revsets` for more about the `draft()` and `only()` keywords.
1683
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2906 """
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2907 revs = list(revs)
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2908 revs.extend(opts['rev'])
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2909 if not revs:
1684
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2910 if opts['fold']:
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2911 raise error.Abort(_('revisions must be specified with --fold'))
1683
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2912 revs = ['.']
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2913
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2914 wlock = lock = None
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2915 try:
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2916 wlock = repo.wlock()
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2917 lock = repo.lock()
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2918
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2919 revs = scmutil.revrange(repo, revs)
1684
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2920 if not opts['fold'] and len(revs) > 1:
1683
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2921 # TODO: handle multiple revisions. This is somewhat tricky because
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2922 # if we want to edit a series of commits:
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2923 #
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2924 # a ---- b ---- c
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2925 #
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2926 # we need to rewrite a first, then directly rewrite b on top of the
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2927 # new a, then rewrite c on top of the new b. So we need to handle
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2928 # revisions in topological order.
1684
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2929 raise error.Abort(_('editing multiple revisions without --fold is '
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2930 'not currently supported'))
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2931
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2932 if opts['fold']:
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2933 root, head = _foldcheck(repo, revs)
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2934 else:
1686
031682c1faa2 metaedit: check for public changeset before instability
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1685
diff changeset
2935 if repo.revs("%ld and public()", revs):
031682c1faa2 metaedit: check for public changeset before instability
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1685
diff changeset
2936 raise error.Abort(_('cannot edit commit information for public '
031682c1faa2 metaedit: check for public changeset before instability
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1685
diff changeset
2937 'revisions'))
1684
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2938 newunstable = _disallowednewunstable(repo, revs)
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2939 if newunstable:
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
2940 msg = _('cannot edit commit information in the middle'
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
2941 ' of a stack')
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
2942 hint = _('%s will become unstable and new unstable changes'
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
2943 ' are not allowed')
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
2944 hint %= repo[newunstable.first()]
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
2945 raise error.Abort(msg, hint=hint)
1684
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2946 root = head = repo[revs.first()]
1683
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2947
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2948 wctx = repo[None]
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2949 p1 = wctx.p1()
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2950 tr = repo.transaction('metaedit')
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2951 newp1 = None
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2952 try:
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2953 commitopts = opts.copy()
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2954 allctx = [repo[r] for r in revs]
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2955 targetphase = max(c.phase() for c in allctx)
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2956
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2957 if commitopts.get('message') or commitopts.get('logfile'):
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2958 commitopts['edit'] = False
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2959 else:
1684
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2960 if opts['fold']:
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2961 msgs = ["HG: This is a fold of %d changesets." % len(allctx)]
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2962 msgs += ["HG: Commit message of changeset %s.\n\n%s\n" %
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2963 (c.rev(), c.description()) for c in allctx]
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2964 else:
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2965 msgs = [head.description()]
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
2966 commitopts['message'] = "\n".join(msgs)
1683
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2967 commitopts['edit'] = True
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2968
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2969 # TODO: if the author and message are the same, don't create a new
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2970 # hash. Right now we create a new hash because the date can be
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2971 # different.
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2972 newid, created = rewrite(repo, root, allctx, head,
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2973 [root.p1().node(), root.p2().node()],
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2974 commitopts=commitopts)
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2975 if created:
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2976 if p1.rev() in revs:
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2977 newp1 = newid
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2978 phases.retractboundary(repo, tr, targetphase, [newid])
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2979 obsolete.createmarkers(repo, [(ctx, (repo[newid],))
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2980 for ctx in allctx])
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2981 else:
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2982 ui.status(_("nothing changed\n"))
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2983 tr.close()
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2984 finally:
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2985 tr.release()
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2986
1684
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2987 if opts['fold']:
474db2d60202 metaedit: add support for folding commits while editing their metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1683
diff changeset
2988 ui.status('%i changesets folded\n' % len(revs))
1683
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2989 if newp1 is not None:
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2990 hg.update(repo, newp1)
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2991 finally:
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2992 lockmod.release(lock, wlock)
4fd0db2f6d84 commands: introduce a new command to edit commit metadata
Siddharth Agarwal <sid0@fb.com>
parents: 1682
diff changeset
2993
1681
1b1c8c0ab20e evolve: factor out sanity checks for folds
Siddharth Agarwal <sid0@fb.com>
parents: 1680
diff changeset
2994 def _foldcheck(repo, revs):
1b1c8c0ab20e evolve: factor out sanity checks for folds
Siddharth Agarwal <sid0@fb.com>
parents: 1680
diff changeset
2995 roots = repo.revs('roots(%ld)', revs)
1b1c8c0ab20e evolve: factor out sanity checks for folds
Siddharth Agarwal <sid0@fb.com>
parents: 1680
diff changeset
2996 if len(roots) > 1:
1b1c8c0ab20e evolve: factor out sanity checks for folds
Siddharth Agarwal <sid0@fb.com>
parents: 1680
diff changeset
2997 raise error.Abort(_("cannot fold non-linear revisions "
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
2998 "(multiple roots given)"))
1681
1b1c8c0ab20e evolve: factor out sanity checks for folds
Siddharth Agarwal <sid0@fb.com>
parents: 1680
diff changeset
2999 root = repo[roots.first()]
1b1c8c0ab20e evolve: factor out sanity checks for folds
Siddharth Agarwal <sid0@fb.com>
parents: 1680
diff changeset
3000 if root.phase() <= phases.public:
1b1c8c0ab20e evolve: factor out sanity checks for folds
Siddharth Agarwal <sid0@fb.com>
parents: 1680
diff changeset
3001 raise error.Abort(_("cannot fold public revisions"))
1b1c8c0ab20e evolve: factor out sanity checks for folds
Siddharth Agarwal <sid0@fb.com>
parents: 1680
diff changeset
3002 heads = repo.revs('heads(%ld)', revs)
1b1c8c0ab20e evolve: factor out sanity checks for folds
Siddharth Agarwal <sid0@fb.com>
parents: 1680
diff changeset
3003 if len(heads) > 1:
1b1c8c0ab20e evolve: factor out sanity checks for folds
Siddharth Agarwal <sid0@fb.com>
parents: 1680
diff changeset
3004 raise error.Abort(_("cannot fold non-linear revisions "
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
3005 "(multiple heads given)"))
1681
1b1c8c0ab20e evolve: factor out sanity checks for folds
Siddharth Agarwal <sid0@fb.com>
parents: 1680
diff changeset
3006 head = repo[heads.first()]
1682
40d7b0c4abb1 evolve: factor out check for creating unstable commits
Siddharth Agarwal <sid0@fb.com>
parents: 1681
diff changeset
3007 if _disallowednewunstable(repo, revs):
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
3008 msg = _("cannot fold chain not ending with a head or with branching")
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
3009 hint = _("new unstable changesets are not allowed")
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
3010 raise error.Abort(msg, hint=hint)
1681
1b1c8c0ab20e evolve: factor out sanity checks for folds
Siddharth Agarwal <sid0@fb.com>
parents: 1680
diff changeset
3011 return root, head
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
3012
1682
40d7b0c4abb1 evolve: factor out check for creating unstable commits
Siddharth Agarwal <sid0@fb.com>
parents: 1681
diff changeset
3013 def _disallowednewunstable(repo, revs):
40d7b0c4abb1 evolve: factor out check for creating unstable commits
Siddharth Agarwal <sid0@fb.com>
parents: 1681
diff changeset
3014 allowunstable = obsolete.isenabled(repo, obsolete.allowunstableopt)
40d7b0c4abb1 evolve: factor out check for creating unstable commits
Siddharth Agarwal <sid0@fb.com>
parents: 1681
diff changeset
3015 if allowunstable:
40d7b0c4abb1 evolve: factor out check for creating unstable commits
Siddharth Agarwal <sid0@fb.com>
parents: 1681
diff changeset
3016 return revset.baseset()
40d7b0c4abb1 evolve: factor out check for creating unstable commits
Siddharth Agarwal <sid0@fb.com>
parents: 1681
diff changeset
3017 return repo.revs("(%ld::) - %ld", revs, revs)
40d7b0c4abb1 evolve: factor out check for creating unstable commits
Siddharth Agarwal <sid0@fb.com>
parents: 1681
diff changeset
3018
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
3019 @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
3020 def graftwrapper(orig, ui, repo, *revs, **kwargs):
419
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
3021 kwargs = dict(kwargs)
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
3022 revs = list(revs) + kwargs.get('rev', [])
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
3023 kwargs['rev'] = []
417
a1fb18ad29a1 evolve: avoid duplication in graft wrapper
Patrick Mezard <patrick@mezard.eu>
parents: 416
diff changeset
3024 obsoleted = kwargs.setdefault('obsolete', [])
419
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
3025
1256
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
3026 wlock = lock = None
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
3027 try:
1256
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
3028 wlock = repo.wlock()
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
3029 lock = repo.lock()
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
3030 if kwargs.get('old_obsolete'):
418
18a0d96ed559 evolve: graft --continue is optional, test
Patrick Mezard <patrick@mezard.eu>
parents: 417
diff changeset
3031 if kwargs.get('continue'):
2051
74934195747b evolve: switch away from deprecated repo.opener
Martin von Zweigbergk <martinvonz@google.com>
parents: 2049
diff changeset
3032 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
3033 else:
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
3034 obsoleted.extend(revs)
151
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
3035 # 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
3036 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
3037 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
3038
743
af74a5cdf96b conform to the Mercurial custom of lowercase messages
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 742
diff changeset
3039 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
3040 'obsoleting (for now).'))
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
3041
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
3042 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
3043 finally:
1256
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
3044 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
3045
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
3046 @eh.extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
3047 def oldevolveextsetup(ui):
1631
7463f5880ce9 prune: remove the kill alias
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1630
diff changeset
3048 for cmd in ['prune', 'uncommit', 'touch', 'fold']:
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
3049 try:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
3050 entry = extensions.wrapcommand(cmdtable, cmd,
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
3051 warnobserrors)
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
3052 except error.UnknownCommand:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
3053 # Commands may be disabled
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
3054 continue
356
56d4c6207ef9 Move obserror warning into the obsolete extension.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 355
diff changeset
3055
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
3056 entry = cmdutil.findcmd('commit', commands.table)[1]
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
3057 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
3058 _("make commit obsolete this revision (DEPRECATED)")))
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
3059 entry = cmdutil.findcmd('graft', commands.table)[1]
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
3060 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
3061 _("make graft obsoletes this revision (DEPRECATED)")))
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
3062 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
3063 _("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
3064
1302
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3065 @eh.wrapfunction(obsolete, '_checkinvalidmarkers')
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3066 def _checkinvalidmarkers(orig, markers):
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3067 """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
3068
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3069 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
3070 subtle handling.
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3071 """
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3072 if 'debugobsconvert' in sys.argv:
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3073 return
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3074 for mark in markers:
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3075 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
3076 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
3077 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
3078 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
3079
2043
c64300906a32 exthelper: move command declaration into the exthelper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2041
diff changeset
3080 @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
3081 'debugobsconvert',
2053
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2051
diff changeset
3082 [('', '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
3083 '')
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
3084 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
3085 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
3086 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
3087 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
3088 raise error.Abort(msg)
1465
777e5c369d99 compat: use svfs instead of sopener
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1464
diff changeset
3089 f = repo.svfs('obsstore', 'wb', atomictemp=True)
1169
6f08a8f6bb1d debugobsconvert: also deduplicate markers in the process
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1159
diff changeset
3090 known = set()
6f08a8f6bb1d debugobsconvert: also deduplicate markers in the process
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1159
diff changeset
3091 markers = []
1172
8d28bb4fc127 debugobsconvert: fix 6f08a8f6bb1d and add proper test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1171
diff changeset
3092 for m in origmarkers:
1202
4099b087f672 evolve: handle invalid obsmarkers in the `debugobsconvert`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1198
diff changeset
3093 # filter out invalid markers
4099b087f672 evolve: handle invalid obsmarkers in the `debugobsconvert`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1198
diff changeset
3094 if nullid in m[1]:
4099b087f672 evolve: handle invalid obsmarkers in the `debugobsconvert`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1198
diff changeset
3095 m = list(m)
4099b087f672 evolve: handle invalid obsmarkers in the `debugobsconvert`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1198
diff changeset
3096 m[1] = tuple(s for s in m[1] if s != nullid)
4099b087f672 evolve: handle invalid obsmarkers in the `debugobsconvert`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1198
diff changeset
3097 m = tuple(m)
1169
6f08a8f6bb1d debugobsconvert: also deduplicate markers in the process
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1159
diff changeset
3098 if m in known:
6f08a8f6bb1d debugobsconvert: also deduplicate markers in the process
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1159
diff changeset
3099 continue
1172
8d28bb4fc127 debugobsconvert: fix 6f08a8f6bb1d and add proper test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1171
diff changeset
3100 known.add(m)
1169
6f08a8f6bb1d debugobsconvert: also deduplicate markers in the process
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1159
diff changeset
3101 markers.append(m)
1170
4697f23e0ede debugobsconvert: fix a typo on "version"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1169
diff changeset
3102 ui.write(_('Old store is version %d, will rewrite in version %d\n') % (
1159
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
3103 repo.obsstore._version, new_format))
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
3104 map(f.write, obsolete.encodemarkers(markers, True, new_format))
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
3105 f.close()
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
3106 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
3107
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
3108
1827
15ec53d46f44 compat: drop handling of ancestral 'helploader' caller
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1826
diff changeset
3109 def _helploader(ui):
1414
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3110 return help.gettext(evolutionhelptext)
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3111
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3112 @eh.uisetup
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3113 def _setuphelp(ui):
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3114 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
3115 if entry[0] == "evolution":
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3116 break
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3117 else:
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3118 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
3119 _helploader))
1414
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3120 help.helptable.sort()
1567
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3121
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3122 def _relocatecommit(repo, orig, commitmsg):
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3123 if commitmsg is None:
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3124 commitmsg = orig.description()
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3125 extra = dict(orig.extra())
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3126 if 'branch' in extra:
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3127 del extra['branch']
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3128 extra['rebase_source'] = orig.hex()
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3129
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3130 backup = repo.ui.backupconfig('phases', 'new-commit')
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3131 try:
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3132 targetphase = max(orig.phase(), phases.draft)
1636
13f830540a14 config: report evolve as origin for config
timeless@gmail.com
parents: 1635
diff changeset
3133 repo.ui.setconfig('phases', 'new-commit', targetphase, 'evolve')
1567
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3134 # Commit might fail if unresolved files exist
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3135 nodenew = repo.commit(text=commitmsg, user=orig.user(),
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3136 date=orig.date(), extra=extra)
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3137 finally:
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3138 repo.ui.restoreconfig(backup)
536fdfa3c48b evolve: extract logic to new method _relocatecommit
Shusen LIU <liushusen@fb.com>
parents: 1566
diff changeset
3139 return nodenew
1568
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3140
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3141 def _finalizerelocate(repo, orig, dest, nodenew, tr):
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3142 destbookmarks = repo.nodebookmarks(dest.node())
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3143 nodesrc = orig.node()
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3144 destphase = repo[nodesrc].phase()
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3145 oldbookmarks = repo.nodebookmarks(nodesrc)
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3146 if nodenew is not None:
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3147 phases.retractboundary(repo, tr, destphase, [nodenew])
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3148 obsolete.createmarkers(repo, [(repo[nodesrc], (repo[nodenew],))])
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3149 for book in oldbookmarks:
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3150 repo._bookmarks[book] = nodenew
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3151 else:
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3152 obsolete.createmarkers(repo, [(repo[nodesrc], ())])
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3153 # Behave like rebase, move bookmarks to dest
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3154 for book in oldbookmarks:
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3155 repo._bookmarks[book] = dest.node()
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3156 for book in destbookmarks: # restore bookmark that rebase move
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3157 repo._bookmarks[book] = dest.node()
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3158 if oldbookmarks or destbookmarks:
52c276d2ddb2 evolve: extract logic to new method _finalizerelocate
Shusen LIU <liushusen@fb.com>
parents: 1567
diff changeset
3159 repo._bookmarks.recordchange(tr)
1592
f157ef7b1741 evolve: extract logic to new method _evolvemerge
Shusen LIU <liushusen@fb.com>
parents: 1589
diff changeset
3160
1597
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3161 evolvestateversion = 0
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3162
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3163 @eh.uisetup
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3164 def setupevolveunfinished(ui):
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3165 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
3166 _("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
3167 cmdutil.unfinishedstates.append(data)
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3168
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3169 @eh.wrapfunction(hg, 'clean')
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3170 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
3171 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
3172 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
3173 return ret
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3174
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3175 def _evolvestatewrite(repo, state):
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3176 # [version]
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3177 # [type][length][content]
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3178 #
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3179 # `version` is a 4 bytes integer (handled at higher level)
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3180 # `type` is a single character, `length` is a 4 byte integer, and
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3181 # `content` is an arbitrary byte sequence of length `length`.
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3182 f = repo.vfs('evolvestate', 'w')
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3183 try:
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3184 f.write(_pack('>I', evolvestateversion))
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3185 current = state['current']
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3186 key = 'C' # as in 'current'
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3187 format = '>sI%is' % len(current)
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3188 f.write(_pack(format, key, len(current), current))
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3189 finally:
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3190 f.close()
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3191
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3192 def _evolvestateread(repo):
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3193 try:
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3194 f = repo.vfs('evolvestate')
1677
6103f6ac8110 py3: change except from two comma to as notation
timeless@gmail.com
parents: 1676
diff changeset
3195 except IOError as err:
1597
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3196 if err.errno != errno.ENOENT:
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3197 raise
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3198 return None
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3199 try:
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3200 versionblob = f.read(4)
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3201 if len(versionblob) < 4:
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3202 repo.ui.debug('ignoring corrupted evolvestte (file contains %i bits)'
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3203 % len(versionblob))
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3204 return None
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3205 version = _unpack('>I', versionblob)[0]
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3206 if version != evolvestateversion:
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
3207 msg = _('unknown evolvestate version %i') % version
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
3208 raise error.Abort(msg, hint=_('upgrade your evolve'))
1597
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3209 records = []
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3210 data = f.read()
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3211 off = 0
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3212 end = len(data)
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3213 while off < end:
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3214 rtype = data[off]
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3215 off += 1
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3216 length = _unpack('>I', data[off:(off + 4)])[0]
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3217 off += 4
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3218 record = data[off:(off + length)]
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3219 off += length
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3220 if rtype == 't':
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3221 rtype, record = record[0], record[1:]
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3222 records.append((rtype, record))
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3223 state = {}
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3224 for rtype, rdata in records:
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3225 if rtype == 'C':
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3226 state['current'] = rdata
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3227 elif rtype.lower():
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3228 repo.ui.debug('ignore evolve state record type %s' % rtype)
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3229 else:
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3230 raise error.Abort(_('unknown evolvestate field type %r')
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3231 % rtype, hint=_('upgrade your evolve'))
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3232 return state
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3233 finally:
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3234 f.close()
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3235
7876ed4fceb7 evolve: write our own custom evolvestate file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1594
diff changeset
3236 def _evolvestatedelete(repo):
2070
9105c3c54045 cleanup: stop using 'repo.join' methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2064
diff changeset
3237 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
3238
1592
f157ef7b1741 evolve: extract logic to new method _evolvemerge
Shusen LIU <liushusen@fb.com>
parents: 1589
diff changeset
3239 def _evolvemerge(repo, orig, dest, pctx, keepbranch):
f157ef7b1741 evolve: extract logic to new method _evolvemerge
Shusen LIU <liushusen@fb.com>
parents: 1589
diff changeset
3240 """Used by the evolve function to merge dest on top of pctx.
f157ef7b1741 evolve: extract logic to new method _evolvemerge
Shusen LIU <liushusen@fb.com>
parents: 1589
diff changeset
3241 return the same tuple as merge.graft"""
f157ef7b1741 evolve: extract logic to new method _evolvemerge
Shusen LIU <liushusen@fb.com>
parents: 1589
diff changeset
3242 if repo['.'].rev() != dest.rev():
1831
0195dc7bdfa4 compat: drop compatibility layer around update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1830
diff changeset
3243 merge.update(repo,
0195dc7bdfa4 compat: drop compatibility layer around update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1830
diff changeset
3244 dest,
0195dc7bdfa4 compat: drop compatibility layer around update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1830
diff changeset
3245 branchmerge=False,
0195dc7bdfa4 compat: drop compatibility layer around update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1830
diff changeset
3246 force=True)
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
3247 if repo._activebookmark:
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
3248 repo.ui.status(_("(leaving bookmark %s)\n") % repo._activebookmark)
1835
93d4661a6ee7 compat: drop bookmark compatibility layer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1834
diff changeset
3249 bookmarksmod.deactivate(repo)
1592
f157ef7b1741 evolve: extract logic to new method _evolvemerge
Shusen LIU <liushusen@fb.com>
parents: 1589
diff changeset
3250 if keepbranch:
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
3251 repo.dirstate.setbranch(orig.branch())
1627
a91115687a7e topic: preserve topic during evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1626
diff changeset
3252 if util.safehasattr(repo, 'currenttopic'):
a91115687a7e topic: preserve topic during evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1626
diff changeset
3253 # uurrgs
a91115687a7e topic: preserve topic during evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1626
diff changeset
3254 # there no other topic setter yet
a91115687a7e topic: preserve topic during evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1626
diff changeset
3255 if not orig.topic() and repo.vfs.exists('topic'):
a91115687a7e topic: preserve topic during evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1626
diff changeset
3256 repo.vfs.unlink('topic')
a91115687a7e topic: preserve topic during evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1626
diff changeset
3257 else:
a91115687a7e topic: preserve topic during evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1626
diff changeset
3258 with repo.vfs.open('topic', 'w') as f:
a91115687a7e topic: preserve topic during evolve
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1626
diff changeset
3259 f.write(orig.topic())
1592
f157ef7b1741 evolve: extract logic to new method _evolvemerge
Shusen LIU <liushusen@fb.com>
parents: 1589
diff changeset
3260
1826
19df96c0d670 compat: drop hack around a 'graft' signature change
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1825
diff changeset
3261 return merge.graft(repo, orig, pctx, ['local', 'graft'], True)