annotate hgext/evolve.py @ 1561:dbf1532ee868

evolve: renaming local variables Renaming local variables to be more precise, i want to store a different list of bookmarks(input-list) and it would be hard to understand what marks represents in that change therefore renaming it to repomarks. Renames mark to bookmark, which will make the changes in next patch more understandable, when it is pluraized. Also renames bookmarks (module) to bookmarksmod so as to free up the name when bookmark gets pluralized.
author Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
date Thu, 10 Dec 2015 15:55:07 -0800
parents 4706475e0c5d
children 6a9f0261b181
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.
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
8
893
12ed6dfa8eea evolve: downcase first word in module doc
Olle Lundberg <geek@nerd.sh>
parents: 892
diff changeset
9 '''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
10
540
8c5da9e75ae0 evolve: fixing syntax/grammar
Patrick Mezard <patrick@mezard.eu>
parents: 539
diff changeset
11 This extension provides several commands to mutate history and deal with
8c5da9e75ae0 evolve: fixing syntax/grammar
Patrick Mezard <patrick@mezard.eu>
parents: 539
diff changeset
12 issues it may raise.
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
13
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
14 It also:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
15
540
8c5da9e75ae0 evolve: fixing syntax/grammar
Patrick Mezard <patrick@mezard.eu>
parents: 539
diff changeset
16 - enables the "Changeset Obsolescence" feature of mercurial,
8c5da9e75ae0 evolve: fixing syntax/grammar
Patrick Mezard <patrick@mezard.eu>
parents: 539
diff changeset
17 - alters core commands and extensions that rewrite history to use
8c5da9e75ae0 evolve: fixing syntax/grammar
Patrick Mezard <patrick@mezard.eu>
parents: 539
diff changeset
18 this feature,
1011
0b44ae30cf3b evolve: drop reference to 2.3 in the extension help text
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 973
diff changeset
19 - improves some aspect of the early implementation in Mercurial core
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
20 '''
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
21
1519
c15d6168412f prepare version 5.1.2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1517
diff changeset
22 __version__ = '5.2.1'
1516
c4f8a2916e43 tests: run test with 3.6 and apply test change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1515
diff changeset
23 testedwith = '3.4.3 3.5.2 3.6'
1012
205d549a972f evolve: point to the core mercurial tracker for bugfix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1011
diff changeset
24 buglink = 'http://bz.selenic.com/'
584
af3b0d696e7f evolve: add tested with info
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 577
diff changeset
25
1414
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
26
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
27 evolutionhelptext = """
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
28 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
29 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
30
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
31 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
32 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
33 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
34 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
35 respected, such that only draft and secret changesets can be altered (see
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
36 :hg:`hg phases` for details).
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
37
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
38 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
39 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
40 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
41 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
42 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
43 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
44
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
45 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
46 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
47 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
48 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
49 of history concurrently.
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
50
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
51 Current feature status
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
52 ======================
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 This feature is still in development. If you see this help, you have enable an
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
55 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
56
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
57 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
58 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
59 via an extension).""".strip()
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
1104
cb36a4eb0157 evolve: fix the 'grab' alias to work on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1101
diff changeset
62 import sys, os
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
63 import random
854
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
64 from StringIO import StringIO
820
a9a66143e2ec exchange: actually use _pushkeyescape fallback
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 819
diff changeset
65 import struct
1106
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
66 import re
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
67 import collections
1309
b621e5da03e1 evolve: add missing import
Laurent Charignon <lcharignon@fb.com>
parents: 1308
diff changeset
68 import socket
b621e5da03e1 evolve: add missing import
Laurent Charignon <lcharignon@fb.com>
parents: 1308
diff changeset
69 import errno
1106
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
70 sha1re = re.compile(r'\b[0-9a-f]{6,40}\b')
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
71
670
97ce1f801309 evolve: drop unused import
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 663
diff changeset
72 import mercurial
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
73 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
74 from mercurial import repair
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
75
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
76 try:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
77 from mercurial import obsolete
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
78 if not obsolete._enabled:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
79 obsolete._enabled = True
952
f83f46411b09 evolve: bump requirement to 3.0.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 950
diff changeset
80 from mercurial import wireproto
f83f46411b09 evolve: bump requirement to 3.0.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 950
diff changeset
81 gboptslist = getattr(wireproto, 'gboptslist', None)
955
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
82 gboptsmap = getattr(wireproto, 'gboptsmap', None)
591
012e48e80840 evolve: require Mercurial 2.4 to work
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 590
diff changeset
83 except (ImportError, AttributeError):
955
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
84 gboptslist = gboptsmap = None
617
469befc27b26 detect incompatibility with future mercurial 2.5
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 616
diff changeset
85
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
86 # Flags for enabling optional parts of evolve
1227
3d9c5f5df6d8 evolve: change config option name
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1226
diff changeset
87 commandopt = 'allnewcommands'
585
f013ca072bd9 evolve: detect and abort if 2.4 is detected
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 584
diff changeset
88
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
89 from mercurial import bookmarks as bookmarksmod
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
90 from mercurial import cmdutil
490
8096833e9226 sort import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 485
diff changeset
91 from mercurial import commands
8096833e9226 sort import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 485
diff changeset
92 from mercurial import context
8096833e9226 sort import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 485
diff changeset
93 from mercurial import copies
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
94 from mercurial import error
817
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
95 from mercurial import exchange
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
96 from mercurial import extensions
1414
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
97 from mercurial import help
880
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
98 from mercurial import httppeer
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
99 from mercurial import hg
514
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
100 from mercurial import lock as lockmod
490
8096833e9226 sort import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 485
diff changeset
101 from mercurial import merge
8096833e9226 sort import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 485
diff changeset
102 from mercurial import node
113
3bdabdbb4140 adapt evolution to phase in core.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 108
diff changeset
103 from mercurial import phases
930
cac35bef8aee import: --obsolete flag for automatic obsolescence marker creation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 927
diff changeset
104 from mercurial import patch
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
105 from mercurial import revset
490
8096833e9226 sort import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 485
diff changeset
106 from mercurial import scmutil
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
107 from mercurial import templatekw
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
108 from mercurial.i18n import _
986
c1f8ece4182d evolve: add --tool option so we don't have to use HGMERGE
Greg Ward <greg@gerg.ca>
parents: 985
diff changeset
109 from mercurial.commands import walkopts, commitopts, commitopts2, mergetoolopts
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
110 from mercurial.node import nullid
820
a9a66143e2ec exchange: actually use _pushkeyescape fallback
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 819
diff changeset
111 from mercurial import wireproto
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
112 from mercurial import localrepo
869
e9eeef0d07ec exchange: enforce permission on new wireprotocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 868
diff changeset
113 from mercurial.hgweb import hgweb_mod
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
114
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
115 cmdtable = {}
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
116 command = cmdutil.command(cmdtable)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
117
820
a9a66143e2ec exchange: actually use _pushkeyescape fallback
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 819
diff changeset
118 _pack = struct.pack
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
119
955
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
120 if gboptsmap is not None:
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
121 memfilectx = context.memfilectx
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
122 elif gboptslist is not None:
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
123 oldmemfilectx = context.memfilectx
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
124 def memfilectx(repo, *args, **kwargs):
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
125 return oldmemfilectx(*args, **kwargs)
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
126 else:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
127 raise ImportError('evolve needs version %s or above' %
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
128 min(testedwith.split()))
955
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
129
1296
23819e1d61fd evolve: add -i flag to amend command
Laurent Charignon <lcharignon@fb.com>
parents: 1281
diff changeset
130 aliases, entry = cmdutil.findcmd('commit', commands.table)
1340
f455ce2a3587 evolve: migrate off of now-dead util.any
Augie Fackler <raf@durin42.com>
parents: 1335
diff changeset
131 hasinteractivemode = any(['interactive' in e for e in entry[1]])
1296
23819e1d61fd evolve: add -i flag to amend command
Laurent Charignon <lcharignon@fb.com>
parents: 1281
diff changeset
132 if hasinteractivemode:
23819e1d61fd evolve: add -i flag to amend command
Laurent Charignon <lcharignon@fb.com>
parents: 1281
diff changeset
133 interactiveopt = [['i', 'interactive', None, _('use interactive mode')]]
23819e1d61fd evolve: add -i flag to amend command
Laurent Charignon <lcharignon@fb.com>
parents: 1281
diff changeset
134 else:
23819e1d61fd evolve: add -i flag to amend command
Laurent Charignon <lcharignon@fb.com>
parents: 1281
diff changeset
135 interactiveopt = []
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
136 # This extension contains the following code
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
137 #
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
138 # - Extension Helper code
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
139 # - Obsolescence cache
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
140 # - ...
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
141 # - Older format compat
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
142
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
143
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
144 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
145 ### Extension helper ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
146 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
147
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
148 class exthelper(object):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
149 """Helper for modular extension setup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
150
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
151 A single helper should be instanciated for each extension. Helper
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
152 methods are then used as decorator for various purpose.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
153
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
154 All decorators return the original function and may be chained.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
155 """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
156
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
157 def __init__(self):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
158 self._uicallables = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
159 self._extcallables = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
160 self._repocallables = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
161 self._revsetsymbols = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
162 self._templatekws = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
163 self._commandwrappers = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
164 self._extcommandwrappers = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
165 self._functionwrappers = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
166 self._duckpunchers = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
167
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
168 def final_uisetup(self, ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
169 """Method to be used as the extension uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
170
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
171 The following operations belong here:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
172
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
173 - Changes to ui.__class__ . The ui object that will be used to run the
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
174 command has not yet been created. Changes made here will affect ui
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
175 objects created after this, and in particular the ui that will be
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
176 passed to runcommand
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
177 - Command wraps (extensions.wrapcommand)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
178 - Changes that need to be visible to other extensions: because
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
179 initialization occurs in phases (all extensions run uisetup, then all
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
180 run extsetup), a change made here will be visible to other extensions
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
181 during extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
182 - Monkeypatch or wrap function (extensions.wrapfunction) of dispatch
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
183 module members
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
184 - Setup of pre-* and post-* hooks
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
185 - pushkey setup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
186 """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
187 for cont, funcname, func in self._duckpunchers:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
188 setattr(cont, funcname, func)
1218
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
189 for command, wrapper, opts in self._commandwrappers:
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
190 entry = extensions.wrapcommand(commands.table, command, wrapper)
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
191 if opts:
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
192 for short, long, val, msg in opts:
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
193 entry[1].append((short, long, val, msg))
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
194 for cont, funcname, wrapper in self._functionwrappers:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
195 extensions.wrapfunction(cont, funcname, wrapper)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
196 for c in self._uicallables:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
197 c(ui)
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 def final_extsetup(self, ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
200 """Method to be used as a the extension extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
201
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
202 The following operations belong here:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
203
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
204 - Changes depending on the status of other extensions. (if
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
205 extensions.find('mq'))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
206 - Add a global option to all commands
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
207 - Register revset functions
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
208 """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
209 knownexts = {}
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
210 for name, symbol in self._revsetsymbols:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
211 revset.symbols[name] = symbol
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
212 for name, kw in self._templatekws:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
213 templatekw.keywords[name] = kw
1218
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
214 for ext, command, wrapper, opts in self._extcommandwrappers:
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
215 if ext not in knownexts:
1219
658b0d032699 wrapcommand: fix wrapping extensions that aren't enabled
Durham Goode <durham@fb.com>
parents: 1218
diff changeset
216 try:
658b0d032699 wrapcommand: fix wrapping extensions that aren't enabled
Durham Goode <durham@fb.com>
parents: 1218
diff changeset
217 e = extensions.find(ext)
658b0d032699 wrapcommand: fix wrapping extensions that aren't enabled
Durham Goode <durham@fb.com>
parents: 1218
diff changeset
218 except KeyError:
658b0d032699 wrapcommand: fix wrapping extensions that aren't enabled
Durham Goode <durham@fb.com>
parents: 1218
diff changeset
219 # Extension isn't enabled, so don't bother trying to wrap
658b0d032699 wrapcommand: fix wrapping extensions that aren't enabled
Durham Goode <durham@fb.com>
parents: 1218
diff changeset
220 # it.
658b0d032699 wrapcommand: fix wrapping extensions that aren't enabled
Durham Goode <durham@fb.com>
parents: 1218
diff changeset
221 continue
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
222 knownexts[ext] = e.cmdtable
1218
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
223 entry = extensions.wrapcommand(knownexts[ext], command, wrapper)
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
224 if opts:
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
225 for short, long, val, msg in opts:
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
226 entry[1].append((short, long, val, msg))
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
227
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
228 for c in self._extcallables:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
229 c(ui)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
230
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
231 def final_reposetup(self, ui, repo):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
232 """Method to be used as a the extension reposetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
233
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
234 The following operations belong here:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
235
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
236 - All hooks but pre-* and post-*
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
237 - Modify configuration variables
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
238 - Changes to repo.__class__, repo.dirstate.__class__
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
239 """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
240 for c in self._repocallables:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
241 c(ui, repo)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
242
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
243 def uisetup(self, call):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
244 """Decorated function will be executed during uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
245
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
246 example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
247
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
248 @eh.uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
249 def setupbabar(ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
250 print 'this is uisetup!'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
251 """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
252 self._uicallables.append(call)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
253 return call
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
254
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
255 def extsetup(self, call):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
256 """Decorated function will be executed during extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
257
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
258 example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
259
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
260 @eh.extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
261 def setupcelestine(ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
262 print 'this is extsetup!'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
263 """
672
f7834b360f8f evolve: fix extsetup extension helper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 671
diff changeset
264 self._extcallables.append(call)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
265 return call
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
266
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
267 def reposetup(self, call):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
268 """Decorated function will be executed during reposetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
269
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
270 example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
271
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
272 @eh.reposetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
273 def setupzephir(ui, repo):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
274 print 'this is reposetup!'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
275 """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
276 self._repocallables.append(call)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
277 return call
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
278
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
279 def revset(self, symbolname):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
280 """Decorated function is a revset symbol
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
281
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
282 The name of the symbol must be given as the decorator argument.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
283 The symbol is added during `extsetup`.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
284
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
285 example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
286
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
287 @eh.revset('hidden')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
288 def revsetbabar(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
289 args = revset.getargs(x, 0, 0, 'babar accept no argument')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
290 return [r for r in subset if 'babar' in repo[r].description()]
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
291 """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
292 def dec(symbol):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
293 self._revsetsymbols.append((symbolname, symbol))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
294 return symbol
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
295 return dec
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
296
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
297
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
298 def templatekw(self, keywordname):
1376
8bb2e04cc18c evolve: fix the template keyworkd decorator docstring
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1375
diff changeset
299 """Decorated function is a template keyword
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
300
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
301 The name of the keyword must be given as the decorator argument.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
302 The symbol is added during `extsetup`.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
303
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
304 example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
305
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
306 @eh.templatekw('babar')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
307 def kwbabar(ctx):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
308 return 'babar'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
309 """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
310 def dec(keyword):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
311 self._templatekws.append((keywordname, keyword))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
312 return keyword
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
313 return dec
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
314
1218
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
315 def wrapcommand(self, command, extension=None, opts=[]):
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
316 """Decorated function is a command wrapper
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 The name of the command must be given as the decorator argument.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
319 The wrapping is installed during `uisetup`.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
320
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
321 If the second option `extension` argument is provided, the wrapping
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
322 will be applied in the extension commandtable. This argument must be a
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
323 string that will be searched using `extension.find` if not found and
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
324 Abort error is raised. If the wrapping applies to an extension, it is
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
325 installed during `extsetup`
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
326
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
327 example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
328
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
329 @eh.wrapcommand('summary')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
330 def wrapsummary(orig, ui, repo, *args, **kwargs):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
331 ui.note('Barry!')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
332 return orig(ui, repo, *args, **kwargs)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
333
1218
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
334 The `opts` argument allows specifying additional arguments for the
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
335 command.
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
336
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
337 """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
338 def dec(wrapper):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
339 if extension is None:
1218
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
340 self._commandwrappers.append((command, wrapper, opts))
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
341 else:
1218
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
342 self._extcommandwrappers.append((extension, command, wrapper,
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
343 opts))
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
344 return wrapper
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
345 return dec
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
346
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
347 def wrapfunction(self, container, funcname):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
348 """Decorated function is a function wrapper
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
349
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
350 This function takes two arguments, the container and the name of the
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
351 function to wrap. The wrapping is performed during `uisetup`.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
352 (there is no extension support)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
353
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
354 example::
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 @eh.function(discovery, 'checkheads')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
357 def wrapfunction(orig, *args, **kwargs):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
358 ui.note('His head smashed in and his heart cut out')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
359 return orig(*args, **kwargs)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
360 """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
361 def dec(wrapper):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
362 self._functionwrappers.append((container, funcname, wrapper))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
363 return wrapper
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
364 return dec
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
365
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
366 def addattr(self, container, funcname):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
367 """Decorated function is to be added to the container
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
368
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
369 This function takes two arguments, the container and the name of the
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
370 function to wrap. The wrapping is performed during `uisetup`.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
371
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
372 example::
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 @eh.function(context.changectx, 'babar')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
375 def babar(ctx):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
376 return 'babar' in ctx.description
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
377 """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
378 def dec(func):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
379 self._duckpunchers.append((container, funcname, func))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
380 return func
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
381 return dec
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
382
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
383 eh = exthelper()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
384 uisetup = eh.final_uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
385 extsetup = eh.final_extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
386 reposetup = eh.final_reposetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
387
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
388 #####################################################################
1213
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
389 ### Option configuration ###
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
390 #####################################################################
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
391
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
392 @eh.reposetup # must be the first of its kin.
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
393 def _configureoptions(ui, repo):
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
394 # If no capabilities are specified, enable everything.
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
395 # 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
396 evolveopts = ui.configlist('experimental', 'evolution')
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
397 if not evolveopts:
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
398 evolveopts = ['all']
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
399 ui.setconfig('experimental', 'evolution', evolveopts)
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
400
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
401 @eh.uisetup
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
402 def _configurecmdoptions(ui):
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
403 # Unregister evolve commands if the command capability is not specified.
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
404 #
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
405 # 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
406 # guarantee it happens after the above configuration, but before the
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
407 # extsetup functions.
1441
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
408 evolvecommands = ui.configlist('experimental', 'evolutioncommands')
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
409 evolveopts = ui.configlist('experimental', 'evolution')
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
410 if evolveopts and (commandopt not in evolveopts and
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
411 'all' not in evolveopts):
1441
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
412 # 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
413 whitelist = set()
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
414 for cmd in evolvecommands:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
415 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
416 if not matchingevolvecommands:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
417 raise error.Abort(_('unknown command: %s') % cmd)
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
418 elif len(matchingevolvecommands) > 1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
419 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
420 raise error.Abort(msg % (cmd, matchingevolvecommands))
1441
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
421 else:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
422 whitelist.add(matchingevolvecommands[0])
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
423 for disabledcmd in set(cmdtable) - whitelist:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
424 del cmdtable[disabledcmd]
1213
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
425
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
426 #####################################################################
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
427 ### 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
428 #####################################################################
66c02a2e8e2f prune: wrap mercurial internal to add parent information in prune marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 804
diff changeset
429
976
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
430 commitopts3 = [
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
431 ('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
432 _('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
433 ('U', 'current-user', None,
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
434 _('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
435 ]
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
436
985
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
437 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
438 """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
439
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
440 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
441 -d was supplied.
577
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
442 """
976
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
443 # 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
444 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
445 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
446 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
447 opts['user'] = ui.username()
577
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
448
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
449 getrevs = obsolete.getrevs
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
450
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 ### Additional Utilities ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
453 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
454
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
455 # 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
456
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
457 # - Function to create markers
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
458 # - 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
459 # - "troubles" method on changectx
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
460 # - function to travel throught the obsolescence graph
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
461 # - function to find useful changeset to stabilize
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
462
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
463
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
464 ### Useful alias
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
465
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
466 @eh.uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
467 def _installalias(ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
468 if ui.config('alias', 'pstatus', None) is None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
469 ui.setconfig('alias', 'pstatus', 'status --rev .^')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
470 if ui.config('alias', 'pdiff', None) is None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
471 ui.setconfig('alias', 'pdiff', 'diff --rev .^')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
472 if ui.config('alias', 'olog', None) is None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
473 ui.setconfig('alias', 'olog', "log -r 'precursors(.)' --hidden")
497
43e1b2cab789 evolve: add the odiff alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 492
diff changeset
474 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
475 ui.setconfig('alias', 'odiff',
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
476 "diff --hidden --rev 'limit(precursors(.),1)' --rev .")
696
121e2d265e85 alias: add a grab alias
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 695
diff changeset
477 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
478 if os.name == 'nt':
cb36a4eb0157 evolve: fix the 'grab' alias to work on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1101
diff changeset
479 ui.setconfig('alias', 'grab',
1109
212f24013455 evolve: really fix the 'grab' alias on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1106
diff changeset
480 "! " + util.hgexecutable() + " rebase --dest . --rev $@ && "
1104
cb36a4eb0157 evolve: fix the 'grab' alias to work on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1101
diff changeset
481 + util.hgexecutable() + " up tip")
cb36a4eb0157 evolve: fix the 'grab' alias to work on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1101
diff changeset
482 else:
cb36a4eb0157 evolve: fix the 'grab' alias to work on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1101
diff changeset
483 ui.setconfig('alias', 'grab',
cb36a4eb0157 evolve: fix the 'grab' alias to work on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1101
diff changeset
484 "! $HG rebase --dest . --rev $@ && $HG up tip")
696
121e2d265e85 alias: add a grab alias
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 695
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 ### Troubled revset symbol
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 @eh.revset('troubled')
594
7f89b31fcb26 merge bumped rename
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 592 593
diff changeset
490 def revsettroubled(repo, subset, x):
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
491 """``troubled()``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
492 Changesets with troubles.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
493 """
993
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
494 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
495 troubled = set()
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
496 troubled.update(getrevs(repo, 'unstable'))
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
497 troubled.update(getrevs(repo, 'bumped'))
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
498 troubled.update(getrevs(repo, 'divergent'))
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
499 troubled = revset.baseset(troubled)
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
500 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
501 return subset & troubled
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
502
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
503 ### Obsolescence graph
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
504
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
505 # 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
506
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
507 def _precursors(repo, s):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
508 """Precursor of a changeset"""
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
509 cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
510 nm = repo.changelog.nodemap
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
511 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
512 node = repo.changelog.node
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
513 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
514 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
515 pr = nm.get(p[0])
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
516 if pr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
517 cs.add(pr)
1383
cf62abb62941 evolve: move 'precursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1382
diff changeset
518 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
519 return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
520
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
521 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
522 """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
523 node = repo.changelog.node
a127f0f3bf5f evolve: avoid creating changectx object in _allprecursors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1377
diff changeset
524 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
525 seen = set()
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
526 allsubjects = repo.obsstore.precursors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
527 while toproceed:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
528 nc = toproceed.pop()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
529 for mark in allsubjects.get(nc, ()):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
530 np = mark[0]
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
531 if np not in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
532 seen.add(np)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
533 toproceed.append(np)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
534 nm = repo.changelog.nodemap
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
535 cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
536 for p in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
537 pr = nm.get(p)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
538 if pr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
539 cs.add(pr)
1384
64c8b8c27811 evolve: move 'allprecursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1383
diff changeset
540 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
541 return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
542
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
543 def _successors(repo, s):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
544 """Successors of a changeset"""
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
545 cs = set()
1379
693cdcd809f2 evolve: avoid creating changectx object in _successors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1378
diff changeset
546 node = repo.changelog.node
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
547 nm = repo.changelog.nodemap
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
548 markerbyobj = repo.obsstore.successors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
549 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
550 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
551 for sub in p[1]:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
552 sr = nm.get(sub)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
553 if sr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
554 cs.add(sr)
1385
c2584407afbf evolve: move 'successors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1384
diff changeset
555 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
556 return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
557
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
558 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
559 """transitive successors of a subset
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
560
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
561 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
562 marker. """
1380
43dcf62237be evolve: avoid creating changectx object in _allsuccessors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1379
diff changeset
563 node = repo.changelog.node
43dcf62237be evolve: avoid creating changectx object in _allsuccessors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1379
diff changeset
564 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
565 seen = set()
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
566 allobjects = repo.obsstore.successors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
567 while toproceed:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
568 nc = toproceed.pop()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
569 for mark in allobjects.get(nc, ()):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
570 if mark[2] & haltonflags:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
571 continue
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
572 for sub in mark[1]:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
573 if sub == nullid:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
574 continue # should not be here!
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
575 if sub not in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
576 seen.add(sub)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
577 toproceed.append(sub)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
578 nm = repo.changelog.nodemap
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
579 cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
580 for s in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
581 sr = nm.get(s)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
582 if sr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
583 cs.add(sr)
1386
b5eaec8a53d0 evolve: move 'allsuccessors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1385
diff changeset
584 cs -= repo.changelog.filteredrevs # nodemap has no filtering
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
585 return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
586
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
587
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
588
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
589
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
590 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
591 ### Extending revset and template ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
592 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
593
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
594 # 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
595 # they are subject to changes
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
596
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
597
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
598 ### 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
599 @eh.revset('suspended')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
600 def revsetsuspended(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
601 """``suspended()``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
602 Obsolete changesets with non-obsolete descendants.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
603 """
1307
677c5da57b9c evolve: remove unused variables
Laurent Charignon <lcharignon@fb.com>
parents: 1306
diff changeset
604 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
605 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
606 suspended.sort()
c431f827f366 evolve: move 'suspended()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1381
diff changeset
607 return subset & suspended
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
608
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
609
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
610 @eh.revset('precursors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
611 def revsetprecursors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
612 """``precursors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
613 Immediate precursors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
614 """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
615 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
616 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
617 s.sort()
cf62abb62941 evolve: move 'precursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1382
diff changeset
618 return subset & s
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
619
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
620
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
621 @eh.revset('allprecursors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
622 def revsetallprecursors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
623 """``allprecursors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
624 Transitive precursors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
625 """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
626 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
627 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
628 s.sort()
64c8b8c27811 evolve: move 'allprecursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1383
diff changeset
629 return subset & s
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
630
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
631
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
632 @eh.revset('successors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
633 def revsetsuccessors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
634 """``successors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
635 Immediate successors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
636 """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
637 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
638 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
639 s.sort()
c2584407afbf evolve: move 'successors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1384
diff changeset
640 return subset & s
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
641
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
642 @eh.revset('allsuccessors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
643 def revsetallsuccessors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
644 """``allsuccessors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
645 Transitive successors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
646 """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
647 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
648 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
649 s.sort()
b5eaec8a53d0 evolve: move 'allsuccessors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1385
diff changeset
650 return subset & s
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
651
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
652 ### template keywords
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
653 # XXX it does not handle troubles well :-/
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
654
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
655 @eh.templatekw('obsolete')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
656 def obsoletekw(repo, ctx, templ, **args):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
657 """:obsolete: String. The obsolescence level of the node, could be
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
658 ``stable``, ``unstable``, ``suspended`` or ``extinct``.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
659 """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
660 if ctx.obsolete():
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
661 if ctx.extinct():
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
662 return 'extinct'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
663 else:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
664 return 'suspended'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
665 elif ctx.unstable():
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
666 return 'unstable'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
667 return 'stable'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
668
1399
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
669 @eh.templatekw('troubles')
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
670 def showtroubles(repo, ctx, **args):
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
671 """: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
672 (zero or more of "unstable", "divergent" or "bumped")."""
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
673 return templatekw.showlist('trouble', ctx.troubles(), plural='troubles',
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
674 **args)
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
675
491
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 ### Various trouble warning ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
678 #####################################################################
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 # 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
681
1527
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
682
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
683 def _warnobsoletewc(ui, repo):
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
684 if repo['.'].obsolete():
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
685 ui.warn(_('working directory parent is obsolete!\n'))
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
686 if (not ui.quiet) and obsolete.isenabled(repo, commandopt):
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
687 ui.warn(_('(use "hg evolve" to update to its successor)\n'))
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
688
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
689 @eh.wrapcommand("update")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
690 @eh.wrapcommand("pull")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
691 def wrapmayobsoletewc(origfn, ui, repo, *args, **opts):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
692 """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
693 def warnobsolete():
1527
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
694 _warnobsoletewc(ui, repo)
1452
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
695 wlock = None
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
696 try:
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
697 wlock = repo.wlock()
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
698 repo._afterlock(warnobsolete)
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
699 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
700 finally:
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
701 lockmod.release(wlock)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
702 return res
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
703
1527
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
704 @eh.wrapcommand("parents")
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
705 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
706 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
707 _warnobsoletewc(ui, repo)
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
708 return res
e080d2ae2656 parents: avoid locking the repository during 'hg parents'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1519
diff changeset
709
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
710 # XXX this could wrap transaction code
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
711 # 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
712 @eh.wrapcommand("commit")
763
966e2659e989 import: warn about new unstable changesets
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 762
diff changeset
713 @eh.wrapcommand("import")
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
714 @eh.wrapcommand("push")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
715 @eh.wrapcommand("pull")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
716 @eh.wrapcommand("graft")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
717 @eh.wrapcommand("phase")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
718 @eh.wrapcommand("unbundle")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
719 def warnobserrors(orig, ui, repo, *args, **kwargs):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
720 """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
721 # 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
722 # 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
723 filtered = repo.changelog.filteredrevs
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
724 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
725 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
726 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
727 ret = orig(ui, repo, *args, **kwargs)
552
f7e54d4a3b90 warning: work around phase limitation when computing warnings
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 551
diff changeset
728 # workaround phase stupidity
649
d318fbb1cd67 evolve: stop working around phase limitation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 647
diff changeset
729 #phases._filterunknown(ui, repo.changelog, repo._phasecache.phaseroots)
658
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
730 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
731 newunstables = \
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
732 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
733 newbumpeds = \
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
734 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
735 newdivergents = \
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
736 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
737 if newunstables > 0:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
738 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
739 if newbumpeds > 0:
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
740 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
741 if newdivergents > 0:
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
742 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
743 return ret
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
744
1122
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
745 @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
746 def push(orig, repo, *args, **opts):
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
747 """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
748 """
1122
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
749 try:
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
750 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
751 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
752 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
753 "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
754 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
755 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
756 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
757 ex.hint = hint
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
758 raise
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
759
788
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
760 def summaryhook(ui, repo):
513
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
761 def write(fmt, count):
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
762 s = fmt % count
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
763 if count:
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
764 ui.write(s)
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
765 else:
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
766 ui.note(s)
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
767
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
768 nbunstable = len(getrevs(repo, 'unstable'))
594
7f89b31fcb26 merge bumped rename
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 592 593
diff changeset
769 nbbumped = len(getrevs(repo, 'bumped'))
626
896463193675 merge with fix in 2.3
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 621 623
diff changeset
770 nbdivergent = len(getrevs(repo, 'divergent'))
513
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
771 write('unstable: %i changesets\n', nbunstable)
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
772 write('bumped: %i changesets\n', nbbumped)
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
773 write('divergent: %i changesets\n', nbdivergent)
788
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
774
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
775 @eh.extsetup
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
776 def obssummarysetup(ui):
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
777 cmdutil.summaryhooks.add('evolve', summaryhook)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
778
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
779
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
780 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
781 ### Core Other extension compat ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
782 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
783
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
784
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
785 @eh.extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
786 def _rebasewrapping(ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
787 # warning about more obsolete
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
788 try:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
789 rebase = extensions.find('rebase')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
790 if rebase:
572
dc107acd0bd2 adapt to core rebase support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 571
diff changeset
791 extensions.wrapcommand(rebase.cmdtable, 'rebase', warnobserrors)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
792 except KeyError:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
793 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
794 try:
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
795 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
796 if histedit:
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
797 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
798 except KeyError:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
799 pass # rebase not found
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
800
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
801 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
802 ### Old Evolve extension content ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
803 #####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
804
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
805 # 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
806
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
807 ### util function
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
808 #############################
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
809
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
810 ### changeset rewriting logic
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
811 #############################
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
812
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
813 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
814 """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
815 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
816 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
817 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
818 """
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
819 wlock = lock = tr = None
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
820 try:
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
821 wlock = repo.wlock()
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
822 lock = repo.lock()
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
823 tr = repo.transaction('rewrite')
1505
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
824 if len(old.parents()) > 1: #XXX remove this unecessary limitation.
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
825 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
826 base = old.p1()
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
827 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
828
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
829 # 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
830 # 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
831 files = set(old.files())
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
832 for u in updates:
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
833 files.update(u.files())
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
834
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
835 # 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
836 copied = copies.pathcopies(base, head)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
837
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
838
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
839 # 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
840 def samefile(f):
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
841 if f in head.manifest():
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
842 a = head.filectx(f)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
843 if f in base.manifest():
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
844 b = base.filectx(f)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
845 return (a.data() == b.data()
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
846 and a.flags() == b.flags())
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
847 else:
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
848 return False
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
849 else:
1505
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
850 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
851 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
852 # 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
853 headmf = head.manifest()
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
854 def filectxfn(repo, ctx, path):
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
855 if path in headmf:
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
856 fctx = head[path]
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
857 flags = fctx.flags()
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
858 mctx = memfilectx(repo, fctx.path(), fctx.data(),
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
859 islink='l' in flags,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
860 isexec='x' in flags,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
861 copied=copied.get(path))
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
862 return mctx
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
863 return None
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
864
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
865 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
866 if not message:
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
867 message = old.description()
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
868
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
869 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
870 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
871 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
872 extra['branch'] = head.branch()
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
873
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
874 new = context.memctx(repo,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
875 parents=newbases,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
876 text=message,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
877 files=files,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
878 filectxfn=filectxfn,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
879 user=user,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
880 date=date,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
881 extra=extra)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
882
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
883 if commitopts.get('edit'):
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
884 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
885 revcount = len(repo)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
886 newid = repo.commitctx(new)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
887 new = repo[newid]
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
888 created = len(repo) != revcount
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
889 updatebookmarks(newid)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
890
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
891 tr.close()
1505
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
892 return newid, created
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
893 finally:
1554
59f5bb1f1877 transaction: fix release order in 'rewrite'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1547
diff changeset
894 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
895
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
896 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
897 pass
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
898
1141
ca17770d2ee9 evolve: preserve branch change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1140
diff changeset
899 def relocate(repo, orig, dest, keepbranch=False):
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
900 """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
901 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
902 raise error.Abort(_('tried to relocate a node on top of itself'),
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
903 hint=_("This shouldn't happen. If you still "
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
904 "need to move changesets, please do so "
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
905 "manually with nothing to rebase - working "
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
906 "directory parent is also destination"))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
907
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
908 if not orig.p2().rev() == node.nullrev:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
909 raise error.Abort(
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
910 'no support for evolving merge changesets yet',
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
911 hint="Redo the merge and use `hg prune <old> --succ <new>` "
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
912 "to obsolete the old one")
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
913 destbookmarks = repo.nodebookmarks(dest.node())
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
914 nodesrc = orig.node()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
915 destphase = repo[nodesrc].phase()
1106
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
916 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
917
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
918 cache = {}
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
919 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
920 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
921 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
922 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
923 try:
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
924 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
925 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
926 continue
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
927
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
928 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
929 continue
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
930
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
931 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
932
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
933 # 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
934 # 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
935 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
936 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
937 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
938 else:
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
939 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
940 '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
941
1023
7c8e3941241f relocate: add transaction around phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1022
diff changeset
942 tr = repo.transaction('relocate')
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
943 try:
326
52c53e2d413b stabilize: clear error message than conflict during rebase offer no hope
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 319
diff changeset
944 try:
1183
58370c718183 evolve: use `merge.graft` instead of `rebasenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1177
diff changeset
945 if repo['.'].rev() != dest.rev():
58370c718183 evolve: use `merge.graft` instead of `rebasenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1177
diff changeset
946 merge.update(repo, dest, False, True, False)
1330
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
947 if bmactive(repo):
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
948 repo.ui.status(_("(leaving bookmark %s)\n") % bmactive(repo))
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
949 bmdeactivate(repo)
1184
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
950 if keepbranch:
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
951 repo.dirstate.setbranch(orig.branch())
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
952 r = merge.graft(repo, orig, orig.p1(), ['local', 'graft'])
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
953 if r[-1]: #some conflict
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
954 raise error.Abort(
550
362e65fc6146 evolve-cmd: fix merge error detection for external tools.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 549
diff changeset
955 'unresolved merge conflicts (see hg help resolve)')
1184
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
956 if commitmsg is None:
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
957 commitmsg = orig.description()
1510
b86eea66ed02 evolve: be more complete about copying extra from old revisions
Augie Fackler <raf@durin42.com>
parents: 1509
diff changeset
958 extra = dict(orig.extra())
b86eea66ed02 evolve: be more complete about copying extra from old revisions
Augie Fackler <raf@durin42.com>
parents: 1509
diff changeset
959 if 'branch' in extra:
b86eea66ed02 evolve: be more complete about copying extra from old revisions
Augie Fackler <raf@durin42.com>
parents: 1509
diff changeset
960 del extra['branch']
b86eea66ed02 evolve: be more complete about copying extra from old revisions
Augie Fackler <raf@durin42.com>
parents: 1509
diff changeset
961 extra['rebase_source'] = orig.hex()
1141
ca17770d2ee9 evolve: preserve branch change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1140
diff changeset
962
1184
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
963 backup = repo.ui.backupconfig('phases', 'new-commit')
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
964 try:
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
965 targetphase = max(orig.phase(), phases.draft)
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
966 repo.ui.setconfig('phases', 'new-commit', targetphase, 'rebase')
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
967 # Commit might fail if unresolved files exist
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
968 nodenew = repo.commit(text=commitmsg, user=orig.user(),
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
969 date=orig.date(), extra=extra)
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
970 finally:
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
971 repo.ui.restoreconfig(backup)
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
972 except error.Abort as exc:
1131
a44a26f8cc48 evolve: adapt to change in core rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1129
diff changeset
973 repo.dirstate.beginparentchange()
a44a26f8cc48 evolve: adapt to change in core rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1129
diff changeset
974 repo.setparents(repo['.'].node(), nullid)
1514
324cd13838f1 evolve: have dirstate collaborate with transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1513
diff changeset
975 writedirstate(repo.dirstate, tr)
1131
a44a26f8cc48 evolve: adapt to change in core rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1129
diff changeset
976 # fix up dirstate for copies and renames
a44a26f8cc48 evolve: adapt to change in core rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1129
diff changeset
977 copies.duplicatecopies(repo, dest.rev(), orig.p1().rev())
a44a26f8cc48 evolve: adapt to change in core rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1129
diff changeset
978 repo.dirstate.endparentchange()
463
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
979 class LocalMergeFailure(MergeFailure, exc.__class__):
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
980 pass
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
981 exc.__class__ = LocalMergeFailure
326
52c53e2d413b stabilize: clear error message than conflict during rebase offer no hope
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 319
diff changeset
982 raise
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
983 oldbookmarks = repo.nodebookmarks(nodesrc)
284
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
984 if nodenew is not None:
1069
356552e55489 evolve: always use the transaction version of phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1068
diff changeset
985 phases.retractboundary(repo, tr, destphase, [nodenew])
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
986 obsolete.createmarkers(repo, [(repo[nodesrc], (repo[nodenew],))])
284
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
987 for book in oldbookmarks:
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
988 repo._bookmarks[book] = nodenew
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
989 else:
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
990 obsolete.createmarkers(repo, [(repo[nodesrc], ())])
284
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
991 # Behave like rebase, move bookmarks to dest
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
992 for book in oldbookmarks:
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
993 repo._bookmarks[book] = dest.node()
139
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
994 for book in destbookmarks: # restore bookmark that rebase move
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
995 repo._bookmarks[book] = dest.node()
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
996 if oldbookmarks or destbookmarks:
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
997 repo._bookmarks.recordchange(tr)
1023
7c8e3941241f relocate: add transaction around phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1022
diff changeset
998 tr.close()
7c8e3941241f relocate: add transaction around phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1022
diff changeset
999 finally:
7c8e3941241f relocate: add transaction around phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1022
diff changeset
1000 tr.release()
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1001 return nodenew
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
1002
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
1003 def _bookmarksupdater(repo, oldid, tr):
313
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
1004 """Return a callable update(newid) updating the current bookmark
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
1005 and bookmarks bound to oldid to newid.
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
1006 """
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
1007 def updatebookmarks(newid):
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
1008 dirty = False
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
1009 oldbookmarks = repo.nodebookmarks(oldid)
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
1010 if oldbookmarks:
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
1011 for b in oldbookmarks:
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
1012 repo._bookmarks[b] = newid
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
1013 dirty = True
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
1014 if dirty:
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
1015 repo._bookmarks.recordchange(tr)
313
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
1016 return updatebookmarks
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
1017
1330
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
1018 ### bookmarks api compatibility layer ###
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
1019 def bmdeactivate(repo):
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
1020 try:
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
1021 return bookmarksmod.deactivate(repo)
1330
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
1022 except AttributeError:
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
1023 return bookmarksmod.unsetcurrent(repo)
1389
87aceaed5c69 prune: use the bookmark wrapper for 3.4 compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1386
diff changeset
1024 def bmactivate(repo, book):
87aceaed5c69 prune: use the bookmark wrapper for 3.4 compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1386
diff changeset
1025 try:
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
1026 return bookmarksmod.activate(repo, book)
1389
87aceaed5c69 prune: use the bookmark wrapper for 3.4 compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1386
diff changeset
1027 except AttributeError:
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
1028 return bookmarksmod.setcurrent(repo, book)
1330
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
1029
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
1030 def bmactive(repo):
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
1031 try:
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
1032 return repo._activebookmark
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
1033 except AttributeError:
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
1034 return repo._bookmarkcurrent
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
1035
1514
324cd13838f1 evolve: have dirstate collaborate with transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1513
diff changeset
1036 ### dirstate compatibility layer < hg 3.6
324cd13838f1 evolve: have dirstate collaborate with transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1513
diff changeset
1037
324cd13838f1 evolve: have dirstate collaborate with transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1513
diff changeset
1038 def writedirstate(dirstate, tr):
324cd13838f1 evolve: have dirstate collaborate with transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1513
diff changeset
1039 if dirstate.write.func_defaults is not None: # mercurial 3.6 and above
324cd13838f1 evolve: have dirstate collaborate with transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1513
diff changeset
1040 return dirstate.write(tr)
324cd13838f1 evolve: have dirstate collaborate with transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1513
diff changeset
1041 return dirstate.write()
324cd13838f1 evolve: have dirstate collaborate with transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1513
diff changeset
1042
324cd13838f1 evolve: have dirstate collaborate with transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1513
diff changeset
1043
324cd13838f1 evolve: have dirstate collaborate with transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1513
diff changeset
1044
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
1045 ### new command
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
1046 #############################
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
1047 metadataopts = [
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
1048 ('d', 'date', '',
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
1049 _('record the specified date in metadata'), _('DATE')),
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
1050 ('u', 'user', '',
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
1051 _('record the specified user in metadata'), _('USER')),
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
1052 ]
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
1053
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
1054 @eh.uisetup
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
1055 def _installimportobsolete(ui):
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
1056 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
1057 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
1058 _('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
1059 '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
1060
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
1061 @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
1062 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
1063 extracted = patch.extract(ui, hunk)
1511
91b6a30424a3 evolve: compatibility with coming 3.6
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1503
diff changeset
1064 if util.safehasattr(extracted, 'get'):
91b6a30424a3 evolve: compatibility with coming 3.6
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1503
diff changeset
1065 # mercurial 3.6 return a dictionary there
91b6a30424a3 evolve: compatibility with coming 3.6
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1503
diff changeset
1066 expected = extracted.get('nodeid')
91b6a30424a3 evolve: compatibility with coming 3.6
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1503
diff changeset
1067 else:
91b6a30424a3 evolve: compatibility with coming 3.6
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1503
diff changeset
1068 expected = extracted[5]
1115
cc19b6400dae import: fix the "is None" check for the Node
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1109
diff changeset
1069 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
1070 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
1071 oldextract = patch.extract
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
1072 try:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
1073 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
1074 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
1075 finally:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
1076 patch.extract = oldextract
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
1077 created = ret[1]
1055
cfe1b9d3e5d9 import: handle patch with no node information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1054
diff changeset
1078 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
1079 and created != expected):
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
1080 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
1081 try:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
1082 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
1083 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
1084 metadata=metadata)
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
1085 tr.close()
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
1086 finally:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
1087 tr.release()
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
1088 return ret
930
cac35bef8aee import: --obsolete flag for automatic obsolescence marker creation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 927
diff changeset
1089
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
1090
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1091 def _deprecatealias(oldalias, newalias):
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1092 '''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
1093
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1094 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
1095 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
1096 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
1097 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
1098 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
1099
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1100 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
1101 '''
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
1102 try:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
1103 aliases, entry = cmdutil.findcmd(newalias, cmdtable)
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
1104 except error.UnknownCommand:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
1105 # Commands may be disabled
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
1106 return
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1107 for alias, e in cmdtable.iteritems():
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1108 if e is entry:
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1109 break
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1110
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1111 synopsis = '(DEPRECATED)'
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1112 if len(entry) > 2:
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1113 fn, opts, _syn = entry
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1114 else:
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1115 fn, opts, = entry
1496
62aa11956a40 evolve: _() should not contain %
timeless@mozdev.org
parents: 1495
diff changeset
1116 deprecationwarning = _('%s have been deprecated in favor of %s\n') % (
62aa11956a40 evolve: _() should not contain %
timeless@mozdev.org
parents: 1495
diff changeset
1117 oldalias, newalias)
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1118 def newfn(*args, **kwargs):
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1119 ui = args[0]
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1120 ui.warn(deprecationwarning)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1121 util.checksignature(fn)(*args, **kwargs)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1122 newfn.__doc__ = deprecationwarning
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1123 cmdwrapper = command(oldalias, opts, synopsis)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1124 cmdwrapper(newfn)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1125
895
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
1126 @eh.extsetup
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
1127 def deprecatealiases(ui):
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
1128 _deprecatealias('gup', 'next')
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
1129 _deprecatealias('gdown', 'previous')
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
1130
811
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1131 @command('debugrecordpruneparents', [], '')
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1132 def cmddebugrecordpruneparents(ui, repo):
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1133 """add parents data to prune markers when possible
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1134
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1135 This commands search the repo for prune markers without parent information.
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1136 If the pruned node is locally known, a new markers with parent data is
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1137 created."""
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1138 pgop = 'reading markers'
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1139
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1140 # lock from the beginning to prevent race
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1141 wlock = lock = tr = None
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1142 try:
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1143 wlock = repo.wlock()
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1144 lock = repo.lock()
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1145 tr = repo.transaction('recordpruneparents')
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1146 unfi = repo.unfiltered()
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1147 nm = unfi.changelog.nodemap
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1148 store = repo.obsstore
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1149 pgtotal = len(store._all)
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1150 for idx, mark in enumerate(list(store._all)):
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1151 if not mark[1]:
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1152 rev = nm.get(mark[0])
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1153 if rev is not None:
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1154 ctx = unfi[rev]
1311
d6a740947197 evolve: update cmddebugrecordpruneparents to the new markers creation API
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1310
diff changeset
1155 parents = tuple(p.node() for p in ctx.parents())
811
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1156 before = len(store._all)
1311
d6a740947197 evolve: update cmddebugrecordpruneparents to the new markers creation API
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1310
diff changeset
1157 store.create(tr, mark[0], mark[1], mark[2], marks[3],
d6a740947197 evolve: update cmddebugrecordpruneparents to the new markers creation API
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1310
diff changeset
1158 parents=parents)
811
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1159 if len(store._all) - before:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1160 ui.write(_('created new markers for %i\n') % rev)
811
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1161 ui.progress(pgop, idx, total=pgtotal)
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1162 tr.close()
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1163 ui.progress(pgop, None)
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
1164 finally:
1018
30262465b932 debugrecordpruneparents: release tr the same way than the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1017
diff changeset
1165 lockmod.release(tr, lock, wlock)
930
cac35bef8aee import: --obsolete flag for automatic obsolescence marker creation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 927
diff changeset
1166
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1167 @command('debugobsstorestat', [], '')
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1168 def cmddebugobsstorestat(ui, repo):
1315
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1169 def _updateclustermap(nodes, mark, clustersmap):
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1170 c = (set(nodes), set([mark]))
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1171 toproceed = set(nodes)
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1172 while toproceed:
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1173 n = toproceed.pop()
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1174 other = clustersmap.get(n)
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1175 if (other is not None
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1176 and other is not c):
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1177 other[0].update(c[0])
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1178 other[1].update(c[1])
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1179 for on in c[0]:
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1180 if on in toproceed:
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1181 continue
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1182 clustersmap[on] = other
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1183 c = other
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1184 clustersmap[n] = c
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1185
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1186 """print statistic about obsolescence markers in the repo"""
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1187 store = repo.obsstore
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1188 unfi = repo.unfiltered()
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1189 nm = unfi.changelog.nodemap
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1190 ui.write(_('markers total: %9i\n') % len(store._all))
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1191 sucscount = [0, 0 , 0, 0]
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1192 known = 0
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1193 parentsdata = 0
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1194 metakeys = {}
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1195 # node -> cluster mapping
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1196 # a cluster is a (set(nodes), set(markers)) tuple
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1197 clustersmap = {}
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1198 # same data using parent information
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1199 pclustersmap = {}
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1200 for mark in store:
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1201 if mark[0] in nm:
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1202 known += 1
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1203 nbsucs = len(mark[1])
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1204 sucscount[min(nbsucs, 3)] += 1
1129
da565c825429 evolve: adapt to the new metadata storage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1128
diff changeset
1205 meta = mark[3]
da565c825429 evolve: adapt to the new metadata storage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1128
diff changeset
1206 for key, value in meta:
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1207 metakeys.setdefault(key, 0)
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1208 metakeys[key] += 1
1129
da565c825429 evolve: adapt to the new metadata storage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1128
diff changeset
1209 meta = dict(meta)
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1210 parents = [meta.get('p1'), meta.get('p2')]
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1211 parents = [node.bin(p) for p in parents if p is not None]
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1212 if parents:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1213 parentsdata += 1
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1214 # cluster handling
1315
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
1215 nodes = set(mark[1])
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1216 nodes.add(mark[0])
1468
bc6cf6cc06fd evolve: remove trailing spaces
André Sintzoff <andre.sintzoff@gmail.com>
parents: 1467
diff changeset
1217 _updateclustermap(nodes, mark, clustersmap)
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1218 # same with parent data
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1219 nodes.update(parents)
1468
bc6cf6cc06fd evolve: remove trailing spaces
André Sintzoff <andre.sintzoff@gmail.com>
parents: 1467
diff changeset
1220 _updateclustermap(nodes, mark, pclustersmap)
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1221
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1222 # freezing the result
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1223 for c in clustersmap.values():
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1224 fc = (frozenset(c[0]), frozenset(c[1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1225 for n in fc[0]:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1226 clustersmap[n] = fc
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1227 # same with parent data
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1228 for c in pclustersmap.values():
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1229 fc = (frozenset(c[0]), frozenset(c[1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1230 for n in fc[0]:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1231 pclustersmap[n] = fc
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1232 ui.write((' for known precursors: %9i\n' % known))
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1233 ui.write((' with parents data: %9i\n' % parentsdata))
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1234 # successors data
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1235 ui.write(('markers with no successors: %9i\n' % sucscount[0]))
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1236 ui.write((' 1 successors: %9i\n' % sucscount[1]))
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1237 ui.write((' 2 successors: %9i\n' % sucscount[2]))
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1238 ui.write((' more than 2 successors: %9i\n' % sucscount[3]))
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1239 # meta data info
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1240 ui.write((' available keys:\n'))
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1241 for key in sorted(metakeys):
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1242 ui.write((' %15s: %9i\n' % (key, metakeys[key])))
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
1243
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1244 allclusters = list(set(clustersmap.values()))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1245 allclusters.sort(key=lambda x: len(x[1]))
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1246 ui.write(('disconnected clusters: %9i\n' % len(allclusters)))
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1247
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1248 ui.write(' any known node: %9i\n'
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1249 % len([c for c in allclusters
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1250 if [n for n in c[0] if nm.get(n) is not None]]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1251 if allclusters:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1252 nbcluster = len(allclusters)
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1253 ui.write((' smallest length: %9i\n' % len(allclusters[0][1])))
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1254 ui.write((' longer length: %9i\n'
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1255 % len(allclusters[-1][1])))
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1256 median = len(allclusters[nbcluster//2][1])
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1257 ui.write((' median length: %9i\n' % median))
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1258 mean = sum(len(x[1]) for x in allclusters) // nbcluster
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1259 ui.write((' mean length: %9i\n' % mean))
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1260 allpclusters = list(set(pclustersmap.values()))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1261 allpclusters.sort(key=lambda x: len(x[1]))
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1262 ui.write((' using parents data: %9i\n' % len(allpclusters)))
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1263 ui.write(' any known node: %9i\n'
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1264 % len([c for c in allclusters
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1265 if [n for n in c[0] if nm.get(n) is not None]]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1266 if allpclusters:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1267 nbcluster = len(allpclusters)
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1268 ui.write((' smallest length: %9i\n'
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1269 % len(allpclusters[0][1])))
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1270 ui.write((' longer length: %9i\n'
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1271 % len(allpclusters[-1][1])))
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1272 median = len(allpclusters[nbcluster//2][1])
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1273 ui.write((' median length: %9i\n' % median))
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
1274 mean = sum(len(x[1]) for x in allpclusters) // nbcluster
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1275 ui.write((' mean length: %9i\n' % mean))
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
1276
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1277 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
1278 """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
1279 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
1280 try:
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
1281 wlock = repo.wlock()
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
1282 lock = repo.lock()
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
1283 tr = repo.transaction("evolve")
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1284 if 'unstable' == category:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1285 result = _solveunstable(ui, repo, ctx, dryrun, confirm, progresscb)
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1286 elif 'bumped' == category:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1287 result = _solvebumped(ui, repo, ctx, dryrun, confirm, progresscb)
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1288 elif 'divergent' == category:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1289 result = _solvedivergent(ui, repo, ctx, dryrun, confirm,
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1290 progresscb)
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1291 else:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1292 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
1293 tr.close()
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
1294 return result
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
1295 finally:
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
1296 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
1297
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1298 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
1299 """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
1300 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
1301 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
1302 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
1303 msg = None
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1304 hint = None
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1305
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1306 troubled = {
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1307 "unstable": repo.revs("unstable()"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1308 "divergent": repo.revs("divergent()"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1309 "bumped": repo.revs("bumped()"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1310 "all": repo.revs("troubled()"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1311 }
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1312
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1313
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1314 hintmap = {
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1315 'bumped': _("do you want to use --bumped"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1316 'bumped+divergent': _("do you want to use --bumped or --divergent"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1317 'bumped+unstable': _("do you want to use --bumped or --unstable"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1318 'divergent': _("do you want to use --divergent"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1319 'divergent+unstable': _("do you want to use --divergent"
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1320 " or --unstable"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1321 'unstable': _("do you want to use --unstable"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1322 'any+bumped': _("do you want to use --any (or --rev) and --bumped"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1323 'any+bumped+divergent': _("do you want to use --any (or --rev) and"
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1324 " --bumped or --divergent"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1325 'any+bumped+unstable': _("do you want to use --any (or --rev) and"
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1326 "--bumped or --unstable"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1327 'any+divergent': _("do you want to use --any (or --rev) and"
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1328 " --divergent"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1329 'any+divergent+unstable': _("do you want to use --any (or --rev)"
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1330 " and --divergent or --unstable"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1331 'any+unstable': _("do you want to use --any (or --rev)"
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1332 "and --unstable"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1333 }
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1334
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1335 if revopt:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1336 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
1337 if not revs:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1338 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
1339 else:
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1340 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
1341 othertroubles = []
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1342 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
1343 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
1344 othertroubles.append(cat)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1345 if othertroubles:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1346 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
1347
1422
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
1348 elif anyopt:
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1349 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
1350 othertroubles = []
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1351 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
1352 if troubled[cat]:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1353 othertroubles.append(cat)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1354 if othertroubles:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1355 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
1356
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1357 else:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1358 # 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
1359 if targetcat == 'unstable':
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1360 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
1361 else:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1362 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
1363
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1364 p1 = repo['.'].rev()
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1365 othertroubles = []
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1366 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
1367 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
1368 othertroubles.append(cat)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1369 if othertroubles:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1370 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
1371 else:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1372 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
1373 if l:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1374 hint = _("%d other %s in the repository, do you want --any "
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1375 "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
1376 else:
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1377 othertroubles = []
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1378 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
1379 if troubled[cat]:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1380 othertroubles.append(cat)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1381 if othertroubles:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1382 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
1383 else:
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1384 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
1385
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1386 assert msg is not None
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1387 ui.write_err(msg+"\n")
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1388 if hint:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1389 ui.write_err("("+hint+")\n")
1316
f11363699766 evolve: refactoring of the code displaying error when no trouble found
Laurent Charignon <lcharignon@fb.com>
parents: 1315
diff changeset
1390 return 2
f11363699766 evolve: refactoring of the code displaying error when no trouble found
Laurent Charignon <lcharignon@fb.com>
parents: 1315
diff changeset
1391 else:
f11363699766 evolve: refactoring of the code displaying error when no trouble found
Laurent Charignon <lcharignon@fb.com>
parents: 1315
diff changeset
1392 return 1
1324
739208d1ee62 evolve: extract cleanup logic in the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1323
diff changeset
1393
739208d1ee62 evolve: extract cleanup logic in the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1323
diff changeset
1394 def _cleanup(ui, repo, startnode, showprogress):
739208d1ee62 evolve: extract cleanup logic in the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1323
diff changeset
1395 if showprogress:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1396 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
1397 if repo['.'] != startnode:
bac4e0bc9f6a evolve: write a status message when the working directory changes
David Soria Parra <davidsp@fb.com>
parents: 1067
diff changeset
1398 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
1399
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1400 class MultipleSuccessorsError(RuntimeError):
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1401 """Exception raised by _singlesuccessor when multiple sucessors sets exists
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1402
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1403 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
1404 attribute to call to easily recover.
509
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
1405 """
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1406
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1407 def __init__(self, successorssets):
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1408 self.successorssets = successorssets
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1409
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1410 def _singlesuccessor(repo, p):
1369
4ed67cce8c23 evolve: properly evolve stacked unstable with --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1364
diff changeset
1411 """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
1412
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1413 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
1414
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1415 if not p.obsolete():
1369
4ed67cce8c23 evolve: properly evolve stacked unstable with --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1364
diff changeset
1416 return p.rev()
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1417 obs = repo[p]
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1418 ui = repo.ui
630
722b52c75f02 compat: adapt to upstreaming of divergent logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 622
diff changeset
1419 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
1420 # search of a parent which is not killed
1440
afe46c3b15db evolve: clarify code in _singlesuccessor
Laurent Charignon <lcharignon@fb.com>
parents: 1428
diff changeset
1421 while not newer:
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
1422 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
1423 " 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
1424 obs)
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
1425 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
1426 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
1427 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
1428 raise MultipleSuccessorsError(newer)
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1429
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1430 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
1431
1361
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
1432 def builddependencies(repo, revs):
1411
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
1433 """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
1434 (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
1435
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1436 # 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
1437 # 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
1438 # dependencies = {3: [6], 6:[]}
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1439 # 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
1440 dependencies = {}
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1441 # 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
1442 rdependencies = collections.defaultdict(set)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1443
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1444 for r in revs:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1445 dependencies[r] = set()
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1446 for p in repo[r].parents():
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1447 try:
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1448 succ = _singlesuccessor(repo, p)
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1449 except MultipleSuccessorsError as exc:
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
1450 dependencies[r] = exc.successorssets
1418
ed9a8b1ee9bd evolve: fix error in builddependencies
Laurent Charignon <lcharignon@fb.com>
parents: 1415
diff changeset
1451 continue
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1452 if succ in revs:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1453 dependencies[r].add(succ)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1454 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
1455 return dependencies, rdependencies
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
1456
1467
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1457 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
1458 """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
1459 lowest revision numbers
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1460 """
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1461 repo = repo.unfiltered()
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1462 res = set()
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1463 # 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
1464 discarded = set()
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1465 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
1466 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
1467 continue
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1468 divergent = repo[rev]
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1469 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
1470 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
1471 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
1472 discarded.update(othersrevs)
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1473 return res
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1474
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1475 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
1476 """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
1477 revs = set()
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1478 if allopt or revopt:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1479 revs = repo.revs(targetcat+'()')
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1480 if revopt:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1481 revs = scmutil.revrange(repo, revopt) & revs
1422
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
1482 elif not anyopt and targetcat == 'unstable':
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1483 revs = set(_aspiringdescendant(repo,
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1484 repo.revs('(.::) - obsolete()::')))
1467
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1485 if targetcat == 'divergent':
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
1486 # 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
1487 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
1488 elif anyopt:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1489 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
1490 elif targetcat == 'unstable':
1421
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1491 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
1492 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
1493 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
1494 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
1495 % ', '.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
1496 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
1497 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
1498 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
1499 return revs
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1500
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1501
1411
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
1502 def _orderrevs(repo, revs):
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
1503 """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
1504
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
1505 - Takes revs a list of instable revisions
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
1506
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
1507 - Returns the same revisions ordered to solve their instability from the
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
1508 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
1509 eventually.
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
1510
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
1511 This ensure the minimal number of stabilization as we can stabilize each
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
1512 revision on its final, stabilized, destination.
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
1513 """
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
1514 # 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
1515 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
1516 # Step 2: Build the ordering
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1517 # 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
1518 # 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
1519 # 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
1520 # 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
1521 # built
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1522 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
1523 if not dependencies[r]])
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1524 ordering = []
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1525 while solvablerevs:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1526 rev = solvablerevs.popleft()
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1527 for dependent in rdependencies[rev]:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1528 dependencies[dependent].remove(rev)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1529 if not dependencies[dependent]:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1530 solvablerevs.append(dependent)
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1531 del dependencies[rev]
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1532 ordering.append(rev)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1533
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1534 ordering.extend(sorted(dependencies))
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1535 return ordering
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
1536
714
3867f7b1fe6e evolve: remove duplicate alias.
Levi Bard <levi@unity3d.com>
parents: 710
diff changeset
1537 @command('^evolve|stabilize|solve',
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
1538 [('n', 'dry-run', False,
1498
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
1539 _('do not perform actions, just print what would be done')),
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1540 ('', 'confirm', False,
1498
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
1541 _('ask for confirmation before performing the action')),
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1542 ('A', 'any', False,
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1543 _('also consider troubled changesets unrelated to current working '
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1544 'directory')),
1498
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
1545 ('r', 'rev', [], _('solves troubles of these revisions')),
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
1546 ('', 'bumped', False, _('solves only bumped changesets')),
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
1547 ('', 'divergent', False, _('solves only divergent changesets')),
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
1548 ('', 'unstable', False, _('solves only unstable changesets (default)')),
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1549 ('a', 'all', False, _('evolve all troubled changesets related to the '
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1550 'current working directory and its descendants')),
1498
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
1551 ('c', 'continue', False, _('continue an interrupted evolution')),
986
c1f8ece4182d evolve: add --tool option so we don't have to use HGMERGE
Greg Ward <greg@gerg.ca>
parents: 985
diff changeset
1552 ] + mergetoolopts,
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
1553 _('[OPTIONS]...'))
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
1554 def evolve(ui, repo, **opts):
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1555 """solve troubled changesets in your repository
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1556
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1557 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
1558 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
1559 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
1560
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1561 - update working copy to a successor
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1562 - rebase an unstable changeset
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1563 - 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
1564 - fuse divergent changesets back together
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1565
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1566 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
1567 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
1568 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
1569 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
1570 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
1571 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
1572 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
1573 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
1574 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
1575
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1576 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
1577 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
1578 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
1579
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1580 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
1581 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
1582 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
1583 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
1584 request such behavior (see below).
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1585
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1586 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
1587 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
1588 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
1589 working copy parent.
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1590 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
1591 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
1592 evolving all branches.
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1593
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1594 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
1595 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
1596 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
1597 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
1598 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
1599 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
1600
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1601 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
1602 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
1603
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1604 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
1605 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
1606 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
1607 ``--rev`` and ``--any``.
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1608
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1609 ``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
1610 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
1611
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1612 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
1613 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
1614 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
1615 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
1616 (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
1617 ``--rev``, ``--all``, or ``--any``.
1528
afb0a33c4f6c evolve: rewrite command help (evolve command only)
Greg Ward <greg@gerg.ca>
parents: 1527
diff changeset
1618
269
6c6bb7a23bb5 stabilize: improve unstable selection heuristic
Patrick Mezard <patrick@mezard.eu>
parents: 268
diff changeset
1619 """
145
928f217c1701 stabilize: stabilize my topological branch only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 142
diff changeset
1620
1325
1fe3da0b4601 evolve: add --rev option to the evolve command
Laurent Charignon <lcharignon@fb.com>
parents: 1324
diff changeset
1621 # Options
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
1622 contopt = opts['continue']
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
1623 anyopt = opts['any']
704
2ec7c3673679 evolve: add --all argument.
Levi Bard <levi@unity3d.com>
parents: 703
diff changeset
1624 allopt = opts['all']
1318
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
1625 startnode = repo['.']
703
a246b02499d9 evolve: extract evolve --any implementation into a function.
Levi Bard <levi@unity3d.com>
parents: 663
diff changeset
1626 dryrunopt = opts['dry_run']
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1627 confirmopt = opts['confirm']
1325
1fe3da0b4601 evolve: add --rev option to the evolve command
Laurent Charignon <lcharignon@fb.com>
parents: 1324
diff changeset
1628 revopt = opts['rev']
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1629 troublecategories = ['bumped', 'divergent', 'unstable']
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1630 specifiedcategories = [t for t in troublecategories if opts[t]]
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1631 targetcat = 'unstable'
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1632 if 1 < len(specifiedcategories):
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1633 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
1634 raise error.Abort(msg)
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1635 elif len(specifiedcategories) == 1:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1636 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
1637 elif repo['.'].obsolete():
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1638 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
1639 {'template': shorttemplate})
1409
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
1640 # 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
1641 try:
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
1642 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
1643 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
1644 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
1645 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
1646 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
1647 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
1648 return 2
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
1649
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1650
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1651 ui.status(_('update:'))
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1652 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
1653 displayer.show(ctx)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1654
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1655 if dryrunopt:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1656 return 0
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1657 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
1658 if ctx != startnode:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1659 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
1660 return res
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1661
986
c1f8ece4182d evolve: add --tool option so we don't have to use HGMERGE
Greg Ward <greg@gerg.ca>
parents: 985
diff changeset
1662 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'evolve')
1323
603104c880f7 evolve: simplify the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1322
diff changeset
1663 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
1664
1318
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
1665 # Progress handling
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
1666 seen = 1
1323
603104c880f7 evolve: simplify the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1322
diff changeset
1667 count = allopt and len(troubled) or 1
1319
8376fe35ebda evolve: add new variable and comment
Laurent Charignon <lcharignon@fb.com>
parents: 1318
diff changeset
1668 showprogress = allopt
1318
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
1669
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
1670 def progresscb():
1325
1fe3da0b4601 evolve: add --rev option to the evolve command
Laurent Charignon <lcharignon@fb.com>
parents: 1324
diff changeset
1671 if revopt or allopt:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1672 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
1673
1319
8376fe35ebda evolve: add new variable and comment
Laurent Charignon <lcharignon@fb.com>
parents: 1318
diff changeset
1674 # Continuation handling
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
1675 if contopt:
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
1676 if anyopt:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1677 raise error.Abort('cannot specify both "--any" and "--continue"')
704
2ec7c3673679 evolve: add --all argument.
Levi Bard <levi@unity3d.com>
parents: 703
diff changeset
1678 if allopt:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1679 raise error.Abort('cannot specify both "--all" and "--continue"')
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
1680 graftcmd = commands.table['graft'][0]
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
1681 return graftcmd(ui, repo, old_obsolete=True, **{'continue': True})
1402
08ae023882f1 evolve: check for uncommited change earlier
Laurent Charignon <lcharignon@fb.com>
parents: 1398
diff changeset
1682 cmdutil.bailifchanged(repo)
08ae023882f1 evolve: check for uncommited change earlier
Laurent Charignon <lcharignon@fb.com>
parents: 1398
diff changeset
1683
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1684
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1685 if revopt and allopt:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1686 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
1687 if revopt and anyopt:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1688 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
1689
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
1690 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
1691
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1692 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
1693 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
1694
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1695 # For the progress bar to show
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1696 count = len(revs)
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1697 # Order the revisions
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1698 if targetcat == 'unstable':
1411
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
1699 revs = _orderrevs(repo, revs)
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1700 for rev in revs:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1701 progresscb()
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1702 _solveone(ui, repo, repo[rev], dryrunopt, confirmopt,
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1703 progresscb, targetcat)
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1704 seen += 1
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1705 progresscb()
1324
739208d1ee62 evolve: extract cleanup logic in the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1323
diff changeset
1706 _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
1707
1421
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1708 def _possibledestination(repo, rev):
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1709 """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
1710 tonode = repo.changelog.node
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1711 parents = repo.changelog.parentrevs
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1712 torev = repo.changelog.rev
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1713 dest = set()
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1714 tovisit = list(parents(rev))
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1715 while tovisit:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1716 r = tovisit.pop()
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1717 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
1718 if not succsets:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1719 tovisit.extend(parents(r))
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1720 else:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1721 # 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
1722 # (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
1723 # 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
1724 # multiple branches.
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1725 for ss in succsets:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1726 for n in ss:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1727 dest.add(torev(n))
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1728 return dest
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1729
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1730 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
1731 """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
1732 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
1733 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
1734 result = []
1421
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1735 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
1736 dest = _possibledestination(repo, r)
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1737 if target & dest:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
1738 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
1739 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
1740
1422
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
1741 def _aspiringdescendant(repo, revs):
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
1742 """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
1743 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
1744 target = set(revs)
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
1745 result = set(target)
1423
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1746 paths = collections.defaultdict(set)
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1747 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
1748 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
1749 paths[d].add(r)
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1750
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1751 result = set(target)
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1752 tovisit = list(revs)
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1753 while tovisit:
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1754 base = tovisit.pop()
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1755 for unstable in paths[base]:
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1756 if unstable not in result:
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1757 tovisit.append(unstable)
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
1758 result.add(unstable)
1422
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
1759 return sorted(result - target)
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
1760
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1761 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
1762 progresscb=None):
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
1763 """Stabilize a unstable changeset"""
464
d88c761f97c4 stabilize: rename "node" variable to "orig"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 463
diff changeset
1764 obs = orig.parents()[0]
1354
b4a62d6f0353 evolve: don't crash on singled out revisions
Laurent Charignon <lcharignon@fb.com>
parents: 1351
diff changeset
1765 if not obs.obsolete() and len(orig.parents()) == 2:
1157
5951969400ce evolve: fix selection of changeset to evolve from the middle of a stack (issue4434)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1153
diff changeset
1766 obs = orig.parents()[1] # second parent is obsolete ?
1354
b4a62d6f0353 evolve: don't crash on singled out revisions
Laurent Charignon <lcharignon@fb.com>
parents: 1351
diff changeset
1767
b4a62d6f0353 evolve: don't crash on singled out revisions
Laurent Charignon <lcharignon@fb.com>
parents: 1351
diff changeset
1768 if not obs.obsolete():
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1769 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
1770 return False
630
722b52c75f02 compat: adapt to upstreaming of divergent logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 622
diff changeset
1771 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
1772 # 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
1773 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
1774 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
1775 " 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
1776 obs)
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
1777 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
1778 newer = obsolete.successorssets(repo, obs.node())
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
1779 if len(newer) > 1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1780 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
1781 "destination\n") % obs
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1782 ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1783 return 2
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
1784 targets = newer[0]
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
1785 assert targets
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
1786 if len(targets) > 1:
1481
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1787 # 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
1788 targetrevs = [repo[r].rev() for r in targets]
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1789 roots = repo.revs('roots(%ld)', targetrevs)
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1790 heads = repo.revs('heads(%ld)', targetrevs)
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1791 if len(roots) > 1 or len(heads) > 1:
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1792 msg = "cannot solve split accross two branches\n"
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1793 ui.write_err(msg)
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1794 return 2
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1795 target = repo[heads.first()]
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1796 else:
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
1797 target = targets[0]
139
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
1798 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
1799 target = repo[target]
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1800 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
1801 repo.ui.write(_('move:'))
464
d88c761f97c4 stabilize: rename "node" variable to "orig"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 463
diff changeset
1802 displayer.show(orig)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
1803 repo.ui.write(_('atop:'))
146
e80a6c8ad452 stabilize: proper --quiet behavior
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 145
diff changeset
1804 displayer.show(target)
1390
03f202bed47f evolve: fix default value for --confirm
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1389
diff changeset
1805 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
1806 raise error.Abort(_('evolve aborted by user'))
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
1807 if progresscb: progresscb()
546
415540dee2bd fix missing --dest evolve output in dryrun
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 540
diff changeset
1808 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
1809 if dryrun:
146
e80a6c8ad452 stabilize: proper --quiet behavior
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 145
diff changeset
1810 repo.ui.write(todo)
139
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
1811 else:
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
1812 repo.ui.note(todo)
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
1813 if progresscb: progresscb()
1141
ca17770d2ee9 evolve: preserve branch change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1140
diff changeset
1814 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
1815 try:
1141
ca17770d2ee9 evolve: preserve branch change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1140
diff changeset
1816 relocate(repo, orig, target, keepbranch)
463
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
1817 except MergeFailure:
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
1818 repo.opener.write('graftstate', orig.hex() + '\n')
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
1819 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
1820 repo.ui.write_err(
1395
362e2c8c5677 evolve: add a hint about how to abort an evolve with conflict
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1392
diff changeset
1821 _('fix conflict and run "hg evolve --continue"'
362e2c8c5677 evolve: add a hint about how to abort an evolve with conflict
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1392
diff changeset
1822 ' 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
1823 raise
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
1824
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1825 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
1826 progresscb=None):
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
1827 """Stabilize a bumped changeset"""
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1828 repo = repo.unfiltered()
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1829 bumped = repo[bumped.rev()]
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
1830 # For now we deny bumped merge
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
1831 if len(bumped.parents()) > 1:
1496
62aa11956a40 evolve: _() should not contain %
timeless@mozdev.org
parents: 1495
diff changeset
1832 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
1833 ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1834 return 2
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
1835 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
1836 # For now we deny target merge
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1837 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
1838 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
1839 '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
1840 ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1841 return 2
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1842
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1843 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
1844 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
1845 repo.ui.write(_('recreate:'))
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
1846 displayer.show(bumped)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
1847 repo.ui.write(_('atop:'))
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1848 displayer.show(prec)
1390
03f202bed47f evolve: fix default value for --confirm
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1389
diff changeset
1849 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
1850 raise error.Abort(_('evolve aborted by user'))
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1851 if dryrun:
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
1852 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
1853 repo.ui.write(todo)
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1854 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
1855 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
1856 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
1857 return 0
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
1858 if progresscb: progresscb()
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1859 newid = tmpctx = None
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1860 tmpctx = bumped
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1861 # Basic check for common parent. Far too complicated and fragile
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1862 tr = repo.transaction('bumped-stabilize')
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
1863 bmupdate = _bookmarksupdater(repo, bumped.node(), tr)
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1864 try:
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1865 if not list(repo.set('parents(%d) and parents(%d)', bumped, prec)):
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1866 # Need to rebase the changeset at the right place
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1867 repo.ui.status(
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1868 _('rebasing to destination parent: %s\n') % prec.p1())
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1869 try:
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1870 tmpid = relocate(repo, bumped, prec.p1())
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1871 if tmpid is not None:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1872 tmpctx = repo[tmpid]
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
1873 obsolete.createmarkers(repo, [(bumped, (tmpctx,))])
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1874 except MergeFailure:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1875 repo.opener.write('graftstate', bumped.hex() + '\n')
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1876 repo.ui.write_err(_('evolution failed!\n'))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1877 repo.ui.write_err(
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1878 _('fix conflict and run "hg evolve --continue"\n'))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1879 raise
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1880 # Create the new commit context
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1881 repo.ui.status(_('computing new diff\n'))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1882 files = set()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1883 copied = copies.pathcopies(prec, bumped)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1884 precmanifest = prec.manifest()
1212
2c1b6e2ec59a merge with stable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1211
diff changeset
1885 # 3.3.2 needs a list.
2c1b6e2ec59a merge with stable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1211
diff changeset
1886 # future 3.4 don't detect the size change during iteration
2c1b6e2ec59a merge with stable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1211
diff changeset
1887 # this is fishy
1228
72a3f8d307b2 evolve: have a stable manifest content when solving bumped
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1211
diff changeset
1888 for key, val in list(bumped.manifest().iteritems()):
1211
9523c027a240 evolve: fix manifest usage to match upstream
Durham Goode <durham@fb.com>
parents: 1209
diff changeset
1889 precvalue = precmanifest.get(key, None)
9523c027a240 evolve: fix manifest usage to match upstream
Durham Goode <durham@fb.com>
parents: 1209
diff changeset
1890 if precvalue is not None:
9523c027a240 evolve: fix manifest usage to match upstream
Durham Goode <durham@fb.com>
parents: 1209
diff changeset
1891 del precmanifest[key]
9523c027a240 evolve: fix manifest usage to match upstream
Durham Goode <durham@fb.com>
parents: 1209
diff changeset
1892 if precvalue != val:
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1893 files.add(key)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1894 files.update(precmanifest) # add missing files
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1895 # commit it
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1896 if files: # something to commit!
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1897 def filectxfn(repo, ctx, path):
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1898 if path in bumped:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1899 fctx = bumped[path]
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1900 flags = fctx.flags()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1901 mctx = memfilectx(repo, fctx.path(), fctx.data(),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1902 islink='l' in flags,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1903 isexec='x' in flags,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1904 copied=copied.get(path))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1905 return mctx
1086
96b9e0c31cc1 compat: adapt to change to memctx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1085
diff changeset
1906 return None
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1907 text = 'bumped update to %s:\n\n' % prec
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1908 text += bumped.description()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1909
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1910 new = context.memctx(repo,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1911 parents=[prec.node(), node.nullid],
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1912 text=text,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1913 files=files,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1914 filectxfn=filectxfn,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1915 user=bumped.user(),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1916 date=bumped.date(),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1917 extra=bumped.extra())
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1918
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1919 newid = repo.commitctx(new)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1920 if newid is None:
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
1921 obsolete.createmarkers(repo, [(tmpctx, ())])
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1922 newid = prec.node()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1923 else:
1069
356552e55489 evolve: always use the transaction version of phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1068
diff changeset
1924 phases.retractboundary(repo, tr, bumped.phase(), [newid])
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
1925 obsolete.createmarkers(repo, [(tmpctx, (repo[newid],))],
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1926 flag=obsolete.bumpedfix)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1927 bmupdate(newid)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1928 tr.close()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1929 repo.ui.status(_('committed as %s\n') % node.short(newid))
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1930 finally:
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1931 tr.release()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
1932 # 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
1933 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
1934 repo.dirstate.setparents(newid, node.nullid)
1112
c3e23fbf7bd7 evolve: wrap setparents calls in begin/endparentchange
Siddharth Agarwal <sid0@fb.com>
parents: 1111
diff changeset
1935 repo.dirstate.endparentchange()
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
1936
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
1937 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
1938 progresscb=None):
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1939 repo = repo.unfiltered()
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
1940 divergent = repo[divergent.rev()]
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
1941 base, others = divergentdata(divergent)
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1942 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
1943 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
1944 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
1945 " into multiple ones:\n"
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1946 "|[%s]\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1947 "| This is not handled by automatic evolution yet\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1948 "| You have to fallback to manual handling with commands "
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1949 "such as:\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1950 "| - hg touch -D\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1951 "| - hg prune\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1952 "| \n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1953 "| You should contact your local evolution Guru for help.\n"
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1954 ) % (divergent, othersstr)
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1955 ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1956 return 2
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1957 other = others[0]
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1958 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
1959 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
1960 "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
1961 ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1962 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
1963 "| 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
1964 "| `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
1965 ui.write_err(hint)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1966 return 2
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
1967 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
1968 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
1969 "(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
1970 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
1971 "| 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
1972 "| 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
1973 "| 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
1974 "| this command again.\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1975 "| - 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
1976 "| - 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
1977 ) % {'d': divergent, 'o': other}
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1978 ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1979 ui.write_err(hint)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
1980 return 2
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1981
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1982 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
1983 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
1984 ui.write(_('merge:'))
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
1985 displayer.show(divergent)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
1986 ui.write(_('with: '))
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1987 displayer.show(other)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
1988 ui.write(_('base: '))
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
1989 displayer.show(base)
1498
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
1990 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
1991 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
1992 if dryrun:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
1993 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
1994 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
1995 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
1996 '%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
1997 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
1998 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
1999 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
2000 % divergent))
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
2001 return
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2002 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
2003 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
2004 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
2005 repo.ui.note(_('merging divergent changeset\n'))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2006 if progresscb: progresscb()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2007 stats = merge.update(repo,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2008 other.node(),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2009 branchmerge=True,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2010 force=False,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2011 partial=None,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2012 ancestor=base.node(),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2013 mergeancestor=True)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2014 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
2015 if stats[3]:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2016 repo.ui.status(_("use 'hg resolve' to retry unresolved file merges "
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2017 "or 'hg update -C .' to abandon\n"))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2018 if stats[3] > 0:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2019 raise error.Abort('merge conflict between several amendments '
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2020 '(this is not automated yet)',
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2021 hint="""/!\ You can try:
534
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
2022 /!\ * manual merge + resolve => new cset X
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
2023 /!\ * 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
2024 /!\ * hg revert --all -r X
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
2025 /!\ * hg ci -m "same message as the amended changeset" => new cset Y
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
2026 /!\ * hg kill -n Y W Z
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
2027 """)
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2028 if progresscb: progresscb()
1536
9afe9e0191a1 evolve: evolve --divergent failed when merge had nothing to do (issue4950)
Laurent Charignon <lcharignon@fb.com>
parents: 1532
diff changeset
2029 emtpycommitallowed = repo.ui.backupconfig('ui', 'allowemptycommit')
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2030 tr = repo.transaction('stabilize-divergent')
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2031 try:
1536
9afe9e0191a1 evolve: evolve --divergent failed when merge had nothing to do (issue4950)
Laurent Charignon <lcharignon@fb.com>
parents: 1532
diff changeset
2032 repo.ui.setconfig('ui', 'allowemptycommit', True)
1112
c3e23fbf7bd7 evolve: wrap setparents calls in begin/endparentchange
Siddharth Agarwal <sid0@fb.com>
parents: 1111
diff changeset
2033 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
2034 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
2035 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
2036 oldlen = len(repo)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2037 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
2038 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
2039 new = divergent
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2040 # no changes
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2041 else:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2042 new = repo['.']
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
2043 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
2044 phases.retractboundary(repo, tr, other.phase(), [new.node()])
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2045 tr.close()
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
2046 finally:
1536
9afe9e0191a1 evolve: evolve --divergent failed when merge had nothing to do (issue4950)
Laurent Charignon <lcharignon@fb.com>
parents: 1532
diff changeset
2047 repo.ui.restoreconfig(emtpycommitallowed)
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
2048 tr.release()
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
2049
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
2050 def divergentdata(ctx):
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
2051 """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
2052
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
2053 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
2054
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
2055 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
2056 """
1375
9e062e6598e9 evolve: search divergence within all precursors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1374
diff changeset
2057 repo = ctx._repo.unfiltered()
9e062e6598e9 evolve: search divergence within all precursors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1374
diff changeset
2058 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
2059 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
2060 # 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
2061 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
2062 if newer:
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
2063 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
2064 raise error.Abort("base of divergent changeset %s not found" % ctx,
749
f728edc7fcd1 evolve: abort on unknown divergent changeset base
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 745
diff changeset
2065 hint='this case is not yet handled')
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
2066
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
2067
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
2068
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
2069 shorttemplate = '[{rev}] {desc|firstline}\n'
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
2070
895
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
2071 @command('^previous',
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
2072 [('B', 'move-bookmark', False,
1497
cebe06c16837 evolve: do not capitalize description of next/previous
timeless@mozdev.org
parents: 1496
diff changeset
2073 _('move active bookmark after update')),
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
2074 ('', 'merge', False, _('bring uncommitted change along')),
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2075 ('n', 'dry-run', False,
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2076 _('do not perform actions, just print what would be done'))],
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
2077 '[OPTION]...')
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
2078 def cmdprevious(ui, repo, **opts):
724
fa049c1d9445 evolve: fix typo
André Sintzoff <andre.sintzoff@gmail.com>
parents: 723
diff changeset
2079 """update to parent and display summary lines"""
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
2080 wkctx = repo[None]
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
2081 wparents = wkctx.parents()
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
2082 dryrunopt = opts['dry_run']
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
2083 if len(wparents) != 1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2084 raise error.Abort('merge in progress')
1427
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
2085 if not opts['merge']:
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
2086 try:
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
2087 cmdutil.bailifchanged(repo)
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2088 except error.Abort as exc:
1427
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
2089 exc.hint = _('do you want --merge?')
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
2090 raise
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
2091
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
2092 parents = wparents[0].parents()
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
2093 displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
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
2094 if len(parents) == 1:
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
2095 p = parents[0]
1330
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
2096 bm = bmactive(repo)
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
2097 shouldmove = opts.get('move_bookmark') and bm is not None
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
2098 if dryrunopt:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2099 ui.write(('hg update %s;\n' % p.rev()))
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
2100 if shouldmove:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2101 ui.write(('hg bookmark %s -r %s;\n' % (bm, p.rev())))
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
2102 else:
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
2103 ret = hg.update(repo, p.rev())
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
2104 if not ret:
1556
4f008b8acda7 previous: replace call to bookmarks.write by bookmarks.recordchange
Laurent Charignon <lcharignon@fb.com>
parents: 1555
diff changeset
2105 tr = lock = None
1502
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
2106 wlock = repo.wlock()
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
2107 try:
1556
4f008b8acda7 previous: replace call to bookmarks.write by bookmarks.recordchange
Laurent Charignon <lcharignon@fb.com>
parents: 1555
diff changeset
2108 lock = repo.lock()
4f008b8acda7 previous: replace call to bookmarks.write by bookmarks.recordchange
Laurent Charignon <lcharignon@fb.com>
parents: 1555
diff changeset
2109 tr = repo.transaction('previous')
1502
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
2110 if shouldmove:
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
2111 repo._bookmarks[bm] = p.node()
1556
4f008b8acda7 previous: replace call to bookmarks.write by bookmarks.recordchange
Laurent Charignon <lcharignon@fb.com>
parents: 1555
diff changeset
2112 repo._bookmarks.recordchange(tr)
1502
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
2113 else:
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
2114 bmdeactivate(repo)
1556
4f008b8acda7 previous: replace call to bookmarks.write by bookmarks.recordchange
Laurent Charignon <lcharignon@fb.com>
parents: 1555
diff changeset
2115 tr.close()
1502
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
2116 finally:
1556
4f008b8acda7 previous: replace call to bookmarks.write by bookmarks.recordchange
Laurent Charignon <lcharignon@fb.com>
parents: 1555
diff changeset
2117 lockmod.release(tr, lock, 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
2118 displayer.show(p)
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
2119 return 0
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
2120 else:
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
2121 for p in parents:
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
2122 displayer.show(p)
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
2123 ui.warn(_('multiple parents, explicitly update to one\n'))
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
2124 return 1
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
2125
895
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
2126 @command('^next',
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
2127 [('B', 'move-bookmark', False,
1497
cebe06c16837 evolve: do not capitalize description of next/previous
timeless@mozdev.org
parents: 1496
diff changeset
2128 _('move active bookmark after update')),
1499
c936a243346a evolve: spelling uncommitted
timeless@mozdev.org
parents: 1498
diff changeset
2129 ('', 'merge', False, _('bring uncommitted change along')),
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
2130 ('', 'evolve', False, _('evolve the next changeset if necessary')),
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2131 ('n', 'dry-run', False,
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2132 _('do not perform actions, just print what would be done'))],
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2133 '[OPTION]...')
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
2134 def cmdnext(ui, repo, **opts):
1449
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2135 """update to next child
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2136
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2137 You can use the --evolve flag to get unstable children evolved on demand.
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2138
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2139 The summary line of the destination is displayed for clarity"""
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
2140 wkctx = repo[None]
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
2141 wparents = wkctx.parents()
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
2142 dryrunopt = opts['dry_run']
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
2143 if len(wparents) != 1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2144 raise error.Abort('merge in progress')
1427
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
2145 if not opts['merge']:
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
2146 try:
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
2147 cmdutil.bailifchanged(repo)
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2148 except error.Abort as exc:
1427
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
2149 exc.hint = _('do you want --merge?')
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
2150 raise
87
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 82
diff changeset
2151
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
2152 children = [ctx for ctx in wparents[0].children() if not ctx.obsolete()]
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
2153 displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
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
2154 if len(children) == 1:
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
2155 c = children[0]
1330
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
2156 bm = bmactive(repo)
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
2157 shouldmove = opts.get('move_bookmark') and bm is not None
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
2158 if dryrunopt:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2159 ui.write(('hg update %s;\n' % c.rev()))
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
2160 if shouldmove:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2161 ui.write(('hg bookmark %s -r %s;\n' % (bm, c.rev())))
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
2162 else:
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
2163 ret = hg.update(repo, c.rev())
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
2164 if not ret:
1557
e72f83f09bdc next: replace call to bookmarks.write by bookmarks.recordchange
Laurent Charignon <lcharignon@fb.com>
parents: 1556
diff changeset
2165 lock = tr = None
1502
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
2166 wlock = repo.wlock()
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
2167 try:
1557
e72f83f09bdc next: replace call to bookmarks.write by bookmarks.recordchange
Laurent Charignon <lcharignon@fb.com>
parents: 1556
diff changeset
2168 lock = repo.lock()
e72f83f09bdc next: replace call to bookmarks.write by bookmarks.recordchange
Laurent Charignon <lcharignon@fb.com>
parents: 1556
diff changeset
2169 tr = repo.transaction('next')
1502
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
2170 if shouldmove:
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
2171 repo._bookmarks[bm] = c.node()
1557
e72f83f09bdc next: replace call to bookmarks.write by bookmarks.recordchange
Laurent Charignon <lcharignon@fb.com>
parents: 1556
diff changeset
2172 repo._bookmarks.recordchange(tr)
1502
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
2173 else:
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
2174 bmdeactivate(repo)
1557
e72f83f09bdc next: replace call to bookmarks.write by bookmarks.recordchange
Laurent Charignon <lcharignon@fb.com>
parents: 1556
diff changeset
2175 tr.close()
1502
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
2176 finally:
1557
e72f83f09bdc next: replace call to bookmarks.write by bookmarks.recordchange
Laurent Charignon <lcharignon@fb.com>
parents: 1556
diff changeset
2177 lockmod.release(tr, lock, 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
2178 displayer.show(c)
1446
a73d1ee48003 next: refactor the command code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1443
diff changeset
2179 result = 0
a73d1ee48003 next: refactor the command code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1443
diff changeset
2180 elif children:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2181 ui.warn(_("ambigious next changeset:\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
2182 for c in children:
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
2183 displayer.show(c)
1447
09206bdc2db4 next: reword error output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1446
diff changeset
2184 ui.warn(_('explicitly update to one of them\n'))
1446
a73d1ee48003 next: refactor the command code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1443
diff changeset
2185 result = 1
a73d1ee48003 next: refactor the command code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1443
diff changeset
2186 else:
1448
3c113c097339 next: print some message when on a head with some aspiring children
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1447
diff changeset
2187 aspchildren = _aspiringchildren(repo, [repo['.'].rev()])
1487
ee5391999f2d next: properly report no children when --evolve is used
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1469
diff changeset
2188 if not opts['evolve'] or not aspchildren:
1449
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2189 ui.warn(_('no children\n'))
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2190 if aspchildren:
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2191 msg = _('(%i unstable changesets to be evolved here, '
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2192 'do you want --evolve?)\n')
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2193 ui.warn(msg % len(aspchildren))
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2194 result = 1
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2195 elif 1 < len(aspchildren):
1498
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
2196 ui.warn(_("ambigious next (unstable) changeset:\n"))
1449
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2197 for c in aspchildren:
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2198 displayer.show(repo[c])
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2199 ui.warn(_('(run "hg evolve --rev REV" on one of them)\n'))
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2200 return 1
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2201 else:
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2202 cmdutil.bailifchanged(repo)
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
2203 result = _solveone(ui, repo, repo[aspchildren[0]], dryrunopt,
1449
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2204 False, lambda:None, category='unstable')
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2205 if not result:
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2206 ui.status(_('working directory now at %s\n') % repo['.'])
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2207 return result
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
2208 return 1
1446
a73d1ee48003 next: refactor the command code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1443
diff changeset
2209 return result
87
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 82
diff changeset
2210
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2211 def _reachablefrombookmark(repo, revs, bookmark):
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2212 """filter revisions and bookmarks reachable from the given bookmark
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2213 yoinked from mq.py
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2214 """
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2215 repomarks = repo._bookmarks
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2216 if bookmark not in repomarks:
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2217 raise error.Abort(_("bookmark '%s' not found") % bookmark)
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2218
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2219 # 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
2220 # 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
2221 # anything. revsets cannot detect that case.
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2222 uniquebm = True
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2223 for m, n in repomarks.iteritems():
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2224 if m != bookmark and n == repo[bookmark].node():
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2225 uniquebm = False
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2226 break
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2227 if uniquebm:
1513
4f7e0e0318a5 prune: reuse revset from repair instead of copy-pasting code
Ryan McElroy <rmcelroy@fb.com>
parents: 1512
diff changeset
2228 if util.safehasattr(repair, 'stripbmrevset'):
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2229 rsrevs = repair.stripbmrevset(repo, bookmark)
1513
4f7e0e0318a5 prune: reuse revset from repair instead of copy-pasting code
Ryan McElroy <rmcelroy@fb.com>
parents: 1512
diff changeset
2230 else:
4f7e0e0318a5 prune: reuse revset from repair instead of copy-pasting code
Ryan McElroy <rmcelroy@fb.com>
parents: 1512
diff changeset
2231 rsrevs = repo.revs("ancestors(bookmark(%s)) - "
4f7e0e0318a5 prune: reuse revset from repair instead of copy-pasting code
Ryan McElroy <rmcelroy@fb.com>
parents: 1512
diff changeset
2232 "ancestors(head() and not bookmark(%s)) - "
4f7e0e0318a5 prune: reuse revset from repair instead of copy-pasting code
Ryan McElroy <rmcelroy@fb.com>
parents: 1512
diff changeset
2233 "ancestors(bookmark() and not bookmark(%s)) - "
4f7e0e0318a5 prune: reuse revset from repair instead of copy-pasting code
Ryan McElroy <rmcelroy@fb.com>
parents: 1512
diff changeset
2234 "obsolete()",
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2235 bookmark, bookmark, bookmark)
1135
db16c4ad15d0 fixup previous changesets (after forgot to amend).
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1134
diff changeset
2236 revs = set(revs)
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2237 revs.update(set(rsrevs))
1135
db16c4ad15d0 fixup previous changesets (after forgot to amend).
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1134
diff changeset
2238 revs = sorted(revs)
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2239 return repomarks, revs
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2240
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2241 def _deletebookmark(repo, repomarks, bookmark):
1501
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
2242 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
2243 try:
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
2244 wlock = repo.wlock()
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
2245 lock = repo.lock()
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
2246 tr = repo.transaction('prune')
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2247 del repomarks[bookmark]
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2248 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
2249 tr.close()
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2250 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
2251 finally:
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
2252 lockmod.release(tr, lock, wlock)
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2253
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2254
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2255
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2256 def _getmetadata(**opts):
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2257 metadata = {}
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2258 date = opts.get('date')
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2259 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
2260 if date:
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2261 metadata['date'] = '%i %i' % util.parsedate(date)
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2262 if user:
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2263 metadata['user'] = user
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2264 return metadata
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2265
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2266
365
9f6a77ec66cb evolve: switch the official name for "kill" to prune
Pierre-Yves.David@ens-lyon.org
parents: 362
diff changeset
2267 @command('^prune|obsolete|kill',
682
6cbb52a8401b prune: rename --new to --succ
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 681
diff changeset
2268 [('n', 'new', [], _("successor changeset (DEPRECATED)")),
6cbb52a8401b prune: rename --new to --succ
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 681
diff changeset
2269 ('s', 'succ', [], _("successor changeset")),
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2270 ('r', 'rev', [], _("revisions to prune")),
1221
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2271 ('k', 'keep', None, _("does not modify working copy during prune")),
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
2272 ('', 'biject', False, _("do a 1-1 map between rev and successor ranges")),
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2273 ('', 'fold', False,
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2274 _("record a fold (multiple precursors, one successors)")),
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2275 ('', 'split', False,
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2276 _("record a split (on precursor, multiple successors)")),
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2277 ('B', 'bookmark', '', _("remove revs only reachable from given"
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2278 " bookmark"))] + metadataopts,
644
8e41d5b78dff support -r option in prune, add a test for this
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 636
diff changeset
2279 _('[OPTION] [-r] REV...'))
690
929d7617a13d prune: more command switch idea
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 689
diff changeset
2280 # -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
2281 def cmdprune(ui, repo, *revs, **opts):
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
2282 """hide changesets by marking them obsolete
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
2283
689
d48aae167b9d prune: documentation update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 688
diff changeset
2284 Obsolete changesets becomes invisible to all commands.
d48aae167b9d prune: documentation update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 688
diff changeset
2285
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
2286 Unpruned descendants of pruned changesets becomes "unstable". Use the
689
d48aae167b9d prune: documentation update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 688
diff changeset
2287 :hg:`evolve` to handle such situation.
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
2288
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
2289 When the working directory parent is pruned, the repository is updated to a
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
2290 non-obsolete parent.
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
2291
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
2292 You can use the ``--succ`` option to inform mercurial that a newer version
689
d48aae167b9d prune: documentation update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 688
diff changeset
2293 of the pruned changeset exists.
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
2294
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
2295 You can use the ``--biject`` option to specify a 1-1 (bijection) between
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
2296 revisions to prune and successor changesets. This option may be removed in
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
2297 a future release (with the functionality absorbed automatically).
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
2298
1471
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2299 If you specify multiple revisions in --succ, you are recording a "split"
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2300 and have to acknowledge it by usng --split. The same logic apply when you
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2301 prune multiple changesets with a single successors, this will record a
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2302 "fold" requires a --fold flag.
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2303 """
1134
7173c70ab2c3 prune: stop reinjecting all selected revisions back into the revrange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1132
diff changeset
2304 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
2305 succs = opts['new'] + opts['succ']
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2306 bookmark = opts.get('bookmark')
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
2307 metadata = _getmetadata(**opts)
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
2308 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
2309 fold = opts.get('fold')
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2310 split = opts.get('split')
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2311
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2312 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
2313 if 1 < len(options):
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2314 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
2315
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2316 if bookmark:
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2317 repomarks, revs = _reachablefrombookmark(repo, revs, bookmark)
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2318 if not revs:
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2319 # no revisions to prune - delete bookmark immediately
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2320 _deletebookmark(repo, repomarks, bookmark)
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2321
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2322 if not revs:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2323 raise error.Abort(_('nothing to prune'))
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2324
1295
1ac05eef72ca prune: prune fix transaction pattern
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1294
diff changeset
2325 wlock = lock = tr = None
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
2326 try:
1019
0c733dab0036 prune: lock inside the try
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1018
diff changeset
2327 wlock = repo.wlock()
444
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
2328 lock = repo.lock()
1294
d1c29db2e055 prune: fix pruning w/ bookmarks and inhibit
Durham Goode <durham@fb.com>
parents: 1283
diff changeset
2329 tr = repo.transaction('prune')
691
6e63b4185a5c prune: update inline documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 690
diff changeset
2330 # defines pruned changesets
684
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
2331 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
2332 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
2333 for p in revs:
684
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
2334 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
2335 if not cp.mutable():
927
154510dc4318 evolve: fix grammar in a comment
Greg Ward <greg@gerg.ca>
parents: 925
diff changeset
2336 # 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
2337 raise error.Abort('cannot prune immutable changeset: %s' % cp,
687
6c1fbef2952e prune: test and improve message of immutable aborting.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 685
diff changeset
2338 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
2339 precs.append(cp)
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
2340 if not precs:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2341 raise error.Abort('nothing to prune')
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
2342
1397
35f2f54b557c evolve: make prune respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1396
diff changeset
2343 if not obsolete.isenabled(repo, obsolete.allowunstableopt):
1415
aaccca501ae0 evolve: drop len comparison in prune and fold
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1414
diff changeset
2344 if repo.revs("(%ld::) - %ld", revs, revs):
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2345 raise error.Abort(_("cannot prune in the middle of a stack"))
1397
35f2f54b557c evolve: make prune respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1396
diff changeset
2346
691
6e63b4185a5c prune: update inline documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 690
diff changeset
2347 # defines successors changesets
1135
db16c4ad15d0 fixup previous changesets (after forgot to amend).
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1134
diff changeset
2348 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
2349 sucs.sort()
db16c4ad15d0 fixup previous changesets (after forgot to amend).
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1134
diff changeset
2350 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
2351 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
2352 msg = "Can't use multiple successors for multiple precursors"
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2353 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
2354 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
2355 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
2356 % (len(sucs), len(precs))
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2357 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
2358 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
2359 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
2360 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
2361 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
2362 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
2363 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
2364 elif biject:
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
2365 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
2366 else:
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
2367 relations = [(p, sucs) for p in precs]
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
2368
683
6d24bd455f79 simplify locking in prune
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 682
diff changeset
2369 wdp = repo['.']
931
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
2370
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
2371 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
2372 # '.' 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
2373 newnode = sucs[0]
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
2374 else:
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
2375 # 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
2376 newnode = wdp
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
2377
1239
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
2378 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
2379 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
2380
1239
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
2381
683
6d24bd455f79 simplify locking in prune
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 682
diff changeset
2382 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
2383 if opts.get('keep', False):
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2384 # 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
2385 # 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
2386 # common at some point.
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2387
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2388 # 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
2389 # 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
2390 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
2391 changedfiles = []
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2392 for rev in descendantrevs:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2393 # 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
2394 # changed
1221
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2395 changedfiles.extend(repo[rev].files())
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2396
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2397 # 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
2398 dirstate = repo.dirstate
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2399 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
2400 changedfiles.extend(dirchanges)
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2401 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
2402 changedfiles)
1515
9729fdcc1fab prune: have dirstate collaborate with transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1514
diff changeset
2403 writedirstate(dirstate, tr)
1221
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2404 else:
1344
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
2405 bookactive = bmactive(repo)
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
2406 # 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
2407 # 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
2408 # after
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
2409 movebookmark = bookactive and not bookmark
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
2410 if movebookmark:
1391
35518d26b549 merge with stable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1388 1390
diff changeset
2411 bmdeactivate(repo)
1344
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
2412 repo._bookmarks[bookactive] = newnode.node()
1555
0ff262537f98 prune: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1554
diff changeset
2413 repo._bookmarks.recordchange(tr)
1221
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2414 commands.update(ui, repo, newnode.rev())
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
2415 ui.status(_('working directory now at %s\n') % newnode)
1344
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
2416 if movebookmark:
1391
35518d26b549 merge with stable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1388 1390
diff changeset
2417 bmactivate(repo, bookactive)
1342
16017e1bb2a1 prune: with active bookmark should stay active
Laurent Charignon <lcharignon@fb.com>
parents: 1340
diff changeset
2418
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2419 # update bookmarks
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
2420 if bookmark:
1561
dbf1532ee868 evolve: renaming local variables
Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com>
parents: 1558
diff changeset
2421 _deletebookmark(repo, repomarks, bookmark)
1239
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
2422
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
2423 # create markers
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
2424 obsolete.createmarkers(repo, relations, metadata=metadata)
1468
bc6cf6cc06fd evolve: remove trailing spaces
André Sintzoff <andre.sintzoff@gmail.com>
parents: 1467
diff changeset
2425
1239
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
2426 # informs that changeset have been pruned
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
2427 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
2428
693
d3c1fe0035d1 prune: handle bookmark
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 691
diff changeset
2429 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
2430 # used to be:
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2431 #
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2432 # 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
2433 # if ldest:
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2434 # c = ldest[0]
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2435 #
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2436 # 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
2437 # 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
2438 for dest in ctx.ancestors():
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2439 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
2440 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
2441 updatebookmarks(dest.node())
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
2442 break
1294
d1c29db2e055 prune: fix pruning w/ bookmarks and inhibit
Durham Goode <durham@fb.com>
parents: 1283
diff changeset
2443
d1c29db2e055 prune: fix pruning w/ bookmarks and inhibit
Durham Goode <durham@fb.com>
parents: 1283
diff changeset
2444 tr.close()
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
2445 finally:
1295
1ac05eef72ca prune: prune fix transaction pattern
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1294
diff changeset
2446 lockmod.release(tr, lock, wlock)
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
2447
673
761b5b266985 evolve: removes amend from the list of advertised function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 672
diff changeset
2448 @command('amend|refresh',
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2449 [('A', 'addremove', None,
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2450 _('mark new/missing files as added/removed before committing')),
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
2451 ('e', 'edit', False, _('invoke editor on commit messages')),
742
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
2452 ('', 'close-branch', None,
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
2453 _('mark a branch as closed, hiding it from the branch list')),
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
2454 ('s', 'secret', None, _('use the secret phase for committing')),
1296
23819e1d61fd evolve: add -i flag to amend command
Laurent Charignon <lcharignon@fb.com>
parents: 1281
diff changeset
2455 ] + walkopts + commitopts + commitopts2 + commitopts3 + interactiveopt,
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2456 _('[OPTION]... [FILE]...'))
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2457 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
2458 """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
2459
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2460 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
2461 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
2462
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2463 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
2464
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2465 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
2466
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2467 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
2468 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
2469 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
2470 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
2471 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
2472
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
2473 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
2474 """
742
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
2475 opts = opts.copy()
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
2476 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
2477 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
2478 opts['amend'] = True
1140
b7d85cd8ec7b amend: allow the --logfile argument to work properly
Matt Harbison <matt_harbison@yahoo.com>
parents: 1137
diff changeset
2479 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
2480 opts['message'] = repo['.'].description()
985
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
2481 _resolveoptions(ui, opts)
742
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
2482 _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
2483 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
2484
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2485
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2486 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
2487 touched = set()
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2488 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
2489 touched.update(files)
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2490 return touched
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2491
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2492 def _commitfiltered(repo, ctx, match, target=None):
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2493 """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
2494 node identifier, or None if nothing changed.
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2495 """
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2496 base = ctx.p1()
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2497 if target is None:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2498 target = base
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2499 # ctx
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2500 initialfiles = _touchedbetween(repo, base, ctx)
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2501 if base == target:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2502 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
2503 newcontent = set()
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2504 else:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2505 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
2506 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
2507 # The commit touchs all existing files
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2508 # + 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
2509 # - 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
2510 files = (initialfiles - affected) | newcontent
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2511 if not newcontent and files == initialfiles:
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2512 return None
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2513
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2514 # Filter copies
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2515 copied = copies.pathcopies(target, ctx)
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2516 copied = dict((src, dst) for src, dst in copied.iteritems()
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2517 if dst in files)
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2518 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
2519 if path in redirect:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2520 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
2521 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
2522 return None
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2523 fctx = contentctx[path]
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2524 flags = fctx.flags()
955
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
2525 mctx = memfilectx(repo, fctx.path(), fctx.data(),
954
ef155e3ead8f evolve: abstract access to context.memfilectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 953
diff changeset
2526 islink='l' in flags,
ef155e3ead8f evolve: abstract access to context.memfilectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 953
diff changeset
2527 isexec='x' in flags,
ef155e3ead8f evolve: abstract access to context.memfilectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 953
diff changeset
2528 copied=copied.get(path))
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2529 return mctx
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2530
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2531 new = context.memctx(repo,
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2532 parents=[base.node(), node.nullid],
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2533 text=ctx.description(),
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2534 files=files,
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2535 filectxfn=filectxfn,
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2536 user=ctx.user(),
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2537 date=ctx.date(),
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2538 extra=ctx.extra())
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2539 # commitctx always create a new revision, no need to check
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2540 newid = repo.commitctx(new)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2541 return newid
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2542
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2543 def _uncommitdirstate(repo, oldctx, match):
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2544 """Fix the dirstate after switching the working directory from
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2545 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
2546 match.
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2547 """
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2548 ctx = repo['.']
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2549 ds = repo.dirstate
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2550 copies = dict(ds.copies())
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2551 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
2552 for f in m:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2553 if ds[f] == 'r':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2554 # modified + removed -> removed
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2555 continue
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2556 ds.normallookup(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2557
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2558 for f in a:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2559 if ds[f] == 'r':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2560 # added + removed -> unknown
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2561 ds.drop(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2562 elif ds[f] != 'a':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2563 ds.add(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2564
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2565 for f in r:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2566 if ds[f] == 'a':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2567 # removed + added -> normal
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2568 ds.normallookup(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2569 elif ds[f] != 'r':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2570 ds.remove(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2571
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2572 # Merge old parent and old working dir copies
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2573 oldcopies = {}
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2574 for f in (m + a):
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2575 src = oldctx[f].renamed()
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2576 if src:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2577 oldcopies[f] = src[0]
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2578 oldcopies.update(copies)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2579 copies = dict((dst, oldcopies.get(src, src))
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2580 for dst, src in oldcopies.iteritems())
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2581 # Adjust the dirstate copies
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2582 for dst, src in copies.iteritems():
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2583 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
2584 src = None
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2585 ds.copy(src, dst)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2586
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2587 @command('^uncommit',
314
ebd286f06879 uncommit: add --all option
Patrick Mezard <patrick@mezard.eu>
parents: 313
diff changeset
2588 [('a', 'all', None, _('uncommit all changes when no arguments given')),
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2589 ('r', 'rev', '', _('revert commit content to REV instead')),
314
ebd286f06879 uncommit: add --all option
Patrick Mezard <patrick@mezard.eu>
parents: 313
diff changeset
2590 ] + commands.walkopts,
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2591 _('[OPTION]... [NAME]'))
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2592 def uncommit(ui, repo, *pats, **opts):
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2593 """move changes from parent revision to working directory
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2594
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
2595 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
2596 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
2597 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
2598 revision, and obsoletes the previous one.
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2599
867
6a67606e1c34 evolve: fix typos in uncommit docstring
André Sintzoff <andre.sintzoff@gmail.com>
parents: 858
diff changeset
2600 The --include option specifies patterns to uncommit.
6a67606e1c34 evolve: fix typos in uncommit docstring
André Sintzoff <andre.sintzoff@gmail.com>
parents: 858
diff changeset
2601 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
2602
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2603 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
2604 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
2605 directory.
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2606
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2607 Return 0 if changed files are uncommitted.
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2608 """
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2609
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
2610 wlock = lock = tr = None
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2611 try:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2612 wlock = repo.wlock()
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2613 lock = repo.lock()
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2614 wctx = repo[None]
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2615 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
2616 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
2617 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
2618 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
2619 old = repo['.']
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2620 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
2621 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
2622 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
2623 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
2624 oldphase = old.phase()
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
2625
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2626
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2627 rev = None
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2628 if opts.get('rev'):
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
2629 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
2630 ctx = repo[None]
160fd06312fc uncommit: abort when rev specifies the current changeset
Nathan Goldbaum <ngoldbau@ucsc.edu>
parents: 1141
diff changeset
2631 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
2632 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
2633
1364
f00d91365ab9 evolve: make uncommit respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1361
diff changeset
2634 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
2635 disallowunstable = not obsolete.isenabled(repo,
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2636 obsolete.allowunstableopt)
1364
f00d91365ab9 evolve: make uncommit respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1361
diff changeset
2637 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
2638 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
2639
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2640 # Recommit the filtered changeset
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
2641 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
2642 updatebookmarks = _bookmarksupdater(repo, old.node(), tr)
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2643 newid = None
1351
69e5de3e6129 evolve: small refactoring of the uncommit function
Laurent Charignon <lcharignon@fb.com>
parents: 1350
diff changeset
2644 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
2645 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
2646 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
2647 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
2648 if newid is None:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2649 raise error.Abort(_('nothing to uncommit'),
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2650 hint=_("use --all to uncommit all files"))
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2651 # Move local changes on filtered changeset
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
2652 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
2653 phases.retractboundary(repo, tr, oldphase, [newid])
1112
c3e23fbf7bd7 evolve: wrap setparents calls in begin/endparentchange
Siddharth Agarwal <sid0@fb.com>
parents: 1111
diff changeset
2654 repo.dirstate.beginparentchange()
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2655 repo.dirstate.setparents(newid, node.nullid)
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2656 _uncommitdirstate(repo, old, match)
1112
c3e23fbf7bd7 evolve: wrap setparents calls in begin/endparentchange
Siddharth Agarwal <sid0@fb.com>
parents: 1111
diff changeset
2657 repo.dirstate.endparentchange()
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2658 updatebookmarks(newid)
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2659 if not repo[newid].files():
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2660 ui.warn(_("new changeset is empty\n"))
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
2661 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
2662 tr.close()
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2663 finally:
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
2664 lockmod.release(tr, lock, wlock)
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
2665
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
2666 @eh.wrapcommand('commit')
116
64ca29eef349 Add a -o option to commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 113
diff changeset
2667 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
2668 tr = None
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
2669 if kwargs.get('amend', False):
1255
a2d4901e211e commit: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1253
diff changeset
2670 wlock = lock = None
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
2671 else:
1255
a2d4901e211e commit: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1253
diff changeset
2672 wlock = repo.wlock()
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
2673 lock = repo.lock()
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2674 try:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2675 obsoleted = kwargs.get('obsolete', [])
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2676 if obsoleted:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2677 obsoleted = repo.set('%lr', obsoleted)
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2678 result = orig(ui, repo, *arg, **kwargs)
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2679 if not result: # commit successed
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2680 new = repo['-1']
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2681 oldbookmarks = []
444
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
2682 markers = []
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2683 for old in obsoleted:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2684 oldbookmarks.extend(repo.nodebookmarks(old.node()))
444
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
2685 markers.append((old, (new,)))
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
2686 if markers:
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
2687 obsolete.createmarkers(repo, markers)
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2688 for book in oldbookmarks:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2689 repo._bookmarks[book] = new.node()
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2690 if oldbookmarks:
1558
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2691 if not wlock:
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2692 wlock = repo.wlock()
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2693 if not lock:
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2694 lock = repo.lock()
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2695 tr = repo.transaction('commit')
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2696 repo._bookmarks.recordchange(tr)
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2697 tr.close()
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2698 return result
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
2699 finally:
1558
4706475e0c5d commitwrapper: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1557
diff changeset
2700 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
2701
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2702 @command('^split',
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2703 [('r', 'rev', [], _("revision to fold")),
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2704 ] + commitopts + commitopts2,
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2705 _('hg split [OPTION]... [-r] REV'))
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2706 def cmdsplit(ui, repo, *revs, **opts):
1532
48547b4c77de split: drop the experimental flag
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1531
diff changeset
2707 """Split the current commit using interactive selection
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2708
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2709 By default, split the current revision by prompting for all its hunk to be
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2710 redistributed into new changesets.
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2711
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2712 Use --rev for splitting a given changeset instead.
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2713 """
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2714 tr = wlock = lock = None
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2715 newcommits = []
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2716
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2717 revopt = opts.get('rev')
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2718 if revopt:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2719 revs = scmutil.revrange(repo, revopt)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2720 if len(revs) != 1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2721 raise error.Abort(_("you can only specify one revision to split"))
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2722 else:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2723 rev = list(revs)[0]
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2724 else:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2725 rev = '.'
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2726
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2727 try:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2728 wlock = repo.wlock()
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2729 lock = repo.lock()
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2730 cmdutil.bailifchanged(repo)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2731 tr = repo.transaction('split')
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2732 ctx = repo[rev]
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2733 r = ctx.rev()
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2734 disallowunstable = not obsolete.isenabled(repo,
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2735 obsolete.allowunstableopt)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2736 if disallowunstable:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2737 # XXX We should check head revs
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2738 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
2739 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
2740
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2741 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
2742 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
2743 prev = ctx.p1()
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
2744 bmupdate = _bookmarksupdater(repo, ctx.node(), tr)
1485
1ba64be11bf8 split: handle bookmarks instead of leaving them on precursor
Laurent Charignon <lcharignon@fb.com>
parents: 1484
diff changeset
2745 bookactive = bmactive(repo)
1ba64be11bf8 split: handle bookmarks instead of leaving them on precursor
Laurent Charignon <lcharignon@fb.com>
parents: 1484
diff changeset
2746 if bookactive is not None:
1ba64be11bf8 split: handle bookmarks instead of leaving them on precursor
Laurent Charignon <lcharignon@fb.com>
parents: 1484
diff changeset
2747 repo.ui.status(_("(leaving bookmark %s)\n") % bmactive(repo))
1ba64be11bf8 split: handle bookmarks instead of leaving them on precursor
Laurent Charignon <lcharignon@fb.com>
parents: 1484
diff changeset
2748 bmdeactivate(repo)
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2749 hg.update(repo, prev)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2750
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2751 commands.revert(ui, repo, rev=r, all=True)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2752 def haschanges():
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2753 modified, added, removed, deleted = repo.status()[:4]
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2754 return modified or added or removed or deleted
1531
47f48af730ce split: preserve original changesets description
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1528
diff changeset
2755 msg = 'HG: Please, edit the original changeset description.\n\n'
47f48af730ce split: preserve original changesets description
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1528
diff changeset
2756 msg += ctx.description()
47f48af730ce split: preserve original changesets description
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1528
diff changeset
2757 opts['message'] = msg
47f48af730ce split: preserve original changesets description
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1528
diff changeset
2758 opts['edit'] = True
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2759 while haschanges():
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2760 pats = ()
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2761 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
2762 cmdutil.recordfilter, *pats, **opts)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2763 # 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
2764 # 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
2765 newcommits.append(repo['.'])
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2766 if haschanges():
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2767 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
2768 commands.commit(ui, repo, **opts)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2769 newcommits.append(repo['.'])
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2770 break
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2771 else:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2772 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
2773
1485
1ba64be11bf8 split: handle bookmarks instead of leaving them on precursor
Laurent Charignon <lcharignon@fb.com>
parents: 1484
diff changeset
2774 tip = repo[newcommits[-1]]
1ba64be11bf8 split: handle bookmarks instead of leaving them on precursor
Laurent Charignon <lcharignon@fb.com>
parents: 1484
diff changeset
2775 bmupdate(tip.node())
1ba64be11bf8 split: handle bookmarks instead of leaving them on precursor
Laurent Charignon <lcharignon@fb.com>
parents: 1484
diff changeset
2776 if bookactive is not None:
1ba64be11bf8 split: handle bookmarks instead of leaving them on precursor
Laurent Charignon <lcharignon@fb.com>
parents: 1484
diff changeset
2777 bmactivate(repo, bookactive)
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2778 obsolete.createmarkers(repo, [(repo[r], newcommits)])
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2779 tr.close()
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2780 finally:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2781 lockmod.release(tr, lock, wlock)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2782
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
2783
1220
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2784 @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
2785 ('', 'bundle', None, _("delete the commit entirely and move it to a "
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2786 "backup bundle")),
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2787 ])
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2788 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
2789 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
2790 kwargs.get('bundle', False)):
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2791 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
2792
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2793 if kwargs.get('force'):
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2794 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
2795 "enabled\n"))
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2796 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
2797 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
2798 "evolve enabled\n"))
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2799
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2800 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
2801 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
2802 revs = repo.revs("(%ld)::", revs)
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2803 kwargs['rev'] = []
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2804 kwargs['new'] = []
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2805 kwargs['succ'] = []
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2806 kwargs['biject'] = False
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
2807 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
2808
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2809 @command('^touch',
701
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
2810 [('r', 'rev', [], 'revision to update'),
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
2811 ('D', 'duplicate', False,
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
2812 'do not mark the new revision as successor of the old one')],
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2813 # allow to choose the seed ?
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2814 _('[-r] revs'))
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2815 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
2816 """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
2817 for the changeset ID
517
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
2818
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
2819 This is used to "resurrect" changesets
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
2820 """
701
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
2821 duplicate = opts['duplicate']
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2822 revs = list(revs)
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2823 revs.extend(opts['rev'])
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2824 if not revs:
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2825 revs = ['.']
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2826 revs = scmutil.revrange(repo, revs)
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2827 if not revs:
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2828 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
2829 return 1
701
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
2830 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
2831 raise error.Abort("can't touch public revision")
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2832 wlock = lock = tr = None
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2833 try:
514
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
2834 wlock = repo.wlock()
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2835 lock = repo.lock()
514
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
2836 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
2837 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
2838 newmapping = {}
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2839 for r in revs:
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2840 ctx = repo[r]
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2841 extra = ctx.extra().copy()
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2842 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
2843 # search for touched parent
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2844 p1 = ctx.p1().node()
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2845 p2 = ctx.p2().node()
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2846 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
2847 p2 = newmapping.get(p2, p2)
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2848 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
2849 [p1, p2],
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2850 commitopts={'extra': extra})
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2851 # 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
2852 newmapping[ctx.node()] = new
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2853 if not duplicate:
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2854 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
2855 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
2856 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
2857 repo.dirstate.beginparentchange()
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2858 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
2859 repo.dirstate.endparentchange()
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2860 tr.close()
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2861 finally:
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
2862 lockmod.release(tr, lock, wlock)
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2863
934
f13facb01ac5 fold: add squash as a possible alias
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 933
diff changeset
2864 @command('^fold|squash',
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2865 [('r', 'rev', [], _("revision to fold")),
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2866 ('', 'exact', None, _("only fold specified revisions"))
933
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2867 ] + commitopts + commitopts2,
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2868 _('hg fold [OPTION]... [-r] REV'))
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2869 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
2870 """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
2871
1463
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
2872 By default, folds all the revisions linearly between the given revisions
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
2873 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
2874
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2875 Use --exact for folding only the specified revisions while ignoring the
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2876 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
2877 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
2878
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2879 .. container:: verbose
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2880
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2881 Some examples:
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2882
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2883 - 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
2884
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2885 hg fold .^
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2886
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2887 - 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
2888
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2889 hg fold 'draft()'
702
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
2890
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2891 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
2892 :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
2893
1469
fa1a27009c76 evolve: fix typo in fold docstring
André Sintzoff <andre.sintzoff@gmail.com>
parents: 1468
diff changeset
2894 - 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
2895
d830d4e9f212 fold: avoid using x:y in the help
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1463
diff changeset
2896 hg fold 3::6
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2897
1463
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
2898 - Fold revisions 3 and 4:
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
2899
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
2900 hg fold "3 + 4" --exact
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
2901
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2902 - 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
2903
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2904 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
2905 """
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2906 revs = list(revs)
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2907 revs.extend(opts['rev'])
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2908 if not revs:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2909 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
2910
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2911 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
2912
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2913 if not opts['exact']:
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2914 # 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
2915 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
2916 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
2917 if discardedrevs:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2918 raise error.Abort(_("cannot fold non-linear revisions"),
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2919 hint=_("given revisions are unrelated to parent "
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2920 "of working directory"))
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2921 revs = extrevs
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
2922
995
0f3a7efd6ee9 fold: emit error message when folding a single revision
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 994
diff changeset
2923 if len(revs) == 1:
0f3a7efd6ee9 fold: emit error message when folding a single revision
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 994
diff changeset
2924 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
2925 return 1
995
0f3a7efd6ee9 fold: emit error message when folding a single revision
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 994
diff changeset
2926
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2927 roots = repo.revs('roots(%ld)', revs)
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2928 if len(roots) > 1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2929 raise error.Abort(_("cannot fold non-linear revisions "
998
85ec2a55fe7c fold: improve error messages for multiple heads and roots
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 997
diff changeset
2930 "(multiple roots given)"))
1120
9bc4857f573b evolve: use `first` and `last` on revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1118
diff changeset
2931 root = repo[roots.first()]
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2932 if root.phase() <= phases.public:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2933 raise error.Abort(_("cannot fold public revisions"))
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2934 heads = repo.revs('heads(%ld)', revs)
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2935 if len(heads) > 1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2936 raise error.Abort(_("cannot fold non-linear revisions "
998
85ec2a55fe7c fold: improve error messages for multiple heads and roots
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 997
diff changeset
2937 "(multiple heads given)"))
1120
9bc4857f573b evolve: use `first` and `last` on revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1118
diff changeset
2938 head = repo[heads.first()]
1398
7ddcbf5469bc evolve: make fold aware of allowunstable
Laurent Charignon <lcharignon@fb.com>
parents: 1397
diff changeset
2939 disallowunstable = not obsolete.isenabled(repo, obsolete.allowunstableopt)
7ddcbf5469bc evolve: make fold aware of allowunstable
Laurent Charignon <lcharignon@fb.com>
parents: 1397
diff changeset
2940 if disallowunstable:
1415
aaccca501ae0 evolve: drop len comparison in prune and fold
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1414
diff changeset
2941 if repo.revs("(%ld::) - %ld", revs, revs):
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2942 raise error.Abort(_("cannot fold chain not ending with a head "\
1398
7ddcbf5469bc evolve: make fold aware of allowunstable
Laurent Charignon <lcharignon@fb.com>
parents: 1397
diff changeset
2943 "or with branching"))
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2944 wlock = lock = None
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2945 try:
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2946 wlock = repo.wlock()
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2947 lock = repo.lock()
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2948 tr = repo.transaction('touch')
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2949 try:
915
1ebe5c51919b fold: enable --date and --user options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 912
diff changeset
2950 commitopts = opts.copy()
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2951 allctx = [repo[r] for r in revs]
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2952 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
2953
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2954 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
2955 commitopts['edit'] = False
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2956 else:
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2957 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
2958 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
2959 (c.rev(), c.description()) for c in allctx]
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2960 commitopts['message'] = "\n".join(msgs)
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2961 commitopts['edit'] = True
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
2962
993
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
2963 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
2964 [root.p1().node(),
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
2965 root.p2().node()],
993
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
2966 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
2967 phases.retractboundary(repo, tr, targetphase, [newid])
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
2968 obsolete.createmarkers(repo, [(ctx, (repo[newid],))
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2969 for ctx in allctx])
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2970 tr.close()
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2971 finally:
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2972 tr.release()
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2973 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
2974 if repo['.'].rev() in revs:
549
b047e9417d96 Properly update after fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 548
diff changeset
2975 hg.update(repo, newid)
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2976 finally:
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
2977 lockmod.release(lock, wlock)
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
2978
587
8152fedbac65 evolve: smarter code for divergent changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 586
diff changeset
2979
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
2980
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
2981 @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
2982 def graftwrapper(orig, ui, repo, *revs, **kwargs):
419
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
2983 kwargs = dict(kwargs)
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
2984 revs = list(revs) + kwargs.get('rev', [])
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
2985 kwargs['rev'] = []
417
a1fb18ad29a1 evolve: avoid duplication in graft wrapper
Patrick Mezard <patrick@mezard.eu>
parents: 416
diff changeset
2986 obsoleted = kwargs.setdefault('obsolete', [])
419
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
2987
1256
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
2988 wlock = lock = None
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
2989 try:
1256
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
2990 wlock = repo.wlock()
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
2991 lock = repo.lock()
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
2992 if kwargs.get('old_obsolete'):
418
18a0d96ed559 evolve: graft --continue is optional, test
Patrick Mezard <patrick@mezard.eu>
parents: 417
diff changeset
2993 if kwargs.get('continue'):
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
2994 obsoleted.extend(repo.opener.read('graftstate').splitlines())
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
2995 else:
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
2996 obsoleted.extend(revs)
151
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
2997 # 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
2998 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
2999 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
3000
743
af74a5cdf96b conform to the Mercurial custom of lowercase messages
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 742
diff changeset
3001 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
3002 'obsoleting (for now).'))
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
3003
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
3004 return commitwrapper(orig, ui, repo,*revs, **kwargs)
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
3005 finally:
1256
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
3006 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
3007
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
3008 @eh.extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
3009 def oldevolveextsetup(ui):
742
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
3010 for cmd in ['kill', 'uncommit', 'touch', 'fold']:
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
3011 try:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
3012 entry = extensions.wrapcommand(cmdtable, cmd,
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
3013 warnobserrors)
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
3014 except error.UnknownCommand:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
3015 # Commands may be disabled
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
3016 continue
356
56d4c6207ef9 Move obserror warning into the obsolete extension.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 355
diff changeset
3017
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
3018 entry = cmdutil.findcmd('commit', commands.table)[1]
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
3019 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
3020 _("make commit obsolete this revision (DEPRECATED)")))
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
3021 entry = cmdutil.findcmd('graft', commands.table)[1]
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
3022 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
3023 _("make graft obsoletes this revision (DEPRECATED)")))
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
3024 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
3025 _("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
3026
816
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
3027 #####################################################################
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
3028 ### Obsolescence marker exchange experimenation ###
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
3029 #####################################################################
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
3030
1036
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
3031 def obsexcmsg(ui, message, important=False):
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
3032 verbose = ui.configbool('experimental', 'verbose-obsolescence-exchange',
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
3033 False)
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
3034 if verbose:
1035
59bc29c84ce0 evolve: hide the OBSEXC message behind a config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1034
diff changeset
3035 message = 'OBSEXC: ' + message
1036
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
3036 if important or verbose:
1035
59bc29c84ce0 evolve: hide the OBSEXC message behind a config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1034
diff changeset
3037 ui.status(message)
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
3038
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
3039 def obsexcprg(ui, *args, **kwargs):
1043
6a7d34010f8f evolve: re enable progress for all
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1042
diff changeset
3040 topic = 'obsmarkers exchange'
1035
59bc29c84ce0 evolve: hide the OBSEXC message behind a config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1034
diff changeset
3041 if ui.configbool('experimental', 'verbose-obsolescence-exchange', False):
1043
6a7d34010f8f evolve: re enable progress for all
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1042
diff changeset
3042 topic = 'OBSEXC'
6a7d34010f8f evolve: re enable progress for all
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1042
diff changeset
3043 ui.progress(topic, *args, **kwargs)
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
3044
1300
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3045 @eh.wrapfunction(exchange, '_pushdiscoveryobsmarkers')
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3046 def _pushdiscoveryobsmarkers(orig, pushop):
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3047 if (obsolete.isenabled(pushop.repo, obsolete.exchangeopt)
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3048 and pushop.repo.obsstore
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3049 and 'obsolete' in pushop.remote.listkeys('namespaces')):
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3050 repo = pushop.repo
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3051 obsexcmsg(repo.ui, "computing relevant nodes\n")
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3052 revs = list(repo.revs('::%ln', pushop.futureheads))
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3053 unfi = repo.unfiltered()
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3054 cl = unfi.changelog
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3055 if not pushop.remote.capable('_evoext_obshash_0'):
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3056 # do not trust core yet
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3057 # return orig(pushop)
1076
2039385d6460 discovery: hook on the official discovery for obsmarker
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1075
diff changeset
3058 nodes = [cl.node(r) for r in revs]
1078
5717d023da63 obsexc: use the common discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1077
diff changeset
3059 if nodes:
5717d023da63 obsexc: use the common discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1077
diff changeset
3060 obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n"
5717d023da63 obsexc: use the common discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1077
diff changeset
3061 % len(nodes))
5717d023da63 obsexc: use the common discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1077
diff changeset
3062 pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes)
5717d023da63 obsexc: use the common discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1077
diff changeset
3063 else:
5717d023da63 obsexc: use the common discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1077
diff changeset
3064 obsexcmsg(repo.ui, "markers already in sync\n")
5717d023da63 obsexc: use the common discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1077
diff changeset
3065 pushop.outobsmarkers = []
1300
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3066 pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes)
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3067 return
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3068
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3069 common = []
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3070 obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3071 % len(revs))
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3072 commonrevs = list(unfi.revs('::%ln', pushop.outgoing.commonheads))
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3073 common = findcommonobsmarkers(pushop.ui, unfi, pushop.remote,
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3074 commonrevs)
1300
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3075
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3076 revs = list(unfi.revs('%ld - (::%ln)', revs, common))
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3077 nodes = [cl.node(r) for r in revs]
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3078 if nodes:
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3079 obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n"
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3080 % len(nodes))
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3081 pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes)
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3082 else:
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3083 obsexcmsg(repo.ui, "markers already in sync\n")
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
3084 pushop.outobsmarkers = []
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
3085
1075
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
3086 @eh.wrapfunction(wireproto, 'capabilities')
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
3087 def discocapabilities(orig, repo, proto):
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
3088 """wrapper to advertise new capability"""
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
3089 caps = orig(repo, proto)
1214
4b10e2c6f7e3 config: remove uses of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1213
diff changeset
3090 if obsolete.isenabled(repo, obsolete.exchangeopt):
1075
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
3091 caps += ' _evoext_obshash_0'
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
3092 return caps
816
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
3093
1075
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
3094 @eh.extsetup
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
3095 def _installobsmarkersdiscovery(ui):
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
3096 hgweb_mod.perms['evoext_obshash'] = 'pull'
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3097 hgweb_mod.perms['evoext_obshash1'] = 'pull'
1075
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
3098 # wrap command content
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
3099 oldcap, args = wireproto.commands['capabilities']
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
3100 def newcap(repo, proto):
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
3101 return discocapabilities(oldcap, repo, proto)
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
3102 wireproto.commands['capabilities'] = (newcap, args)
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
3103 wireproto.commands['evoext_obshash'] = (srv_obshash, 'nodes')
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3104 wireproto.commands['evoext_obshash1'] = (srv_obshash1, 'nodes')
1108
87d60434b434 evolve: keep vague compatibility with 3.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1107
diff changeset
3105 if getattr(exchange, '_pushdiscoveryobsmarkers', None) is None:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3106 ui.warn(_('evolve: your mercurial version is too old\n'
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3107 'evolve: (running in degraded mode, push will '
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3108 'includes all markers)\n'))
1108
87d60434b434 evolve: keep vague compatibility with 3.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1107
diff changeset
3109 else:
87d60434b434 evolve: keep vague compatibility with 3.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1107
diff changeset
3110 olddisco = exchange.pushdiscoverymapping['obsmarker']
87d60434b434 evolve: keep vague compatibility with 3.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1107
diff changeset
3111 def newdisco(pushop):
87d60434b434 evolve: keep vague compatibility with 3.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1107
diff changeset
3112 _pushdiscoveryobsmarkers(olddisco, pushop)
87d60434b434 evolve: keep vague compatibility with 3.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1107
diff changeset
3113 exchange.pushdiscoverymapping['obsmarker'] = newdisco
816
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
3114
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3115 ### Set discovery START
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3116
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3117 from mercurial import dagutil
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3118 from mercurial import setdiscovery
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3119
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3120 def _obshash(repo, nodes, version=0):
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3121 if version == 0:
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3122 hashs = _obsrelsethashtreefm0(repo)
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3123 elif version ==1:
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3124 hashs = _obsrelsethashtreefm1(repo)
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3125 else:
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3126 assert False
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3127 nm = repo.changelog.nodemap
1073
f15f02007a0b obshash: resist to unknown revision during discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1072
diff changeset
3128 revs = [nm.get(n) for n in nodes]
f15f02007a0b obshash: resist to unknown revision during discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1072
diff changeset
3129 return [r is None and nullid or hashs[r][1] for r in revs]
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3130
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3131 def srv_obshash(repo, proto, nodes):
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3132 return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes)))
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3133
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3134 def srv_obshash1(repo, proto, nodes):
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3135 return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes),
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3136 version=1))
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3137
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3138 @eh.addattr(localrepo.localpeer, 'evoext_obshash')
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3139 def local_obshash(peer, nodes):
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3140 return _obshash(peer._repo, nodes)
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3141
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3142 @eh.addattr(localrepo.localpeer, 'evoext_obshash1')
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3143 def local_obshash1(peer, nodes):
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3144 return _obshash(peer._repo, nodes, version=1)
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3145
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3146 @eh.addattr(wireproto.wirepeer, 'evoext_obshash')
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3147 def peer_obshash(self, nodes):
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3148 d = self._call("evoext_obshash", nodes=wireproto.encodelist(nodes))
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3149 try:
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3150 return wireproto.decodelist(d)
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3151 except ValueError:
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3152 self._abort(error.ResponseError(_("unexpected response:"), d))
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3153
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3154 @eh.addattr(wireproto.wirepeer, 'evoext_obshash1')
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3155 def peer_obshash1(self, nodes):
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3156 d = self._call("evoext_obshash1", nodes=wireproto.encodelist(nodes))
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3157 try:
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3158 return wireproto.decodelist(d)
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3159 except ValueError:
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3160 self._abort(error.ResponseError(_("unexpected response:"), d))
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3161
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3162 def findcommonobsmarkers(ui, local, remote, probeset,
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3163 initialsamplesize=100,
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3164 fullsamplesize=200):
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3165 # from discovery
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3166 roundtrips = 0
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3167 cl = local.changelog
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3168 dag = dagutil.revlogdag(cl)
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3169 missing = set()
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3170 common = set()
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3171 undecided = set(probeset)
1494
aca2495425a6 evolve: add progress for the obsmarkers discovery parts
timeless@mozdev.org
parents: 1488
diff changeset
3172 totalnb = len(undecided)
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3173 ui.progress(_("comparing with other"), 0, total=totalnb)
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3174 _takefullsample = setdiscovery._takefullsample
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3175 if remote.capable('_evoext_obshash_1'):
1249
1556d8fed538 discovery: stop being stupid about variable name
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1244
diff changeset
3176 getremotehash = remote.evoext_obshash1
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3177 localhash = _obsrelsethashtreefm1(local)
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3178 else:
1249
1556d8fed538 discovery: stop being stupid about variable name
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1244
diff changeset
3179 getremotehash = remote.evoext_obshash
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3180 localhash = _obsrelsethashtreefm0(local)
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3181
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3182 while undecided:
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3183
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3184 ui.note(_("sampling from both directions\n"))
1193
de73285cf504 discovery: do not build sample if undecided is smaller than sample size
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1192
diff changeset
3185 if len(undecided) < fullsamplesize:
de73285cf504 discovery: do not build sample if undecided is smaller than sample size
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1192
diff changeset
3186 sample = set(undecided)
de73285cf504 discovery: do not build sample if undecided is smaller than sample size
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1192
diff changeset
3187 else:
de73285cf504 discovery: do not build sample if undecided is smaller than sample size
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1192
diff changeset
3188 sample = _takefullsample(dag, undecided, size=fullsamplesize)
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3189
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3190 roundtrips += 1
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3191 ui.progress(_("comparing with other"), totalnb - len(undecided),
1494
aca2495425a6 evolve: add progress for the obsmarkers discovery parts
timeless@mozdev.org
parents: 1488
diff changeset
3192 total=totalnb)
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3193 ui.debug("query %i; still undecided: %i, sample size is: %i\n"
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3194 % (roundtrips, len(undecided), len(sample)))
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3195 # indices between sample and externalized version must match
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3196 sample = list(sample)
1249
1556d8fed538 discovery: stop being stupid about variable name
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1244
diff changeset
3197 remotehash = getremotehash(dag.externalizeall(sample))
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3198
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3199 yesno = [localhash[ix][1] == remotehash[si]
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3200 for si, ix in enumerate(sample)]
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3201
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3202 commoninsample = set(n for i, n in enumerate(sample) if yesno[i])
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3203 common.update(dag.ancestorset(commoninsample, common))
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3204
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3205 missinginsample = [n for i, n in enumerate(sample) if not yesno[i]]
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3206 missing.update(dag.descendantset(missinginsample, missing))
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3207
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3208 undecided.difference_update(missing)
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3209 undecided.difference_update(common)
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3210
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3211
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3212 ui.progress(_("comparing with other"), None, total=totalnb)
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3213 result = dag.headsetofconnecteds(common)
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3214 ui.debug("%d total queries\n" % roundtrips)
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3215
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3216 if not result:
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3217 return set([nullid])
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
3218 return dag.externalizeall(result)
816
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
3219
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
3220
817
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
3221 _pushkeyescape = getattr(obsolete, '_pushkeyescape', None)
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
3222
854
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
3223 class pushobsmarkerStringIO(StringIO):
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
3224 """hacky string io for progress"""
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
3225
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
3226 @util.propertycache
879
85b3d54516a7 exchange: expose length of pushed markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 877
diff changeset
3227 def length(self):
854
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
3228 return len(self.getvalue())
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
3229
1080
41d2555141ea evolve: allow read() from the magic StringIO
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1079
diff changeset
3230 def read(self, size=None):
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
3231 obsexcprg(self.ui, self.tell(), unit="bytes", total=self.length)
854
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
3232 return StringIO.read(self, size)
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
3233
961
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
3234 def __iter__(self):
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
3235 d = self.read(4096)
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
3236 while d:
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
3237 yield d
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
3238 d = self.read(4096)
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
3239
817
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
3240 @eh.wrapfunction(exchange, '_pushobsolete')
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
3241 def _pushobsolete(orig, pushop):
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
3242 """utility function to push obsolete markers to a remote"""
1005
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
3243 stepsdone = getattr(pushop, 'stepsdone', None)
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
3244 if stepsdone is not None:
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
3245 if 'obsmarkers' in stepsdone:
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
3246 return
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
3247 stepsdone.add('obsmarkers')
1118
fbc400c1b022 evolve: adapt to core changeset 4f14303e8954
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1117
diff changeset
3248 if util.safehasattr(pushop, 'cgresult'):
fbc400c1b022 evolve: adapt to core changeset 4f14303e8954
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1117
diff changeset
3249 cgresult = pushop.cgresult
fbc400c1b022 evolve: adapt to core changeset 4f14303e8954
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1117
diff changeset
3250 else:
fbc400c1b022 evolve: adapt to core changeset 4f14303e8954
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1117
diff changeset
3251 cgresult = pushop.ret
fbc400c1b022 evolve: adapt to core changeset 4f14303e8954
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1117
diff changeset
3252 if cgresult == 0:
1077
cdfc19f25478 obsexc: push nothing if push fail
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1076
diff changeset
3253 return
817
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
3254 pushop.ui.debug('try to push obsolete markers to remote\n')
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
3255 repo = pushop.repo
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
3256 remote = pushop.remote
1214
4b10e2c6f7e3 config: remove uses of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1213
diff changeset
3257 if (obsolete.isenabled(repo, obsolete.exchangeopt) and repo.obsstore and
817
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
3258 'obsolete' in remote.listkeys('namespaces')):
1078
5717d023da63 obsexc: use the common discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1077
diff changeset
3259 markers = pushop.outobsmarkers
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
3260 if not markers:
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
3261 obsexcmsg(repo.ui, "no marker to push\n")
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
3262 elif remote.capable('_evoext_pushobsmarkers_0'):
961
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
3263 obsdata = pushobsmarkerStringIO()
1091
236a8e81551e compat: use in-core encodemarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1090
diff changeset
3264 for chunk in obsolete.encodemarkers(markers, True):
236a8e81551e compat: use in-core encodemarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1090
diff changeset
3265 obsdata.write(chunk)
957
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
3266 obsdata.seek(0)
961
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
3267 obsdata.ui = repo.ui
1037
bddee73b361e evolve: add "absolescence" in front of markers in the message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1036
diff changeset
3268 obsexcmsg(repo.ui, "pushing %i obsolescence markers (%i bytes)\n"
1036
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
3269 % (len(markers), len(obsdata.getvalue())),
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
3270 True)
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3271 remote.evoext_pushobsmarkers_0(obsdata)
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
3272 obsexcprg(repo.ui, None)
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3273 else:
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3274 rslts = []
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3275 remotedata = _pushkeyescape(markers).items()
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3276 totalbytes = sum(len(d) for k, d in remotedata)
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3277 sentbytes = 0
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3278 obsexcmsg(repo.ui, "pushing %i obsolescence markers in %i "
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3279 "pushkey payload (%i bytes)\n"
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3280 % (len(markers), len(remotedata), totalbytes),
1036
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
3281 True)
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3282 for key, data in remotedata:
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
3283 obsexcprg(repo.ui, sentbytes, item=key, unit="bytes",
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
3284 total=totalbytes)
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3285 rslts.append(remote.pushkey('obsolete', key, '', data))
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3286 sentbytes += len(data)
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
3287 obsexcprg(repo.ui, sentbytes, item=key, unit="bytes",
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
3288 total=totalbytes)
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
3289 obsexcprg(repo.ui, None)
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3290 if [r for r in rslts if not r]:
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3291 msg = _('failed to push some obsolete markers!\n')
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3292 repo.ui.warn(msg)
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
3293 obsexcmsg(repo.ui, "DONE\n")
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3294
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3295
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3296 @eh.addattr(wireproto.wirepeer, 'evoext_pushobsmarkers_0')
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3297 def client_pushobsmarkers(self, obsfile):
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3298 """wireprotocol peer method"""
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3299 self.requirecap('_evoext_pushobsmarkers_0',
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3300 _('push obsolete markers faster'))
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3301 ret, output = self._callpush('evoext_pushobsmarkers_0', obsfile)
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3302 for l in output.splitlines(True):
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3303 self.ui.status(_('remote: '), l)
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3304 return ret
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3305
880
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
3306 @eh.addattr(httppeer.httppeer, 'evoext_pushobsmarkers_0')
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
3307 def httpclient_pushobsmarkers(self, obsfile):
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
3308 """httpprotocol peer method
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
3309 (Cannot simply use _callpush as http is doing some special handling)"""
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
3310 self.requirecap('_evoext_pushobsmarkers_0',
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
3311 _('push obsolete markers faster'))
1209
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
3312 try:
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
3313 r = self._call('evoext_pushobsmarkers_0', data=obsfile)
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
3314 vals = r.split('\n', 1)
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
3315 if len(vals) < 2:
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
3316 raise error.ResponseError(_("unexpected response:"), r)
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
3317
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
3318 for l in vals[1].splitlines(True):
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
3319 if l.strip():
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
3320 self.ui.status(_('remote: '), l)
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
3321 return vals[0]
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3322 except socket.error as err:
1209
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
3323 if err.args[0] in (errno.ECONNRESET, errno.EPIPE):
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3324 raise error.Abort(_('push failed: %s') % err.args[1])
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3325 raise error.Abort(err.args[1])
880
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
3326
1081
dddb8a70437c obsexc: add support for evoext_pushobsmarkers_0 on localpeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1080
diff changeset
3327 @eh.wrapfunction(localrepo.localrepository, '_restrictcapabilities')
dddb8a70437c obsexc: add support for evoext_pushobsmarkers_0 on localpeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1080
diff changeset
3328 def local_pushobsmarker_capabilities(orig, repo, caps):
dddb8a70437c obsexc: add support for evoext_pushobsmarkers_0 on localpeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1080
diff changeset
3329 caps = orig(repo, caps)
dddb8a70437c obsexc: add support for evoext_pushobsmarkers_0 on localpeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1080
diff changeset
3330 caps.add('_evoext_pushobsmarkers_0')
dddb8a70437c obsexc: add support for evoext_pushobsmarkers_0 on localpeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1080
diff changeset
3331 return caps
dddb8a70437c obsexc: add support for evoext_pushobsmarkers_0 on localpeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1080
diff changeset
3332
1314
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
3333 def _pushobsmarkers(repo, data):
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
3334 tr = lock = None
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3335 try:
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
3336 lock = repo.lock()
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3337 tr = repo.transaction('pushkey: obsolete markers')
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
3338 new = repo.obsstore.mergemarkers(tr, data)
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
3339 if new is not None:
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
3340 obsexcmsg(repo.ui, "%i obsolescence markers added\n" % new, True)
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
3341 tr.close()
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3342 finally:
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
3343 lockmod.release(tr, lock)
888
097ddcb0da25 evolve: add a hook related to the new pushobsmarkers command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 887
diff changeset
3344 repo.hook('evolve_pushobsmarkers')
1314
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
3345
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
3346 @eh.addattr(localrepo.localpeer, 'evoext_pushobsmarkers_0')
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
3347 def local_pushobsmarkers(peer, obsfile):
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
3348 data = obsfile.read()
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
3349 _pushobsmarkers(peer._repo, data)
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
3350
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
3351 def srv_pushobsmarkers(repo, proto):
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
3352 """wireprotocol command"""
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
3353 fp = StringIO()
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
3354 proto.redirect()
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
3355 proto.getfile(fp)
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
3356 data = fp.getvalue()
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
3357 fp.close()
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
3358 _pushobsmarkers(repo, data)
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3359 return wireproto.pushres(0)
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3360
1095
26334cfd4e95 evolve: fix a typo in a long function name
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1094
diff changeset
3361 def _buildpullobsmarkersboundaries(pullop):
825
7671717afef8 exchange: extract computation of pulled markers boundary in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 824
diff changeset
3362 """small funtion returning the argument for pull markers call
7671717afef8 exchange: extract computation of pulled markers boundary in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 824
diff changeset
3363 may to contains 'heads' and 'common'. skip the key for None.
7671717afef8 exchange: extract computation of pulled markers boundary in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 824
diff changeset
3364
7671717afef8 exchange: extract computation of pulled markers boundary in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 824
diff changeset
3365 Its a separed functio to play around with strategy for that."""
865
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
3366 repo = pullop.repo
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
3367 remote = pullop.remote
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
3368 unfi = repo.unfiltered()
1196
9e3f332f7630 discovery: filter null from the discovery revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1193
diff changeset
3369 revs = unfi.revs('::(%ln - null)', pullop.common)
865
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
3370 common = [nullid]
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
3371 if remote.capable('_evoext_obshash_0'):
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
3372 obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
3373 % len(revs))
865
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
3374 common = findcommonobsmarkers(repo.ui, repo, remote, revs)
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
3375 return {'heads': pullop.pulledsubset, 'common': common}
825
7671717afef8 exchange: extract computation of pulled markers boundary in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 824
diff changeset
3376
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3377 @eh.uisetup
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3378 def addgetbundleargs(self):
1097
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1096
diff changeset
3379 gboptsmap['evo_obscommon'] = 'nodes'
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3380
1097
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1096
diff changeset
3381 @eh.wrapfunction(exchange, '_pullbundle2extraprepare')
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1096
diff changeset
3382 def _addobscommontob2pull(orig, pullop, kwargs):
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1096
diff changeset
3383 ret = orig(pullop, kwargs)
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3384 if ('obsmarkers' in kwargs and
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3385 pullop.remote.capable('_evoext_getbundle_obscommon')):
1097
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1096
diff changeset
3386 boundaries = _buildpullobsmarkersboundaries(pullop)
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1096
diff changeset
3387 common = boundaries['common']
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1096
diff changeset
3388 if common != [nullid]:
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1096
diff changeset
3389 kwargs['evo_obscommon'] = common
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1096
diff changeset
3390 return ret
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3391
1301
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3392 @eh.wrapfunction(exchange, '_getbundleobsmarkerpart')
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3393 def _getbundleobsmarkerpart(orig, bundler, repo, source, **kwargs):
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3394 if 'evo_obscommon' not in kwargs:
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3395 return orig(bundler, repo, source, **kwargs)
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3396
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3397 heads = kwargs.get('heads')
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3398 if kwargs.get('obsmarkers', False):
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3399 if heads is None:
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3400 heads = repo.heads()
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3401 obscommon = kwargs.get('evo_obscommon', ())
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3402 assert obscommon
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3403 obsset = repo.unfiltered().set('::%ln - ::%ln', heads, obscommon)
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3404 subset = [c.node() for c in obsset]
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3405 markers = repo.obsstore.relevantmarkers(subset)
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3406 exchange.buildobsmarkerspart(bundler, markers)
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3407
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3408 @eh.uisetup
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3409 def installgetbundlepartgen(ui):
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3410 origfunc = exchange.getbundle2partsmapping['obsmarkers']
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3411 def newfunc(*args, **kwargs):
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3412 return _getbundleobsmarkerpart(origfunc, *args, **kwargs)
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
3413 exchange.getbundle2partsmapping['obsmarkers'] = newfunc
825
7671717afef8 exchange: extract computation of pulled markers boundary in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 824
diff changeset
3414
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3415 @eh.wrapfunction(exchange, '_pullobsolete')
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3416 def _pullobsolete(orig, pullop):
1214
4b10e2c6f7e3 config: remove uses of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1213
diff changeset
3417 if not obsolete.isenabled(pullop.repo, obsolete.exchangeopt):
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3418 return None
1132
7a1784a1c642 pullobsolete: handle migration from todosteps to donesteps
Augie Fackler <raf@durin42.com>
parents: 1131
diff changeset
3419 if 'obsmarkers' not in getattr(pullop, 'todosteps', ['obsmarkers']):
7a1784a1c642 pullobsolete: handle migration from todosteps to donesteps
Augie Fackler <raf@durin42.com>
parents: 1131
diff changeset
3420 return None
7a1784a1c642 pullobsolete: handle migration from todosteps to donesteps
Augie Fackler <raf@durin42.com>
parents: 1131
diff changeset
3421 if 'obsmarkers' in getattr(pullop, 'stepsdone', []):
1093
a49f2e7a2755 obsexch: respect todosteps when using the old push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
3422 return None
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3423 wirepull = pullop.remote.capable('_evoext_pullobsmarkers_0')
1082
74bc8a0c2c02 pull: drop the custom bundle2 part
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1081
diff changeset
3424 if not wirepull:
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3425 return orig(pullop)
883
d2fa1061df16 evolve: do not exchange obsolescence markers when server refuse it
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 880
diff changeset
3426 if 'obsolete' not in pullop.remote.listkeys('namespaces'):
d2fa1061df16 evolve: do not exchange obsolescence markers when server refuse it
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 880
diff changeset
3427 return None # remote opted out of obsolescence marker exchange
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3428 tr = None
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3429 ui = pullop.repo.ui
1095
26334cfd4e95 evolve: fix a typo in a long function name
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1094
diff changeset
3430 boundaries = _buildpullobsmarkersboundaries(pullop)
1041
7632f1f79946 evolve: do not even try to pull if all remote markers are known
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1040
diff changeset
3431 if not set(boundaries['heads']) - set(boundaries['common']):
7632f1f79946 evolve: do not even try to pull if all remote markers are known
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1040
diff changeset
3432 obsexcmsg(ui, "nothing to pull\n")
7632f1f79946 evolve: do not even try to pull if all remote markers are known
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1040
diff changeset
3433 return None
7632f1f79946 evolve: do not even try to pull if all remote markers are known
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1040
diff changeset
3434
1042
86bd794f6037 evolve: stop pretending we are pulling markers when we don't
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1041
diff changeset
3435 obsexcmsg(ui, "pull obsolescence markers\n", True)
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3436 new = 0
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3437
1082
74bc8a0c2c02 pull: drop the custom bundle2 part
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1081
diff changeset
3438 if wirepull:
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3439 obsdata = pullop.remote.evoext_pullobsmarkers_0(**boundaries)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3440 obsdata = obsdata.read()
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3441 if len(obsdata) > 5:
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
3442 obsexcmsg(ui, "merging obsolescence markers (%i bytes)\n"
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3443 % len(obsdata))
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3444 tr = pullop.gettransaction()
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3445 old = len(pullop.repo.obsstore._all)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3446 pullop.repo.obsstore.mergemarkers(tr, obsdata)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3447 new = len(pullop.repo.obsstore._all) - old
1040
640f3280559e evolve: add "obsolescence" in front of marked in the previous message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1039
diff changeset
3448 obsexcmsg(ui, "%i obsolescence markers added\n" % new, True)
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3449 else:
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
3450 obsexcmsg(ui, "no unknown remote markers\n")
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
3451 obsexcmsg(ui, "DONE\n")
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3452 if new:
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
3453 pullop.repo.invalidatevolatilesets()
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3454 return tr
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3455
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3456 def _getobsmarkersstream(repo, heads=None, common=None):
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3457 revset = ''
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3458 args = []
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3459 repo = repo.unfiltered()
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3460 if heads is None:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3461 revset = 'all()'
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3462 elif heads:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3463 revset += "(::%ln)"
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3464 args.append(heads)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3465 else:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3466 assert False, 'pulling no heads?'
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3467 if common:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3468 revset += ' - (::%ln)'
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3469 args.append(common)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3470 nodes = [c.node() for c in repo.set(revset, *args)]
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3471 markers = repo.obsstore.relevantmarkers(nodes)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3472 obsdata = StringIO()
1091
236a8e81551e compat: use in-core encodemarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1090
diff changeset
3473 for chunk in obsolete.encodemarkers(markers, True):
236a8e81551e compat: use in-core encodemarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1090
diff changeset
3474 obsdata.write(chunk)
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3475 obsdata.seek(0)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3476 return obsdata
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3477
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3478 @eh.addattr(wireproto.wirepeer, 'evoext_pullobsmarkers_0')
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3479 def client_pullobsmarkers(self, heads=None, common=None):
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3480 self.requirecap('_evoext_pullobsmarkers_0', _('look up remote obsmarkers'))
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3481 opts = {}
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3482 if heads is not None:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3483 opts['heads'] = wireproto.encodelist(heads)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3484 if common is not None:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3485 opts['common'] = wireproto.encodelist(common)
897
b5227608d9dd evolve: use new api _callcompressable
Olle Lundberg <geek@nerd.sh>
parents: 896
diff changeset
3486 if util.safehasattr(self, '_callcompressable'):
b5227608d9dd evolve: use new api _callcompressable
Olle Lundberg <geek@nerd.sh>
parents: 896
diff changeset
3487 f = self._callcompressable("evoext_pullobsmarkers_0", **opts)
b5227608d9dd evolve: use new api _callcompressable
Olle Lundberg <geek@nerd.sh>
parents: 896
diff changeset
3488 else:
b5227608d9dd evolve: use new api _callcompressable
Olle Lundberg <geek@nerd.sh>
parents: 896
diff changeset
3489 f = self._callstream("evoext_pullobsmarkers_0", **opts)
b5227608d9dd evolve: use new api _callcompressable
Olle Lundberg <geek@nerd.sh>
parents: 896
diff changeset
3490 f = self._decompress(f)
898
934b6f0feffd evolve: small white space change
Olle Lundberg <geek@nerd.sh>
parents: 897
diff changeset
3491 length = int(f.read(20))
853
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
3492 chunk = 4096
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
3493 current = 0
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
3494 data = StringIO()
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
3495 ui = self.ui
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
3496 obsexcprg(ui, current, unit="bytes", total=length)
853
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
3497 while current < length:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3498 readsize = min(length - current, chunk)
853
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
3499 data.write(f.read(readsize))
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
3500 current += readsize
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
3501 obsexcprg(ui, current, unit="bytes", total=length)
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
3502 obsexcprg(ui, None)
870
1a23c7c52a43 exchange: fix pull over wire protocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 869
diff changeset
3503 data.seek(0)
853
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
3504 return data
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3505
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3506 @eh.addattr(localrepo.localpeer, 'evoext_pullobsmarkers_0')
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3507 def local_pullobsmarkers(self, heads=None, common=None):
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3508 return _getobsmarkersstream(self._repo, heads=heads, common=common)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3509
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3510 def srv_pullobsmarkers(repo, proto, others):
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3511 opts = wireproto.options('', ['heads', 'common'], others)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3512 for k, v in opts.iteritems():
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3513 if k in ('heads', 'common'):
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3514 opts[k] = wireproto.decodelist(v)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3515 obsdata = _getobsmarkersstream(repo, **opts)
877
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
3516 finaldata = StringIO()
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
3517 obsdata = obsdata.getvalue()
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
3518 finaldata.write('%20i' % len(obsdata))
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
3519 finaldata.write(obsdata)
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
3520 finaldata.seek(0)
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
3521 return wireproto.streamres(proto.groupchunks(finaldata))
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3522
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3523 def _obsrelsethashtreefm0(repo):
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3524 return _obsrelsethashtree(repo, obsolete._fm0encodeonemarker)
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3525
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3526 def _obsrelsethashtreefm1(repo):
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3527 return _obsrelsethashtree(repo, obsolete._fm1encodeonemarker)
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3528
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3529 def _obsrelsethashtree(repo, encodeonemarker):
863
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3530 cache = []
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3531 unfi = repo.unfiltered()
1203
936aa82884ab evolve: cache marker encoding to avoid performance degradation
Mathias De Maré <mathias.demare@gmail.com>
parents: 1202
diff changeset
3532 markercache = {}
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3533 repo.ui.progress(_("preparing locally"), 0, total=len(unfi))
863
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3534 for i in unfi:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3535 ctx = unfi[i]
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3536 entry = 0
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3537 sha = util.sha1()
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3538 # add data from p1
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3539 for p in ctx.parents():
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3540 p = p.rev()
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3541 if p < 0:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3542 p = nullid
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3543 else:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3544 p = cache[p][1]
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3545 if p != nullid:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3546 entry += 1
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3547 sha.update(p)
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3548 tmarkers = repo.obsstore.relevantmarkers([ctx.node()])
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3549 if tmarkers:
1203
936aa82884ab evolve: cache marker encoding to avoid performance degradation
Mathias De Maré <mathias.demare@gmail.com>
parents: 1202
diff changeset
3550 bmarkers = []
936aa82884ab evolve: cache marker encoding to avoid performance degradation
Mathias De Maré <mathias.demare@gmail.com>
parents: 1202
diff changeset
3551 for m in tmarkers:
936aa82884ab evolve: cache marker encoding to avoid performance degradation
Mathias De Maré <mathias.demare@gmail.com>
parents: 1202
diff changeset
3552 if not m in markercache:
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3553 markercache[m] = encodeonemarker(m)
1203
936aa82884ab evolve: cache marker encoding to avoid performance degradation
Mathias De Maré <mathias.demare@gmail.com>
parents: 1202
diff changeset
3554 bmarkers.append(markercache[m])
863
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3555 bmarkers.sort()
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3556 for m in bmarkers:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3557 entry += 1
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3558 sha.update(m)
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3559 if entry:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3560 cache.append((ctx.node(), sha.digest()))
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3561 else:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3562 cache.append((ctx.node(), nullid))
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3563 repo.ui.progress(_("preparing locally"), i, total=len(unfi))
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3564 repo.ui.progress(_("preparing locally"), None)
863
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3565 return cache
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3566
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3567 @command('debugobsrelsethashtree',
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3568 [('', 'v0', None, 'hash on marker format "0"'),
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3569 ('', 'v1', None, 'hash on marker format "1" (default)')] , _(''))
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3570 def debugobsrelsethashtree(ui, repo, v0=False, v1=False):
863
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3571 """display Obsolete markers, Relevant Set, Hash Tree
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3572 changeset-node obsrelsethashtree-node
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3573
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3574 It computed form the "orsht" of its parent and markers
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3575 relevant to the changeset itself."""
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3576 if v0 and v1:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3577 raise error.Abort('cannot only specify one format')
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3578 elif v0:
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3579 treefunc = _obsrelsethashtreefm0
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3580 else:
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3581 treefunc = _obsrelsethashtreefm1
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3582
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3583 for chg, obs in treefunc(repo):
863
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3584 ui.status('%s %s\n' % (node.hex(chg), node.hex(obs)))
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3585
1159
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
3586 _bestformat = max(obsolete.formats.keys())
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
3587
1202
4099b087f672 evolve: handle invalid obsmarkers in the `debugobsconvert`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1198
diff changeset
3588
1302
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3589 @eh.wrapfunction(obsolete, '_checkinvalidmarkers')
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3590 def _checkinvalidmarkers(orig, markers):
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3591 """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
3592
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3593 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
3594 subtle handling.
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3595 """
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3596 if 'debugobsconvert' in sys.argv:
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3597 return
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3598 for mark in markers:
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3599 if node.nullid in mark[1]:
1547
425c0700aabd check-code: make evolve.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1536
diff changeset
3600 raise error.Abort(_('bad obsolescence marker detected: '
1302
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3601 'invalid successors nullid'),
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
3602 hint=_('You should run `hg debugobsconvert`'))
1202
4099b087f672 evolve: handle invalid obsmarkers in the `debugobsconvert`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1198
diff changeset
3603
1159
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
3604 @command(
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
3605 'debugobsconvert',
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
3606 [('', 'new-format', _bestformat, _('Destination format for markers.'))],
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
3607 '')
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
3608 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
3609 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
3610 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
3611 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
3612 raise error.Abort(msg)
1465
777e5c369d99 compat: use svfs instead of sopener
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1464
diff changeset
3613 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
3614 known = set()
6f08a8f6bb1d debugobsconvert: also deduplicate markers in the process
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1159
diff changeset
3615 markers = []
1172
8d28bb4fc127 debugobsconvert: fix 6f08a8f6bb1d and add proper test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1171
diff changeset
3616 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
3617 # filter out invalid markers
4099b087f672 evolve: handle invalid obsmarkers in the `debugobsconvert`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1198
diff changeset
3618 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
3619 m = list(m)
4099b087f672 evolve: handle invalid obsmarkers in the `debugobsconvert`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1198
diff changeset
3620 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
3621 m = tuple(m)
1169
6f08a8f6bb1d debugobsconvert: also deduplicate markers in the process
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1159
diff changeset
3622 if m in known:
6f08a8f6bb1d debugobsconvert: also deduplicate markers in the process
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1159
diff changeset
3623 continue
1172
8d28bb4fc127 debugobsconvert: fix 6f08a8f6bb1d and add proper test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1171
diff changeset
3624 known.add(m)
1169
6f08a8f6bb1d debugobsconvert: also deduplicate markers in the process
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1159
diff changeset
3625 markers.append(m)
1170
4697f23e0ede debugobsconvert: fix a typo on "version"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1169
diff changeset
3626 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
3627 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
3628 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
3629 f.close()
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
3630 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
3631
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
3632
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
3633 @eh.wrapfunction(wireproto, 'capabilities')
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
3634 def capabilities(orig, repo, proto):
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
3635 """wrapper to advertise new capability"""
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
3636 caps = orig(repo, proto)
1214
4b10e2c6f7e3 config: remove uses of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1213
diff changeset
3637 if obsolete.isenabled(repo, obsolete.exchangeopt):
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
3638 caps += ' _evoext_pushobsmarkers_0'
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
3639 caps += ' _evoext_pullobsmarkers_0'
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
3640 caps += ' _evoext_obshash_0'
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
3641 caps += ' _evoext_obshash_1'
1096
661f3a112f7a pull: run obsmarker discovery only on the common set
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1095
diff changeset
3642 caps += ' _evoext_getbundle_obscommon'
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
3643 return caps
863
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3644
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
3645
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3646 @eh.extsetup
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3647 def _installwireprotocol(ui):
941
576d3a198269 evolve: drop some pre-3.0 compatibility code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 940
diff changeset
3648 localrepo.moderncaps.add('_evoext_pullobsmarkers_0')
869
e9eeef0d07ec exchange: enforce permission on new wireprotocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 868
diff changeset
3649 hgweb_mod.perms['evoext_pushobsmarkers_0'] = 'push'
e9eeef0d07ec exchange: enforce permission on new wireprotocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 868
diff changeset
3650 hgweb_mod.perms['evoext_pullobsmarkers_0'] = 'pull'
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
3651 wireproto.commands['evoext_pushobsmarkers_0'] = (srv_pushobsmarkers, '')
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
3652 wireproto.commands['evoext_pullobsmarkers_0'] = (srv_pullobsmarkers, '*')
875
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 871
diff changeset
3653 # wrap command content
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 871
diff changeset
3654 oldcap, args = wireproto.commands['capabilities']
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 871
diff changeset
3655 def newcap(repo, proto):
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 871
diff changeset
3656 return capabilities(oldcap, repo, proto)
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 871
diff changeset
3657 wireproto.commands['capabilities'] = (newcap, args)
1414
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3658
1509
405be3783fbc evolve: ignore ui argument passed to help loader
Yuya Nishihara <yuya@tcha.org>
parents: 1507
diff changeset
3659 # Mercurial >= 3.6 passes ui
405be3783fbc evolve: ignore ui argument passed to help loader
Yuya Nishihara <yuya@tcha.org>
parents: 1507
diff changeset
3660 def _helploader(ui=None):
1414
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3661 return help.gettext(evolutionhelptext)
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3662
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3663 @eh.uisetup
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3664 def _setuphelp(ui):
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3665 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
3666 if entry[0] == "evolution":
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3667 break
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3668 else:
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3669 help.helptable.append((["evolution"], _("Safely Rewriting History"),
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3670 _helploader))
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
3671 help.helptable.sort()