hgext/evolve.py
author Ryan McElroy <rmcelroy@fb.com>
Fri, 09 Oct 2015 16:21:30 -0700
changeset 1513 4f7e0e0318a5
parent 1512 c40108ae8fb0
child 1514 324cd13838f1
permissions -rw-r--r--
prune: reuse revset from repair instead of copy-pasting code
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     1
# Copyright 2011 Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     2
#                Logilab SA        <contact@logilab.fr>
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     3
#                Pierre-Yves David <pierre-yves.david@ens-lyon.org>
519
9825c7da5b54 ensure all file have a copyright notice
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 517
diff changeset
     4
#                Patrick Mezard <patrick@mezard.eu>
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     5
#
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     6
# This software may be used and distributed according to the terms of the
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     7
# GNU General Public License version 2 or any later version.
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
1459
49e43f20a579 fix version number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1454
diff changeset
    22
__version__ = '5.2.0'
1392
0ec6cc5b4b7a evolve: marks the extension as tested with 4.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1390
diff changeset
    23
testedwith = '3.3.3 3.4.1'
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
490
8096833e9226 sort import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 485
diff changeset
    89
from mercurial import bookmarks
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:
1191
583f7f03434b init: don't abort Mercurial on version mismatch
Matt Mackall <mpm@selenic.com>
parents: 1189
diff changeset
   127
    raise ImportError('evolve needs version %s or above' % min(testedwith.split()))
955
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
   128
1296
23819e1d61fd evolve: add -i flag to amend command
Laurent Charignon <lcharignon@fb.com>
parents: 1281
diff changeset
   129
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
   130
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
   131
if hasinteractivemode:
23819e1d61fd evolve: add -i flag to amend command
Laurent Charignon <lcharignon@fb.com>
parents: 1281
diff changeset
   132
    interactiveopt = [['i', 'interactive', None, _('use interactive mode')]]
23819e1d61fd evolve: add -i flag to amend command
Laurent Charignon <lcharignon@fb.com>
parents: 1281
diff changeset
   133
else:
23819e1d61fd evolve: add -i flag to amend command
Laurent Charignon <lcharignon@fb.com>
parents: 1281
diff changeset
   134
    interactiveopt = []
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   135
# This extension contains the following code
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   136
#
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   137
# - Extension Helper code
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   138
# - Obsolescence cache
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   139
# - ...
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   140
# - Older format compat
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   141
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
### Extension helper                                              ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   145
#####################################################################
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
class exthelper(object):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   148
    """Helper for modular extension setup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   149
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   150
    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
   151
    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
   152
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   153
    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
   154
    """
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
    def __init__(self):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   157
        self._uicallables = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   158
        self._extcallables = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   159
        self._repocallables = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   160
        self._revsetsymbols = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   161
        self._templatekws = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   162
        self._commandwrappers = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   163
        self._extcommandwrappers = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   164
        self._functionwrappers = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   165
        self._duckpunchers = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   166
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   167
    def final_uisetup(self, ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   168
        """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
   169
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   170
        The following operations belong here:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   171
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   172
        - 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
   173
          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
   174
          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
   175
          passed to runcommand
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   176
        - Command wraps (extensions.wrapcommand)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   177
        - 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
   178
          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
   179
          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
   180
          during extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   181
        - 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
   182
          module members
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   183
        - Setup of pre-* and post-* hooks
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   184
        - pushkey setup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   185
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   186
        for cont, funcname, func in self._duckpunchers:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   187
            setattr(cont, funcname, func)
1218
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   188
        for command, wrapper, opts in self._commandwrappers:
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   189
            entry = extensions.wrapcommand(commands.table, command, wrapper)
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   190
            if opts:
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   191
                for short, long, val, msg in opts:
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   192
                    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
   193
        for cont, funcname, wrapper in self._functionwrappers:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   194
            extensions.wrapfunction(cont, funcname, wrapper)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   195
        for c in self._uicallables:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   196
            c(ui)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   197
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   198
    def final_extsetup(self, ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   199
        """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
   200
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   201
        The following operations belong here:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   202
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   203
        - 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
   204
          extensions.find('mq'))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   205
        - Add a global option to all commands
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   206
        - Register revset functions
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   207
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   208
        knownexts = {}
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   209
        for name, symbol in self._revsetsymbols:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   210
            revset.symbols[name] = symbol
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   211
        for name, kw in self._templatekws:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   212
            templatekw.keywords[name] = kw
1218
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   213
        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
   214
            if ext not in knownexts:
1219
658b0d032699 wrapcommand: fix wrapping extensions that aren't enabled
Durham Goode <durham@fb.com>
parents: 1218
diff changeset
   215
                try:
658b0d032699 wrapcommand: fix wrapping extensions that aren't enabled
Durham Goode <durham@fb.com>
parents: 1218
diff changeset
   216
                    e = extensions.find(ext)
658b0d032699 wrapcommand: fix wrapping extensions that aren't enabled
Durham Goode <durham@fb.com>
parents: 1218
diff changeset
   217
                except KeyError:
658b0d032699 wrapcommand: fix wrapping extensions that aren't enabled
Durham Goode <durham@fb.com>
parents: 1218
diff changeset
   218
                    # 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
   219
                    # it.
658b0d032699 wrapcommand: fix wrapping extensions that aren't enabled
Durham Goode <durham@fb.com>
parents: 1218
diff changeset
   220
                    continue
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   221
                knownexts[ext] = e.cmdtable
1218
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   222
            entry = extensions.wrapcommand(knownexts[ext], command, wrapper)
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   223
            if opts:
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   224
                for short, long, val, msg in opts:
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   225
                    entry[1].append((short, long, val, msg))
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   226
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   227
        for c in self._extcallables:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   228
            c(ui)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   229
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   230
    def final_reposetup(self, ui, repo):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   231
        """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
   232
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   233
        The following operations belong here:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   234
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   235
        - All hooks but pre-* and post-*
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   236
        - Modify configuration variables
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   237
        - Changes to repo.__class__, repo.dirstate.__class__
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   238
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   239
        for c in self._repocallables:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   240
            c(ui, repo)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   241
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   242
    def uisetup(self, call):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   243
        """Decorated function will be executed during uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   244
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   245
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   246
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   247
            @eh.uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   248
            def setupbabar(ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   249
                print 'this is uisetup!'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   250
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   251
        self._uicallables.append(call)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   252
        return call
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   253
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   254
    def extsetup(self, call):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   255
        """Decorated function will be executed during extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   256
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   257
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   258
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   259
            @eh.extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   260
            def setupcelestine(ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   261
                print 'this is extsetup!'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   262
        """
672
f7834b360f8f evolve: fix extsetup extension helper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 671
diff changeset
   263
        self._extcallables.append(call)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   264
        return call
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   265
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   266
    def reposetup(self, call):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   267
        """Decorated function will be executed during reposetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   268
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   269
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   270
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   271
            @eh.reposetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   272
            def setupzephir(ui, repo):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   273
                print 'this is reposetup!'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   274
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   275
        self._repocallables.append(call)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   276
        return call
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   277
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   278
    def revset(self, symbolname):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   279
        """Decorated function is a revset symbol
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   280
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   281
        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
   282
        The symbol is added during `extsetup`.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   283
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   284
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   285
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   286
            @eh.revset('hidden')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   287
            def revsetbabar(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   288
                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
   289
                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
   290
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   291
        def dec(symbol):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   292
            self._revsetsymbols.append((symbolname, symbol))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   293
            return symbol
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   294
        return dec
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   295
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
    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
   298
        """Decorated function is a template keyword
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   299
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   300
        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
   301
        The symbol is added during `extsetup`.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   302
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   303
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   304
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   305
            @eh.templatekw('babar')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   306
            def kwbabar(ctx):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   307
                return 'babar'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   308
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   309
        def dec(keyword):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   310
            self._templatekws.append((keywordname, keyword))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   311
            return keyword
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   312
        return dec
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   313
1218
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   314
    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
   315
        """Decorated function is a command wrapper
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   316
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   317
        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
   318
        The wrapping is installed during `uisetup`.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   319
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   320
        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
   321
        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
   322
        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
   323
        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
   324
        installed during `extsetup`
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   325
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   326
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   327
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   328
            @eh.wrapcommand('summary')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   329
            def wrapsummary(orig, ui, repo, *args, **kwargs):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   330
                ui.note('Barry!')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   331
                return orig(ui, repo, *args, **kwargs)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   332
1218
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   333
        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
   334
        command.
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   335
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   336
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   337
        def dec(wrapper):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   338
            if extension is None:
1218
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   339
                self._commandwrappers.append((command, wrapper, opts))
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   340
            else:
1218
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   341
                self._extcommandwrappers.append((extension, command, wrapper,
dd5e62979100 wrapcommand: allow adding additional arguments to commands
Durham Goode <durham@fb.com>
parents: 1214
diff changeset
   342
                    opts))
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   343
            return wrapper
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   344
        return dec
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   345
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   346
    def wrapfunction(self, container, funcname):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   347
        """Decorated function is a function wrapper
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   348
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   349
        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
   350
        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
   351
        (there is no extension support)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   352
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   353
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   354
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   355
            @eh.function(discovery, 'checkheads')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   356
            def wrapfunction(orig, *args, **kwargs):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   357
                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
   358
                return orig(*args, **kwargs)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   359
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   360
        def dec(wrapper):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   361
            self._functionwrappers.append((container, funcname, wrapper))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   362
            return wrapper
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   363
        return dec
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   364
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   365
    def addattr(self, container, funcname):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   366
        """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
   367
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   368
        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
   369
        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
   370
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   371
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   372
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   373
            @eh.function(context.changectx, 'babar')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   374
            def babar(ctx):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   375
                return 'babar' in ctx.description
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   376
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   377
        def dec(func):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   378
            self._duckpunchers.append((container, funcname, func))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   379
            return func
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   380
        return dec
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   381
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   382
eh = exthelper()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   383
uisetup = eh.final_uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   384
extsetup = eh.final_extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   385
reposetup = eh.final_reposetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   386
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   387
#####################################################################
1213
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   388
### Option configuration                                          ###
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   389
#####################################################################
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
@eh.reposetup # must be the first of its kin.
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   392
def _configureoptions(ui, repo):
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   393
    # If no capabilities are specified, enable everything.
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   394
    # 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
   395
    evolveopts = ui.configlist('experimental', 'evolution')
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   396
    if not evolveopts:
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   397
        evolveopts = ['all']
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   398
        ui.setconfig('experimental', 'evolution', evolveopts)
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   399
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   400
@eh.uisetup
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   401
def _configurecmdoptions(ui):
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   402
    # Unregister evolve commands if the command capability is not specified.
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   403
    #
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   404
    # 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
   405
    # guarantee it happens after the above configuration, but before the
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   406
    # extsetup functions.
1441
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   407
    evolvecommands = ui.configlist('experimental', 'evolutioncommands')
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   408
    evolveopts = ui.configlist('experimental', 'evolution')
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   409
    if evolveopts and (commandopt not in evolveopts and
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
   410
                       'all' not in evolveopts):
1441
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   411
        # 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
   412
        whitelist = set()
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   413
        for cmd in evolvecommands:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   414
            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
   415
            if not matchingevolvecommands:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   416
                raise error.Abort(_('unknown command: %s') % cmd)
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   417
            elif len(matchingevolvecommands) > 1:
1442
6a219f8089f9 evolve: better error message when command is Ambiguous
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1441
diff changeset
   418
                raise error.Abort(_('ambiguous command specification: "%s" matches %r')
6a219f8089f9 evolve: better error message when command is Ambiguous
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1441
diff changeset
   419
                                  % (cmd, matchingevolvecommands))
1441
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   420
            else:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   421
                whitelist.add(matchingevolvecommands[0])
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   422
        for disabledcmd in set(cmdtable) - whitelist:
a4abe588d77f evolve: mechanism to load some commands selectively
Laurent Charignon <lcharignon@fb.com>
parents: 1440
diff changeset
   423
            del cmdtable[disabledcmd]
1213
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   424
7118996bdf43 config: enable all obsolete options
Durham Goode <durham@fb.com>
parents: 1212
diff changeset
   425
#####################################################################
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
   426
### 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
   427
#####################################################################
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
976
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   429
commitopts3 = [
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   430
    ('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
   431
     _('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
   432
    ('U', 'current-user', None,
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
   433
     _('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
   434
]
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   435
985
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
   436
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
   437
    """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
   438
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   439
    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
   440
    -d was supplied.
577
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   441
    """
976
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   442
    # 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
   443
    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
   444
        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
   445
    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
   446
        opts['user'] = ui.username()
577
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   447
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   448
getrevs = obsolete.getrevs
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   449
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
### Additional Utilities                                          ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   452
#####################################################################
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
# 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
   455
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   456
# - Function to create markers
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   457
# - 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
   458
# - "troubles" method on changectx
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   459
# - function to travel throught the obsolescence graph
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   460
# - function to find useful changeset to stabilize
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   461
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   462
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   463
### Useful alias
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   464
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   465
@eh.uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   466
def _installalias(ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   467
    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
   468
        ui.setconfig('alias', 'pstatus', 'status --rev .^')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   469
    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
   470
        ui.setconfig('alias', 'pdiff', 'diff --rev .^')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   471
    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
   472
        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
   473
    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
   474
        ui.setconfig('alias', 'odiff',
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   475
            "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
   476
    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
   477
        if os.name == 'nt':
cb36a4eb0157 evolve: fix the 'grab' alias to work on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1101
diff changeset
   478
            ui.setconfig('alias', 'grab',
1109
212f24013455 evolve: really fix the 'grab' alias on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1106
diff changeset
   479
                "! " + 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
   480
                 + util.hgexecutable() + " up tip")
cb36a4eb0157 evolve: fix the 'grab' alias to work on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1101
diff changeset
   481
        else:
cb36a4eb0157 evolve: fix the 'grab' alias to work on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1101
diff changeset
   482
            ui.setconfig('alias', 'grab',
cb36a4eb0157 evolve: fix the 'grab' alias to work on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 1101
diff changeset
   483
                "! $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
   484
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   485
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   486
### Troubled revset symbol
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   487
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   488
@eh.revset('troubled')
594
7f89b31fcb26 merge bumped rename
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 592 593
diff changeset
   489
def revsettroubled(repo, subset, x):
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   490
    """``troubled()``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   491
    Changesets with troubles.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   492
    """
993
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
   493
    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
   494
    troubled = set()
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
   495
    troubled.update(getrevs(repo, 'unstable'))
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
   496
    troubled.update(getrevs(repo, 'bumped'))
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
   497
    troubled.update(getrevs(repo, 'divergent'))
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
   498
    troubled = revset.baseset(troubled)
61849d45d47e evolve: move 'troubled()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1380
diff changeset
   499
    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
   500
    return subset & troubled
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   501
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   502
### Obsolescence graph
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   503
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   504
# 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
   505
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   506
def _precursors(repo, s):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   507
    """Precursor of a changeset"""
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   508
    cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   509
    nm = repo.changelog.nodemap
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   510
    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
   511
    node = repo.changelog.node
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   512
    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
   513
        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
   514
            pr = nm.get(p[0])
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   515
            if pr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   516
                cs.add(pr)
1383
cf62abb62941 evolve: move 'precursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1382
diff changeset
   517
    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
   518
    return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   519
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   520
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
   521
    """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
   522
    node = repo.changelog.node
a127f0f3bf5f evolve: avoid creating changectx object in _allprecursors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1377
diff changeset
   523
    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
   524
    seen = set()
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   525
    allsubjects = repo.obsstore.precursors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   526
    while toproceed:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   527
        nc = toproceed.pop()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   528
        for mark in allsubjects.get(nc, ()):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   529
            np = mark[0]
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   530
            if np not in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   531
                seen.add(np)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   532
                toproceed.append(np)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   533
    nm = repo.changelog.nodemap
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   534
    cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   535
    for p in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   536
        pr = nm.get(p)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   537
        if pr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   538
            cs.add(pr)
1384
64c8b8c27811 evolve: move 'allprecursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1383
diff changeset
   539
    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
   540
    return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   541
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   542
def _successors(repo, s):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   543
    """Successors of a changeset"""
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   544
    cs = set()
1379
693cdcd809f2 evolve: avoid creating changectx object in _successors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1378
diff changeset
   545
    node = repo.changelog.node
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   546
    nm = repo.changelog.nodemap
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   547
    markerbyobj = repo.obsstore.successors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   548
    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
   549
        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
   550
            for sub in p[1]:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   551
                sr = nm.get(sub)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   552
                if sr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   553
                    cs.add(sr)
1385
c2584407afbf evolve: move 'successors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1384
diff changeset
   554
    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
   555
    return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   556
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   557
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
   558
    """transitive successors of a subset
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   559
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   560
    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
   561
    marker.  """
1380
43dcf62237be evolve: avoid creating changectx object in _allsuccessors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1379
diff changeset
   562
    node = repo.changelog.node
43dcf62237be evolve: avoid creating changectx object in _allsuccessors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1379
diff changeset
   563
    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
   564
    seen = set()
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   565
    allobjects = repo.obsstore.successors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   566
    while toproceed:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   567
        nc = toproceed.pop()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   568
        for mark in allobjects.get(nc, ()):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   569
            if mark[2] & haltonflags:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   570
                continue
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   571
            for sub in mark[1]:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   572
                if sub == nullid:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   573
                    continue # should not be here!
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   574
                if sub not in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   575
                    seen.add(sub)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   576
                    toproceed.append(sub)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   577
    nm = repo.changelog.nodemap
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   578
    cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   579
    for s in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   580
        sr = nm.get(s)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   581
        if sr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   582
            cs.add(sr)
1386
b5eaec8a53d0 evolve: move 'allsuccessors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1385
diff changeset
   583
    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
   584
    return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   585
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
### Extending revset and template                                 ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   591
#####################################################################
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
# 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
   594
# they are subject to changes
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   595
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
### 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
   598
@eh.revset('suspended')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   599
def revsetsuspended(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   600
    """``suspended()``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   601
    Obsolete changesets with non-obsolete descendants.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   602
    """
1307
677c5da57b9c evolve: remove unused variables
Laurent Charignon <lcharignon@fb.com>
parents: 1306
diff changeset
   603
    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
   604
    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
   605
    suspended.sort()
c431f827f366 evolve: move 'suspended()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1381
diff changeset
   606
    return subset & suspended
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   607
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
@eh.revset('precursors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   610
def revsetprecursors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   611
    """``precursors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   612
    Immediate precursors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   613
    """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
   614
    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
   615
    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
   616
    s.sort()
cf62abb62941 evolve: move 'precursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1382
diff changeset
   617
    return subset & s
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   618
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   619
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   620
@eh.revset('allprecursors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   621
def revsetallprecursors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   622
    """``allprecursors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   623
    Transitive precursors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   624
    """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
   625
    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
   626
    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
   627
    s.sort()
64c8b8c27811 evolve: move 'allprecursors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1383
diff changeset
   628
    return subset & s
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   629
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
@eh.revset('successors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   632
def revsetsuccessors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   633
    """``successors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   634
    Immediate successors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   635
    """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
   636
    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
   637
    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
   638
    s.sort()
c2584407afbf evolve: move 'successors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1384
diff changeset
   639
    return subset & s
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   640
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   641
@eh.revset('allsuccessors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   642
def revsetallsuccessors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   643
    """``allsuccessors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   644
    Transitive successors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   645
    """
1204
161b8f6e7402 evolve: use 3.2+ fullreposet to evaluate argument set (issue4515)
Yuya Nishihara <yuya@tcha.org>
parents: 1203
diff changeset
   646
    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
   647
    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
   648
    s.sort()
b5eaec8a53d0 evolve: move 'allsuccessors()' to smarted usage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1385
diff changeset
   649
    return subset & s
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   650
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   651
### template keywords
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   652
# XXX it does not handle troubles well :-/
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   653
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   654
@eh.templatekw('obsolete')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   655
def obsoletekw(repo, ctx, templ, **args):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   656
    """: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
   657
    ``stable``, ``unstable``, ``suspended`` or ``extinct``.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   658
    """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   659
    if ctx.obsolete():
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   660
        if ctx.extinct():
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   661
            return 'extinct'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   662
        else:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   663
            return 'suspended'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   664
    elif ctx.unstable():
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   665
        return 'unstable'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   666
    return 'stable'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   667
1399
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
   668
@eh.templatekw('troubles')
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
   669
def showtroubles(repo, ctx, **args):
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
   670
    """: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
   671
    (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
   672
    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
   673
                               **args)
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
   674
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   675
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   676
### Various trouble warning                                       ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   677
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   678
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   679
# 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
   680
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   681
@eh.wrapcommand("update")
745
99e51aff724b add obsolete parents wrapper to the 'parents' command
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 743
diff changeset
   682
@eh.wrapcommand("parents")
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   683
@eh.wrapcommand("pull")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   684
def wrapmayobsoletewc(origfn, ui, repo, *args, **opts):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   685
    """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
   686
    def warnobsolete():
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
   687
        if repo['.'].obsolete():
1303
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1302
diff changeset
   688
            ui.warn(_('working directory parent is obsolete!\n'))
1443
6c122c975125 evolve: add a hint when the parent working copy become obsolete
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1442
diff changeset
   689
            if (not ui.quiet) and obsolete.isenabled(repo, commandopt):
6c122c975125 evolve: add a hint when the parent working copy become obsolete
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1442
diff changeset
   690
                ui.warn(_('(use "hg evolve" to update to its successor)\n'))
1452
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
   691
    wlock = None
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
   692
    try:
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
   693
        wlock = repo.wlock()
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
   694
        repo._afterlock(warnobsolete)
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
   695
        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
   696
    finally:
1bcbd14cf159 merge back with 3.3 compat branch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1451
diff changeset
   697
        lockmod.release(wlock)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   698
    return res
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   699
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   700
# XXX this could wrap transaction code
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   701
# 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
   702
@eh.wrapcommand("commit")
763
966e2659e989 import: warn about new unstable changesets
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 762
diff changeset
   703
@eh.wrapcommand("import")
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   704
@eh.wrapcommand("push")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   705
@eh.wrapcommand("pull")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   706
@eh.wrapcommand("graft")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   707
@eh.wrapcommand("phase")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   708
@eh.wrapcommand("unbundle")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   709
def warnobserrors(orig, ui, repo, *args, **kwargs):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   710
    """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
   711
    # 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
   712
    # 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
   713
    filtered = repo.changelog.filteredrevs
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
   714
    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
   715
    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
   716
    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
   717
    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
   718
    # workaround phase stupidity
649
d318fbb1cd67 evolve: stop working around phase limitation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 647
diff changeset
   719
    #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
   720
    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
   721
    newunstables = \
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   722
        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
   723
    newbumpeds = \
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   724
        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
   725
    newdivergents = \
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   726
        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
   727
    if newunstables > 0:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   728
        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
   729
    if newbumpeds > 0:
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
   730
        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
   731
    if newdivergents > 0:
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
   732
        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
   733
    return ret
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   734
1122
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   735
@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
   736
def push(orig, repo, *args, **opts):
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
   737
    """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
   738
    """
1122
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   739
    try:
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   740
        return orig(repo, *args, **opts)
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   741
    except util.Abort, ex:
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   742
        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
   743
                 "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
   744
        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
   745
            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
   746
            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
   747
            ex.hint = hint
c8750f4388c8 evolve: wrap exchange.push() for compatability with core mercurial 4d52e6eb98ea
Matt Harbison <matt_harbison@yahoo.com>
parents: 1120
diff changeset
   748
        raise
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   749
788
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
   750
def summaryhook(ui, repo):
513
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   751
    def write(fmt, count):
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   752
        s = fmt % count
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   753
        if count:
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   754
            ui.write(s)
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   755
        else:
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   756
            ui.note(s)
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   757
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   758
    nbunstable = len(getrevs(repo, 'unstable'))
594
7f89b31fcb26 merge bumped rename
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 592 593
diff changeset
   759
    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
   760
    nbdivergent = len(getrevs(repo, 'divergent'))
513
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   761
    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
   762
    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
   763
    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
   764
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
   765
@eh.extsetup
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
   766
def obssummarysetup(ui):
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
   767
    cmdutil.summaryhooks.add('evolve', summaryhook)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   768
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   769
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   770
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   771
### Core Other extension compat                                   ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   772
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   773
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   774
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   775
@eh.extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   776
def _rebasewrapping(ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   777
    # warning about more obsolete
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   778
    try:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   779
        rebase = extensions.find('rebase')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   780
        if rebase:
572
dc107acd0bd2 adapt to core rebase support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 571
diff changeset
   781
            extensions.wrapcommand(rebase.cmdtable, 'rebase', warnobserrors)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   782
    except KeyError:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   783
        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
   784
    try:
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
   785
        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
   786
        if histedit:
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
   787
            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
   788
    except KeyError:
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
   789
        pass  # rebase not found
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   790
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   791
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   792
### Old Evolve extension content                                  ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   793
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   794
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   795
# 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
   796
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   797
### util function
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   798
#############################
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   799
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   800
### changeset rewriting logic
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   801
#############################
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   802
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   803
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
   804
    """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
   805
    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
   806
    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
   807
    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
   808
    """
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
   809
    wlock = lock = tr = None
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
   810
    try:
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
   811
        wlock = repo.wlock()
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
   812
        lock = repo.lock()
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
   813
        tr = repo.transaction('rewrite')
1505
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   814
        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
   815
            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
   816
        base = old.p1()
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
   817
        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
   818
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   819
        # 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
   820
        # 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
   821
        files = set(old.files())
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   822
        for u in updates:
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   823
            files.update(u.files())
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   824
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   825
        # 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
   826
        copied = copies.pathcopies(base, head)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   827
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
        # 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
   830
        def samefile(f):
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   831
            if f in head.manifest():
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   832
                a = head.filectx(f)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   833
                if f in base.manifest():
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   834
                    b = base.filectx(f)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   835
                    return (a.data() == b.data()
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   836
                            and a.flags() == b.flags())
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   837
                else:
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   838
                    return False
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   839
            else:
1505
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   840
                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
   841
        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
   842
        # 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
   843
        headmf = head.manifest()
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   844
        def filectxfn(repo, ctx, path):
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   845
            if path in headmf:
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   846
                fctx = head[path]
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   847
                flags = fctx.flags()
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   848
                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
   849
                                  islink='l' in flags,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   850
                                  isexec='x' in flags,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   851
                                  copied=copied.get(path))
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   852
                return mctx
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   853
            return None
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   854
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   855
        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
   856
        if not message:
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   857
            message = old.description()
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   858
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   859
        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
   860
        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
   861
        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
   862
        extra['branch'] = head.branch()
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   863
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   864
        new = context.memctx(repo,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   865
                             parents=newbases,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   866
                             text=message,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   867
                             files=files,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   868
                             filectxfn=filectxfn,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   869
                             user=user,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   870
                             date=date,
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   871
                             extra=extra)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   872
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   873
        if commitopts.get('edit'):
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   874
            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
   875
        revcount = len(repo)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   876
        newid = repo.commitctx(new)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   877
        new = repo[newid]
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   878
        created = len(repo) != revcount
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   879
        updatebookmarks(newid)
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   880
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
   881
        tr.close()
1505
53a6dbc33e36 evolve: indentation change for making next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 1504
diff changeset
   882
        return newid, created
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
   883
    finally:
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
   884
        lockmod.release(lock, wlock, tr)
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   885
463
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
   886
class MergeFailure(util.Abort):
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
   887
    pass
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
   888
1141
ca17770d2ee9 evolve: preserve branch change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1140
diff changeset
   889
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
   890
    """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
   891
    if orig.rev() == dest.rev():
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   892
        raise util.Abort(_('tried to relocate a node on top of itself'),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   893
                         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
   894
                                "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
   895
                                "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
   896
                                "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
   897
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   898
    if not orig.p2().rev() == node.nullrev:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   899
        raise util.Abort(
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   900
            'no support for evolving merge changesets yet',
1116
d4977b04ef98 evolve: update evolve merge message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1112
diff changeset
   901
            hint="Redo the merge and use `hg prune <old> --succ <new>` 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
   902
    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
   903
    nodesrc = orig.node()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   904
    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
   905
    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
   906
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
   907
    cache = {}
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
   908
    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
   909
    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
   910
    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
   911
        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
   912
        try:
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
   913
            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
   914
        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
   915
            continue
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
   916
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
   917
        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
   918
            continue
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
   919
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
   920
        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
   921
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
   922
        # 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
   923
        # 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
   924
        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
   925
            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
   926
            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
   927
        else:
6b0cf1b73693 evolve: replace each obsolete sha1 in the description with its latest successor
Matt Harbison <matt_harbison@yahoo.com>
parents: 1104
diff changeset
   928
            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
   929
                           '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
   930
1023
7c8e3941241f relocate: add transaction around phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1022
diff changeset
   931
    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
   932
    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
   933
        try:
1183
58370c718183 evolve: use `merge.graft` instead of `rebasenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1177
diff changeset
   934
            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
   935
                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
   936
            if bmactive(repo):
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
   937
                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
   938
            bmdeactivate(repo)
1184
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
   939
            if keepbranch:
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
   940
                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
   941
            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
   942
            if r[-1]:  #some conflict
550
362e65fc6146 evolve-cmd: fix merge error detection for external tools.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 549
diff changeset
   943
                raise util.Abort(
362e65fc6146 evolve-cmd: fix merge error detection for external tools.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 549
diff changeset
   944
                        '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
   945
            if commitmsg is None:
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
   946
                commitmsg = orig.description()
1510
b86eea66ed02 evolve: be more complete about copying extra from old revisions
Augie Fackler <raf@durin42.com>
parents: 1509
diff changeset
   947
            extra = dict(orig.extra())
b86eea66ed02 evolve: be more complete about copying extra from old revisions
Augie Fackler <raf@durin42.com>
parents: 1509
diff changeset
   948
            if 'branch' in extra:
b86eea66ed02 evolve: be more complete about copying extra from old revisions
Augie Fackler <raf@durin42.com>
parents: 1509
diff changeset
   949
                del extra['branch']
b86eea66ed02 evolve: be more complete about copying extra from old revisions
Augie Fackler <raf@durin42.com>
parents: 1509
diff changeset
   950
            extra['rebase_source'] = orig.hex()
1141
ca17770d2ee9 evolve: preserve branch change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1140
diff changeset
   951
1184
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
   952
            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
   953
            try:
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
   954
                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
   955
                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
   956
                # 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
   957
                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
   958
                                      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
   959
            finally:
bc601c010185 evolve: remove the use of `rebase.concludenode`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1183
diff changeset
   960
                repo.ui.restoreconfig(backup)
463
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
   961
        except util.Abort, exc:
1131
a44a26f8cc48 evolve: adapt to change in core rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1129
diff changeset
   962
            repo.dirstate.beginparentchange()
a44a26f8cc48 evolve: adapt to change in core rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1129
diff changeset
   963
            repo.setparents(repo['.'].node(), nullid)
a44a26f8cc48 evolve: adapt to change in core rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1129
diff changeset
   964
            repo.dirstate.write()
a44a26f8cc48 evolve: adapt to change in core rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1129
diff changeset
   965
            # 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
   966
            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
   967
            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
   968
            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
   969
                pass
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
   970
            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
   971
            raise
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
   972
        oldbookmarks = repo.nodebookmarks(nodesrc)
284
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
   973
        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
   974
            phases.retractboundary(repo, tr, destphase, [nodenew])
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
   975
            obsolete.createmarkers(repo, [(repo[nodesrc], (repo[nodenew],))])
284
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
   976
            for book in oldbookmarks:
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
   977
                repo._bookmarks[book] = nodenew
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
   978
        else:
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
   979
            obsolete.createmarkers(repo, [(repo[nodesrc], ())])
284
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
   980
            # Behave like rebase, move bookmarks to dest
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
   981
            for book in oldbookmarks:
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
   982
                repo._bookmarks[book] = dest.node()
139
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
   983
        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
   984
            repo._bookmarks[book] = dest.node()
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
   985
        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
   986
            repo._bookmarks.recordchange(tr)
1023
7c8e3941241f relocate: add transaction around phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1022
diff changeset
   987
        tr.close()
7c8e3941241f relocate: add transaction around phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1022
diff changeset
   988
    finally:
7c8e3941241f relocate: add transaction around phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1022
diff changeset
   989
        tr.release()
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   990
    return nodenew
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
   991
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
   992
def _bookmarksupdater(repo, oldid, tr):
313
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   993
    """Return a callable update(newid) updating the current bookmark
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   994
    and bookmarks bound to oldid to newid.
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   995
    """
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   996
    def updatebookmarks(newid):
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   997
        dirty = False
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   998
        oldbookmarks = repo.nodebookmarks(oldid)
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   999
        if oldbookmarks:
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
  1000
            for b in oldbookmarks:
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
  1001
                repo._bookmarks[b] = newid
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
  1002
            dirty = True
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
  1003
        if dirty:
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
  1004
            repo._bookmarks.recordchange(tr)
313
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
  1005
    return updatebookmarks
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
  1006
1330
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
  1007
### bookmarks api compatibility layer ###
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
  1008
def bmdeactivate(repo):
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
  1009
    try:
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
  1010
        return bookmarks.deactivate(repo)
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
  1011
    except AttributeError:
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
  1012
        return bookmarks.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
  1013
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
  1014
    try:
87aceaed5c69 prune: use the bookmark wrapper for 3.4 compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1386
diff changeset
  1015
        return bookmarks.activate(repo, book)
87aceaed5c69 prune: use the bookmark wrapper for 3.4 compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1386
diff changeset
  1016
    except AttributeError:
87aceaed5c69 prune: use the bookmark wrapper for 3.4 compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1386
diff changeset
  1017
        return bookmarks.setcurrent(repo, book)
1330
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
  1018
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
  1019
def bmactive(repo):
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
  1020
    try:
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
  1021
        return repo._activebookmark
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
  1022
    except AttributeError:
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
  1023
        return repo._bookmarkcurrent
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
  1024
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  1025
### new command
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  1026
#############################
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1027
metadataopts = [
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1028
    ('d', 'date', '',
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1029
     _('record the specified date in metadata'), _('DATE')),
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1030
    ('u', 'user', '',
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1031
     _('record the specified user in metadata'), _('USER')),
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1032
]
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1033
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
  1034
@eh.uisetup
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
  1035
def _installimportobsolete(ui):
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
  1036
    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
  1037
    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
  1038
                    _('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
  1039
                      '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
  1040
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
  1041
@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
  1042
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
  1043
    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
  1044
    if util.safehasattr(extracted, 'get'):
91b6a30424a3 evolve: compatibility with coming 3.6
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1503
diff changeset
  1045
        # 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
  1046
        expected = extracted.get('nodeid')
91b6a30424a3 evolve: compatibility with coming 3.6
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1503
diff changeset
  1047
    else:
91b6a30424a3 evolve: compatibility with coming 3.6
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1503
diff changeset
  1048
        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
  1049
    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
  1050
        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
  1051
    oldextract = patch.extract
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
  1052
    try:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
  1053
        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
  1054
        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
  1055
    finally:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
  1056
        patch.extract = oldextract
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
  1057
    created = ret[1]
1055
cfe1b9d3e5d9 import: handle patch with no node information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1054
diff changeset
  1058
    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
  1059
        and created != expected):
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
  1060
            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
  1061
            try:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
  1062
                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
  1063
                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
  1064
                                     metadata=metadata)
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
  1065
                tr.close()
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
  1066
            finally:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
  1067
                tr.release()
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
  1068
    return ret
930
cac35bef8aee import: --obsolete flag for automatic obsolescence marker creation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 927
diff changeset
  1069
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  1070
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1071
def _deprecatealias(oldalias, newalias):
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1072
    '''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
  1073
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1074
    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
  1075
    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
  1076
    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
  1077
    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
  1078
    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
  1079
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1080
    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
  1081
    '''
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  1082
    try:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  1083
        aliases, entry = cmdutil.findcmd(newalias, cmdtable)
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  1084
    except error.UnknownCommand:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  1085
        # Commands may be disabled
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  1086
        return
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1087
    for alias, e in cmdtable.iteritems():
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1088
        if e is entry:
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1089
            break
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1090
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1091
    synopsis = '(DEPRECATED)'
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1092
    if len(entry) > 2:
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1093
        fn, opts, _syn = entry
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1094
    else:
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1095
        fn, opts, = entry
1496
62aa11956a40 evolve: _() should not contain %
timeless@mozdev.org
parents: 1495
diff changeset
  1096
    deprecationwarning = _('%s have been deprecated in favor of %s\n') % (
62aa11956a40 evolve: _() should not contain %
timeless@mozdev.org
parents: 1495
diff changeset
  1097
        oldalias, newalias)
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1098
    def newfn(*args, **kwargs):
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1099
        ui = args[0]
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1100
        ui.warn(deprecationwarning)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1101
        util.checksignature(fn)(*args, **kwargs)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1102
    newfn.__doc__  = deprecationwarning
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1103
    cmdwrapper = command(oldalias, opts, synopsis)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1104
    cmdwrapper(newfn)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1105
895
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
  1106
@eh.extsetup
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
  1107
def deprecatealiases(ui):
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
  1108
    _deprecatealias('gup', 'next')
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
  1109
    _deprecatealias('gdown', 'previous')
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1110
811
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1111
@command('debugrecordpruneparents', [], '')
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1112
def cmddebugrecordpruneparents(ui, repo):
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1113
    """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
  1114
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1115
    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
  1116
    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
  1117
    created."""
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1118
    pgop = 'reading markers'
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1119
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1120
    # 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
  1121
    wlock = lock = tr = None
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1122
    try:
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1123
        wlock = repo.wlock()
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1124
        lock = repo.lock()
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1125
        tr = repo.transaction('recordpruneparents')
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1126
        unfi = repo.unfiltered()
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1127
        nm = unfi.changelog.nodemap
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1128
        store = repo.obsstore
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1129
        pgtotal = len(store._all)
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1130
        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
  1131
            if not mark[1]:
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1132
                rev = nm.get(mark[0])
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1133
                if rev is not None:
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1134
                    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
  1135
                    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
  1136
                    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
  1137
                    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
  1138
                                 parents=parents)
811
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1139
                    if len(store._all) - before:
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1140
                        ui.write('created new markers for %i\n' % rev)
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1141
            ui.progress(pgop, idx, total=pgtotal)
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1142
        tr.close()
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1143
        ui.progress(pgop, None)
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1144
    finally:
1018
30262465b932 debugrecordpruneparents: release tr the same way than the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1017
diff changeset
  1145
        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
  1146
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1147
@command('debugobsstorestat', [], '')
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1148
def cmddebugobsstorestat(ui, repo):
1315
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1149
    def _updateclustermap(nodes, mark, clustersmap):
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1150
        c = (set(nodes), set([mark]))
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1151
        toproceed = set(nodes)
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1152
        while toproceed:
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1153
            n = toproceed.pop()
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1154
            other = clustersmap.get(n)
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1155
            if (other is not None
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1156
                and other is not c):
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1157
                other[0].update(c[0])
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1158
                other[1].update(c[1])
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1159
                for on in c[0]:
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1160
                    if on in toproceed:
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1161
                        continue
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1162
                    clustersmap[on] = other
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1163
                c = other
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1164
            clustersmap[n] = c
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1165
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1166
    """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
  1167
    store = repo.obsstore
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1168
    unfi = repo.unfiltered()
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1169
    nm = unfi.changelog.nodemap
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1170
    ui.write('markers total:              %9i\n' % len(store._all))
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1171
    sucscount = [0, 0 , 0, 0]
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1172
    known = 0
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1173
    parentsdata = 0
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1174
    metakeys = {}
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1175
    # node -> cluster mapping
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1176
    #   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
  1177
    clustersmap = {}
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1178
    # same data using parent information
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1179
    pclustersmap= {}
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1180
    for mark in store:
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1181
        if mark[0] in nm:
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1182
            known += 1
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1183
        nbsucs = len(mark[1])
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1184
        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
  1185
        meta = mark[3]
da565c825429 evolve: adapt to the new metadata storage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1128
diff changeset
  1186
        for key, value in meta:
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1187
            metakeys.setdefault(key, 0)
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1188
            metakeys[key] += 1
1129
da565c825429 evolve: adapt to the new metadata storage
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1128
diff changeset
  1189
        meta = dict(meta)
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1190
        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
  1191
        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
  1192
        if parents:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1193
            parentsdata += 1
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1194
        # cluster handling
1315
445d7f46f25d evolve: refactor code computing stats of obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1314
diff changeset
  1195
        nodes = set(mark[1])
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1196
        nodes.add(mark[0])
1468
bc6cf6cc06fd evolve: remove trailing spaces
André Sintzoff <andre.sintzoff@gmail.com>
parents: 1467
diff changeset
  1197
        _updateclustermap(nodes, mark, clustersmap)
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1198
        # same with parent data
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1199
        nodes.update(parents)
1468
bc6cf6cc06fd evolve: remove trailing spaces
André Sintzoff <andre.sintzoff@gmail.com>
parents: 1467
diff changeset
  1200
        _updateclustermap(nodes, mark, pclustersmap)
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1201
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1202
    # freezing the result
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1203
    for c in clustersmap.values():
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1204
        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
  1205
        for n in fc[0]:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1206
            clustersmap[n] = fc
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1207
    # same with parent data
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1208
    for c in pclustersmap.values():
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1209
        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
  1210
        for n in fc[0]:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1211
            pclustersmap[n] = fc
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1212
    ui.write('    for known precursors:   %9i\n' % known)
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1213
    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
  1214
    # successors data
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1215
    ui.write('markers with no successors: %9i\n' % sucscount[0])
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1216
    ui.write('              1 successors: %9i\n' % sucscount[1])
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1217
    ui.write('              2 successors: %9i\n' % sucscount[2])
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1218
    ui.write('    more than 2 successors: %9i\n' % sucscount[3])
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1219
    # meta data info
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1220
    ui.write('    available  keys:\n')
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1221
    for key in sorted(metakeys):
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1222
        ui.write('    %15s:        %9i\n' % (key, metakeys[key]))
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1223
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1224
    allclusters = list(set(clustersmap.values()))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1225
    allclusters.sort(key=lambda x: len(x[1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1226
    ui.write('disconnected clusters:      %9i\n' % len(allclusters))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1227
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1228
    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
  1229
             % len([c for c in allclusters
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1230
                    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
  1231
    if allclusters:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1232
        nbcluster = len(allclusters)
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1233
        ui.write('        smallest length:    %9i\n' % len(allclusters[0][1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1234
        ui.write('        longer length:      %9i\n' % len(allclusters[-1][1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1235
        median = len(allclusters[nbcluster//2][1])
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1236
        ui.write('        median length:      %9i\n' % median)
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1237
        mean = sum(len(x[1]) for x in allclusters) // nbcluster
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1238
        ui.write('        mean length:        %9i\n' % mean)
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1239
    allpclusters = list(set(pclustersmap.values()))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1240
    allpclusters.sort(key=lambda x: len(x[1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1241
    ui.write('    using parents data:     %9i\n' % len(allpclusters))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1242
    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
  1243
             % len([c for c in allclusters
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1244
                    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
  1245
    if allpclusters:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1246
        nbcluster = len(allpclusters)
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1247
        ui.write('        smallest length:    %9i\n' % len(allpclusters[0][1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1248
        ui.write('        longer length:      %9i\n' % len(allpclusters[-1][1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1249
        median = len(allpclusters[nbcluster//2][1])
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1250
        ui.write('        median length:      %9i\n' % median)
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1251
        mean = sum(len(x[1]) for x in allpclusters) // nbcluster
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1252
        ui.write('        mean length:        %9i\n' % mean)
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  1253
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1254
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
  1255
    """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
  1256
    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
  1257
    try:
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
  1258
        wlock = repo.wlock()
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
  1259
        lock = repo.lock()
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
  1260
        tr = repo.transaction("evolve")
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1261
        if 'unstable' == category:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1262
            result = _solveunstable(ui, repo, ctx, dryrun, confirm, progresscb)
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1263
        elif 'bumped' == category:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1264
            result = _solvebumped(ui, repo, ctx, dryrun, confirm, progresscb)
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1265
        elif 'divergent' == category:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1266
            result = _solvedivergent(ui, repo, ctx, dryrun, confirm,
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1267
                                   progresscb)
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1268
        else:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1269
            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
  1270
        tr.close()
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
  1271
        return result
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
  1272
    finally:
b5cd96395867 evolve: extract the logic to solve one change into a method
Laurent Charignon <lcharignon@fb.com>
parents: 1319
diff changeset
  1273
        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
  1274
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1275
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
  1276
    """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
  1277
    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
  1278
    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
  1279
    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
  1280
    msg = None
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1281
    hint = None
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1282
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1283
    troubled = {
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1284
            "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
  1285
            "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
  1286
            "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
  1287
            "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
  1288
    }
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1289
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1290
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1291
    hintmap = {
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1292
            '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
  1293
            '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
  1294
            '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
  1295
            '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
  1296
            '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
  1297
                                    " or --unstable"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1298
            '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
  1299
            '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
  1300
            '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
  1301
                                      " --bumped or --divergent"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1302
            '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
  1303
                                     "--bumped or --unstable"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1304
            '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
  1305
                               " --divergent"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1306
            '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
  1307
                                        " 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
  1308
            '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
  1309
                              "and --unstable"),
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1310
    }
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
    if revopt:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1313
        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
  1314
        if not revs:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1315
            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
  1316
        else:
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1317
            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
  1318
            othertroubles = []
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1319
            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
  1320
                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
  1321
                    othertroubles.append(cat)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1322
            if othertroubles:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1323
                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
  1324
1422
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
  1325
    elif anyopt:
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1326
        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
  1327
        othertroubles = []
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1328
        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
  1329
            if troubled[cat]:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1330
                othertroubles.append(cat)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1331
        if othertroubles:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1332
            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
  1333
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1334
    else:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1335
        # 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
  1336
        if targetcat == 'unstable':
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1337
            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
  1338
        else:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1339
            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
  1340
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1341
        p1 = repo['.'].rev()
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1342
        othertroubles = []
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1343
        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
  1344
            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
  1345
                othertroubles.append(cat)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1346
        if othertroubles:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1347
            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
  1348
        else:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1349
            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
  1350
            if l:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1351
                hint = (_("%d other %s in the repository, do you want --any or --rev")
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1352
                        % (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
  1353
            else:
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1354
                othertroubles = []
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1355
                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
  1356
                    if troubled[cat]:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1357
                        othertroubles.append(cat)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1358
                if othertroubles:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1359
                    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
  1360
                else:
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1361
                    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
  1362
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1363
    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
  1364
    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
  1365
    if hint:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1366
        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
  1367
        return 2
f11363699766 evolve: refactoring of the code displaying error when no trouble found
Laurent Charignon <lcharignon@fb.com>
parents: 1315
diff changeset
  1368
    else:
f11363699766 evolve: refactoring of the code displaying error when no trouble found
Laurent Charignon <lcharignon@fb.com>
parents: 1315
diff changeset
  1369
        return 1
1324
739208d1ee62 evolve: extract cleanup logic in the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1323
diff changeset
  1370
739208d1ee62 evolve: extract cleanup logic in the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1323
diff changeset
  1371
def _cleanup(ui, repo, startnode, showprogress):
739208d1ee62 evolve: extract cleanup logic in the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1323
diff changeset
  1372
    if showprogress:
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1373
        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
  1374
    if repo['.'] != startnode:
bac4e0bc9f6a evolve: write a status message when the working directory changes
David Soria Parra <davidsp@fb.com>
parents: 1067
diff changeset
  1375
        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
  1376
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
  1377
class MultipleSuccessorsError(RuntimeError):
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
  1378
    """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
  1379
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
  1380
    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
  1381
    attribute to call to easily recover.
509
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
  1382
    """
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
  1383
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
  1384
    def __init__(self, successorssets):
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
  1385
        self.successorssets = successorssets
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
  1386
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1387
def _singlesuccessor(repo, p):
1369
4ed67cce8c23 evolve: properly evolve stacked unstable with --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1364
diff changeset
  1388
    """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
  1389
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1390
    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
  1391
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1392
    if not p.obsolete():
1369
4ed67cce8c23 evolve: properly evolve stacked unstable with --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1364
diff changeset
  1393
        return p.rev()
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1394
    obs = repo[p]
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1395
    ui = repo.ui
630
722b52c75f02 compat: adapt to upstreaming of divergent logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 622
diff changeset
  1396
    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
  1397
    # search of a parent which is not killed
1440
afe46c3b15db evolve: clarify code in _singlesuccessor
Laurent Charignon <lcharignon@fb.com>
parents: 1428
diff changeset
  1398
    while not newer:
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
  1399
        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
  1400
                 " 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
  1401
                 obs)
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
  1402
        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
  1403
        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
  1404
    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
  1405
        raise MultipleSuccessorsError(newer)
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
  1406
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1407
    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
  1408
1361
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
  1409
def builddependencies(repo, revs):
1411
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
  1410
    """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
  1411
    (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
  1412
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1413
    # 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
  1414
    # 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
  1415
    # dependencies = {3: [6], 6:[]}
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1416
    # 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
  1417
    dependencies = {}
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1418
    # 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
  1419
    rdependencies = collections.defaultdict(set)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1420
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1421
    for r in revs:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1422
        dependencies[r] = set()
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1423
        for p in repo[r].parents():
1408
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
  1424
            try:
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
  1425
                succ = _singlesuccessor(repo, p)
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
  1426
            except MultipleSuccessorsError, exc:
b3afdc0815d0 evolve: skip unstable changesets with multiple successorssets
Laurent Charignon <lcharignon@fb.com>
parents: 1407
diff changeset
  1427
                dependencies[r] = exc.successorssets
1418
ed9a8b1ee9bd evolve: fix error in builddependencies
Laurent Charignon <lcharignon@fb.com>
parents: 1415
diff changeset
  1428
                continue
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1429
            if succ in revs:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1430
                dependencies[r].add(succ)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1431
                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
  1432
    return dependencies, rdependencies
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
  1433
1467
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
  1434
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
  1435
    """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
  1436
    lowest revision numbers
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
  1437
    """
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
  1438
    repo = repo.unfiltered()
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
  1439
    res = set()
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
  1440
    # 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
  1441
    discarded = set()
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
  1442
    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
  1443
        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
  1444
            continue
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
  1445
        divergent = repo[rev]
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
  1446
        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
  1447
        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
  1448
        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
  1449
        discarded.update(othersrevs)
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
  1450
    return res
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
  1451
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1452
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
  1453
    """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
  1454
    revs = set()
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1455
    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
  1456
        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
  1457
        if revopt:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1458
            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
  1459
        elif not anyopt and targetcat == 'unstable':
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
  1460
            revs = set(_aspiringdescendant(repo, 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
  1461
        if targetcat == 'divergent':
5c385b812500 evolve: dedupe divergents when running evolve --all --any or evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1466
diff changeset
  1462
            # 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
  1463
            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
  1464
    elif anyopt:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1465
        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
  1466
    elif targetcat == 'unstable':
1421
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1467
        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
  1468
        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
  1469
            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
  1470
            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
  1471
                    % ', '.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
  1472
            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
  1473
    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
  1474
        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
  1475
    return revs
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1476
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1477
1411
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
  1478
def _orderrevs(repo, revs):
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
  1479
    """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
  1480
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
  1481
    - 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
  1482
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
  1483
    - 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
  1484
    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
  1485
    eventually.
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
  1486
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
  1487
    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
  1488
    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
  1489
    """
043e5ca9322f evolve: extract the code computing dependencies in a separate function
Laurent Charignon <lcharignon@fb.com>
parents: 1357
diff changeset
  1490
    # 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
  1491
    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
  1492
    # Step 2: Build the ordering
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1493
    # 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
  1494
    # 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
  1495
    # 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
  1496
    # 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
  1497
    # built
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1498
    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
  1499
                                      if not dependencies[r]])
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1500
    ordering = []
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1501
    while solvablerevs:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1502
        rev = solvablerevs.popleft()
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1503
        for dependent in rdependencies[rev]:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1504
            dependencies[dependent].remove(rev)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1505
            if not dependencies[dependent]:
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1506
                solvablerevs.append(dependent)
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1507
        del dependencies[rev]
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1508
        ordering.append(rev)
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1509
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1510
    ordering.extend(sorted(dependencies))
1357
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1511
    return ordering
3bb7a080da4d evolve: add ordering of the revisions for evolve --rev
Laurent Charignon <lcharignon@fb.com>
parents: 1354
diff changeset
  1512
714
3867f7b1fe6e evolve: remove duplicate alias.
Levi Bard <levi@unity3d.com>
parents: 710
diff changeset
  1513
@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
  1514
    [('n', 'dry-run', False,
1498
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
  1515
        _('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
  1516
     ('', 'confirm', False,
1498
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
  1517
        _('ask for confirmation before performing the action')),
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
  1518
    ('A', 'any', False, _('also consider troubled changesets unrelated to current working directory')),
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
  1519
    ('r', 'rev', [], _('solves troubles of these revisions')),
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
  1520
    ('', 'bumped', False, _('solves only bumped changesets')),
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
  1521
    ('', 'divergent', False, _('solves only divergent changesets')),
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
  1522
    ('', 'unstable', False, _('solves only unstable changesets (default)')),
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
  1523
    ('a', 'all', False, _('evolve all troubled changesets related to the current '
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
  1524
                         'working directory and its descendants')),
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
  1525
    ('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
  1526
    ] + mergetoolopts,
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  1527
    _('[OPTIONS]...'))
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
  1528
def evolve(ui, repo, **opts):
1403
9a8ecfdfa866 evolve: refresh the documentation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1402
diff changeset
  1529
    """solve troubles in your repository
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
  1530
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  1531
    - rebase unstable changesets to make them stable again,
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  1532
    - create proper diffs from bumped changesets,
1403
9a8ecfdfa866 evolve: refresh the documentation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1402
diff changeset
  1533
    - fuse divergent changesets back together,
750
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1534
    - update to a successor if the working directory parent is
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1535
      obsolete
145
928f217c1701 stabilize: stabilize my topological branch only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 142
diff changeset
  1536
1403
9a8ecfdfa866 evolve: refresh the documentation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1402
diff changeset
  1537
    If no argument are passed and the current working copy parent is obsolete,
9a8ecfdfa866 evolve: refresh the documentation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1402
diff changeset
  1538
    :hg:`evolve` will update the working copy to the successors of this working
9a8ecfdfa866 evolve: refresh the documentation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1402
diff changeset
  1539
    copy parent. If the working copy parent is not obsolete (and still no
9a8ecfdfa866 evolve: refresh the documentation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1402
diff changeset
  1540
    argument passed) each invocation of :hg:`evolve` will evolve a single
9a8ecfdfa866 evolve: refresh the documentation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1402
diff changeset
  1541
    unstable changeset, It will only select a changeset to be evolved if it
1419
b54524ae77c0 evolve: fix an issue in the documentation of the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1418
diff changeset
  1542
    will result in a new children for the current working copy parent or its
b54524ae77c0 evolve: fix an issue in the documentation of the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1418
diff changeset
  1543
    descendants. The working copy will be updated on the result
b54524ae77c0 evolve: fix an issue in the documentation of the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1418
diff changeset
  1544
    (this last behavior will most likely to change in the future).
1422
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
  1545
    You can evolve all the unstable changesets that will be evolved on the
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
  1546
    parent of the working copy and all its descendants recursively by using
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
  1547
    :hg:`evolve` --all.
1403
9a8ecfdfa866 evolve: refresh the documentation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1402
diff changeset
  1548
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1549
    You can decide to evolve other categories of trouble using the --divergent
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1550
    and --bumped flags. If no other option are specified, this will try to
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1551
    solve the specified troubles for the working copy parent.
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1552
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1553
    You can also evolve changesets affected by troubles of the selected
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1554
    category using the --rev options. You can pick the next one anywhere in the
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1555
    repo using --any.
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1556
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1557
    You can evolve all the changesets affected by troubles of the selected
1422
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
  1558
    category using --all --any.
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
  1559
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
  1560
    The working directory is updated to the newly created revision.
269
6c6bb7a23bb5 stabilize: improve unstable selection heuristic
Patrick Mezard <patrick@mezard.eu>
parents: 268
diff changeset
  1561
    """
145
928f217c1701 stabilize: stabilize my topological branch only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 142
diff changeset
  1562
1325
1fe3da0b4601 evolve: add --rev option to the evolve command
Laurent Charignon <lcharignon@fb.com>
parents: 1324
diff changeset
  1563
    # Options
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1564
    contopt = opts['continue']
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1565
    anyopt = opts['any']
704
2ec7c3673679 evolve: add --all argument.
Levi Bard <levi@unity3d.com>
parents: 703
diff changeset
  1566
    allopt = opts['all']
1318
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
  1567
    startnode = repo['.']
703
a246b02499d9 evolve: extract evolve --any implementation into a function.
Levi Bard <levi@unity3d.com>
parents: 663
diff changeset
  1568
    dryrunopt = opts['dry_run']
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1569
    confirmopt = opts['confirm']
1325
1fe3da0b4601 evolve: add --rev option to the evolve command
Laurent Charignon <lcharignon@fb.com>
parents: 1324
diff changeset
  1570
    revopt = opts['rev']
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1571
    troublecategories = ['bumped', 'divergent', 'unstable']
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1572
    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
  1573
    targetcat = 'unstable'
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1574
    if 1 < len(specifiedcategories):
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1575
        msg = _('cannot specify more than one trouble category to solve (yet)')
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1576
        raise util.Abort(msg)
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1577
    elif len(specifiedcategories) == 1:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1578
        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
  1579
    elif repo['.'].obsolete():
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1580
        displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1581
        # 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
  1582
        try:
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1583
            ctx = repo[_singlesuccessor(repo, repo['.'])]
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1584
        except MultipleSuccessorsError, exc:
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1585
            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
  1586
            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
  1587
                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
  1588
                    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
  1589
            return 2
3276730e4b32 evolve: move the 'update' if '.' is obsolete earlier
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1408
diff changeset
  1590
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1591
1410
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1592
        ui.status(_('update:'))
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1593
        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
  1594
            displayer.show(ctx)
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1595
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1596
        if dryrunopt:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1597
            return 0
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1598
        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
  1599
        if ctx != startnode:
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1600
            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
  1601
        return res
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1602
986
c1f8ece4182d evolve: add --tool option so we don't have to use HGMERGE
Greg Ward <greg@gerg.ca>
parents: 985
diff changeset
  1603
    ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'evolve')
1323
603104c880f7 evolve: simplify the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1322
diff changeset
  1604
    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
  1605
1318
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
  1606
    # Progress handling
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
  1607
    seen = 1
1323
603104c880f7 evolve: simplify the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1322
diff changeset
  1608
    count = allopt and len(troubled) or 1
1319
8376fe35ebda evolve: add new variable and comment
Laurent Charignon <lcharignon@fb.com>
parents: 1318
diff changeset
  1609
    showprogress = allopt
1318
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
  1610
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
  1611
    def progresscb():
1325
1fe3da0b4601 evolve: add --rev option to the evolve command
Laurent Charignon <lcharignon@fb.com>
parents: 1324
diff changeset
  1612
        if revopt or allopt:
1318
29363f79514f evolve: move code to track progress and start node
Laurent Charignon <lcharignon@fb.com>
parents: 1317
diff changeset
  1613
            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
  1614
1319
8376fe35ebda evolve: add new variable and comment
Laurent Charignon <lcharignon@fb.com>
parents: 1318
diff changeset
  1615
    # Continuation handling
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1616
    if contopt:
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1617
        if anyopt:
947
9a6cc7e6f0dd evolve: improve wording of a few of messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 946
diff changeset
  1618
            raise util.Abort('cannot specify both "--any" and "--continue"')
704
2ec7c3673679 evolve: add --all argument.
Levi Bard <levi@unity3d.com>
parents: 703
diff changeset
  1619
        if allopt:
947
9a6cc7e6f0dd evolve: improve wording of a few of messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 946
diff changeset
  1620
            raise util.Abort('cannot specify both "--all" and "--continue"')
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1621
        graftcmd = commands.table['graft'][0]
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1622
        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
  1623
    cmdutil.bailifchanged(repo)
08ae023882f1 evolve: check for uncommited change earlier
Laurent Charignon <lcharignon@fb.com>
parents: 1398
diff changeset
  1624
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1625
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1626
    if revopt and allopt:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1627
        raise util.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
  1628
    if revopt and anyopt:
eaf82490af76 evolve: prevent using --rev and --any together
Laurent Charignon <lcharignon@fb.com>
parents: 1404
diff changeset
  1629
        raise util.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
  1630
2c451fece7a6 evolve: unify revision handling and rework error message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1409
diff changeset
  1631
    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
  1632
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1633
    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
  1634
        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
  1635
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1636
    # For the progress bar to show
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1637
    count = len(revs)
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1638
    # Order the revisions
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1639
    if targetcat == 'unstable':
1411
64515965c0df evolve: some style fix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1410
diff changeset
  1640
        revs = _orderrevs(repo, revs)
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1641
    for rev in revs:
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1642
        progresscb()
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1643
        _solveone(ui, repo, repo[rev], dryrunopt, confirmopt,
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1644
                progresscb, targetcat)
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1645
        seen += 1
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1646
    progresscb()
1324
739208d1ee62 evolve: extract cleanup logic in the evolve function
Laurent Charignon <lcharignon@fb.com>
parents: 1323
diff changeset
  1647
    _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
  1648
1421
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1649
def _possibledestination(repo, rev):
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1650
    """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
  1651
    tonode = repo.changelog.node
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1652
    parents = repo.changelog.parentrevs
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1653
    torev = repo.changelog.rev
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1654
    dest = set()
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1655
    tovisit = list(parents(rev))
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1656
    while tovisit:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1657
        r = tovisit.pop()
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1658
        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
  1659
        if not succsets:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1660
            tovisit.extend(parents(r))
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1661
        else:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1662
            # 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
  1663
            # (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
  1664
            # 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
  1665
            # multiple branches.
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1666
            for ss in succsets:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1667
                for n in ss:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1668
                    dest.add(torev(n))
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1669
    return dest
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1670
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1671
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
  1672
    """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
  1673
    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
  1674
    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
  1675
    result = []
1421
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1676
    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
  1677
        dest = _possibledestination(repo, r)
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1678
        if target & dest:
8f18c7b3af14 rework refactor _aspiringchildren by introducing _possibledestination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1420
diff changeset
  1679
            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
  1680
    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
  1681
1422
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
  1682
def _aspiringdescendant(repo, revs):
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
  1683
    """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
  1684
    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
  1685
    target = set(revs)
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
  1686
    result = set(target)
1423
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
  1687
    paths = collections.defaultdict(set)
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
  1688
    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
  1689
        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
  1690
            paths[d].add(r)
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
  1691
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
  1692
    result = set(target)
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
  1693
    tovisit = list(revs)
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
  1694
    while tovisit:
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
  1695
        base = tovisit.pop()
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
  1696
        for unstable in paths[base]:
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
  1697
            if unstable not in result:
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
  1698
                tovisit.append(unstable)
ecd669c36c12 evolve: non recursive implementation for _aspiringdescendants
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1422
diff changeset
  1699
                result.add(unstable)
1422
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
  1700
    return sorted(result - target)
c868a69c29c5 evolve: distinct between '--all' and '--all --any'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1421
diff changeset
  1701
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1702
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
  1703
                   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
  1704
    """Stabilize a unstable changeset"""
464
d88c761f97c4 stabilize: rename "node" variable to "orig"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 463
diff changeset
  1705
    obs = orig.parents()[0]
1354
b4a62d6f0353 evolve: don't crash on singled out revisions
Laurent Charignon <lcharignon@fb.com>
parents: 1351
diff changeset
  1706
    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
  1707
        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
  1708
b4a62d6f0353 evolve: don't crash on singled out revisions
Laurent Charignon <lcharignon@fb.com>
parents: 1351
diff changeset
  1709
    if not obs.obsolete():
b4a62d6f0353 evolve: don't crash on singled out revisions
Laurent Charignon <lcharignon@fb.com>
parents: 1351
diff changeset
  1710
        ui.warn("cannot solve instability of %s, skipping\n" % orig)
b4a62d6f0353 evolve: don't crash on singled out revisions
Laurent Charignon <lcharignon@fb.com>
parents: 1351
diff changeset
  1711
        return False
630
722b52c75f02 compat: adapt to upstreaming of divergent logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 622
diff changeset
  1712
    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
  1713
    # 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
  1714
    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
  1715
        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
  1716
                 " 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
  1717
                 obs)
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
  1718
        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
  1719
        newer = obsolete.successorssets(repo, obs.node())
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1720
    if len(newer) > 1:
1496
62aa11956a40 evolve: _() should not contain %
timeless@mozdev.org
parents: 1495
diff changeset
  1721
        msg = _("skipping %s: divergent rewriting. can't choose destination\n") % obs
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1722
        ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1723
        return 2
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1724
    targets = newer[0]
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
  1725
    assert targets
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1726
    if len(targets) > 1:
1481
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
  1727
        # 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
  1728
        targetrevs = [repo[r].rev() for r in targets]
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
  1729
        roots = repo.revs('roots(%ld)', targetrevs)
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
  1730
        heads = repo.revs('heads(%ld)', targetrevs)
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
  1731
        if len(roots) > 1 or len(heads) > 1:
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
  1732
            msg = "cannot solve split accross two branches\n"
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
  1733
            ui.write_err(msg)
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
  1734
            return 2
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
  1735
        target = repo[heads.first()]
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
  1736
    else:
3c0aebe73482 evolve: handle split commit for instability
Laurent Charignon <lcharignon@fb.com>
parents: 1478
diff changeset
  1737
        target = targets[0]
139
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
  1738
    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
  1739
    target = repo[target]
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1740
    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
  1741
        repo.ui.write(_('move:'))
464
d88c761f97c4 stabilize: rename "node" variable to "orig"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 463
diff changeset
  1742
        displayer.show(orig)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
  1743
        repo.ui.write(_('atop:'))
146
e80a6c8ad452 stabilize: proper --quiet behavior
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 145
diff changeset
  1744
        displayer.show(target)
1390
03f202bed47f evolve: fix default value for --confirm
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1389
diff changeset
  1745
    if confirm and ui.prompt('perform evolve? [Ny]', 'n') != 'y':
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1746
            raise util.Abort(_('evolve aborted by user'))
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1747
    if progresscb: progresscb()
546
415540dee2bd fix missing --dest evolve output in dryrun
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 540
diff changeset
  1748
    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
  1749
    if dryrun:
146
e80a6c8ad452 stabilize: proper --quiet behavior
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 145
diff changeset
  1750
        repo.ui.write(todo)
139
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
  1751
    else:
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
  1752
        repo.ui.note(todo)
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1753
        if progresscb: progresscb()
1141
ca17770d2ee9 evolve: preserve branch change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1140
diff changeset
  1754
        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
  1755
        try:
1141
ca17770d2ee9 evolve: preserve branch change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1140
diff changeset
  1756
            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
  1757
        except MergeFailure:
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1758
            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
  1759
            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
  1760
            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
  1761
                _('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
  1762
                  ' 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
  1763
            raise
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
  1764
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1765
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
  1766
                 progresscb=None):
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1767
    """Stabilize a bumped changeset"""
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1768
    repo = repo.unfiltered()
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1769
    bumped = repo[bumped.rev()]
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1770
    # For now we deny bumped merge
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1771
    if len(bumped.parents()) > 1:
1496
62aa11956a40 evolve: _() should not contain %
timeless@mozdev.org
parents: 1495
diff changeset
  1772
        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
  1773
        ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1774
        return 2
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1775
    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
  1776
    # For now we deny target merge
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1777
    if len(prec.parents()) > 1:
1496
62aa11956a40 evolve: _() should not contain %
timeless@mozdev.org
parents: 1495
diff changeset
  1778
        msg = _('skipping: %s: public version is a merge, this 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
  1779
        ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1780
        return 2
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1781
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1782
    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
  1783
    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
  1784
        repo.ui.write(_('recreate:'))
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1785
        displayer.show(bumped)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
  1786
        repo.ui.write(_('atop:'))
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1787
        displayer.show(prec)
1390
03f202bed47f evolve: fix default value for --confirm
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1389
diff changeset
  1788
    if confirm and ui.prompt('perform evolve? [Ny]', 'n') != 'y':
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1789
        raise util.Abort(_('evolve aborted by user'))
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1790
    if dryrun:
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1791
        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
  1792
        repo.ui.write(todo)
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1793
        repo.ui.write('hg update %s;\n' % prec)
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1794
        repo.ui.write('hg revert --all --rev %s;\n' % bumped)
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1795
        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
  1796
        return 0
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1797
    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
  1798
    newid = tmpctx = None
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1799
    tmpctx = bumped
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1800
    # 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
  1801
    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
  1802
    bmupdate = _bookmarksupdater(repo, bumped.node(), tr)
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1803
    try:
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1804
        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
  1805
            # 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
  1806
            repo.ui.status(
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1807
                _('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
  1808
            try:
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1809
                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
  1810
                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
  1811
                    tmpctx = repo[tmpid]
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
  1812
                    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
  1813
            except MergeFailure:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1814
                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
  1815
                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
  1816
                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
  1817
                    _('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
  1818
                raise
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1819
        # 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
  1820
        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
  1821
        files = set()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1822
        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
  1823
        precmanifest = prec.manifest()
1212
2c1b6e2ec59a merge with stable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1211
diff changeset
  1824
        # 3.3.2 needs a list.
2c1b6e2ec59a merge with stable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1211
diff changeset
  1825
        # 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
  1826
        # 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
  1827
        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
  1828
            precvalue = precmanifest.get(key, None)
9523c027a240 evolve: fix manifest usage to match upstream
Durham Goode <durham@fb.com>
parents: 1209
diff changeset
  1829
            if precvalue is not None:
9523c027a240 evolve: fix manifest usage to match upstream
Durham Goode <durham@fb.com>
parents: 1209
diff changeset
  1830
                del precmanifest[key]
9523c027a240 evolve: fix manifest usage to match upstream
Durham Goode <durham@fb.com>
parents: 1209
diff changeset
  1831
            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
  1832
                files.add(key)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1833
        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
  1834
        # commit it
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1835
        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
  1836
            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
  1837
                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
  1838
                    fctx = bumped[path]
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1839
                    flags = fctx.flags()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1840
                    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
  1841
                                      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
  1842
                                      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
  1843
                                      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
  1844
                    return mctx
1086
96b9e0c31cc1 compat: adapt to change to memctx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1085
diff changeset
  1845
                return None
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1846
            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
  1847
            text += bumped.description()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1848
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1849
            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
  1850
                                 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
  1851
                                 text=text,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1852
                                 files=files,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1853
                                 filectxfn=filectxfn,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1854
                                 user=bumped.user(),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1855
                                 date=bumped.date(),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1856
                                 extra=bumped.extra())
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1857
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1858
            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
  1859
        if newid is None:
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
  1860
            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
  1861
            newid = prec.node()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1862
        else:
1069
356552e55489 evolve: always use the transaction version of phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1068
diff changeset
  1863
            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
  1864
            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
  1865
                                   flag=obsolete.bumpedfix)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1866
        bmupdate(newid)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1867
        tr.close()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1868
        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
  1869
    finally:
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1870
        tr.release()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1871
    # 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
  1872
    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
  1873
    repo.dirstate.setparents(newid, node.nullid)
1112
c3e23fbf7bd7 evolve: wrap setparents calls in begin/endparentchange
Siddharth Agarwal <sid0@fb.com>
parents: 1111
diff changeset
  1874
    repo.dirstate.endparentchange()
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1875
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1876
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
  1877
                    progresscb=None):
1404
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1878
    repo = repo.unfiltered()
848a04c078c7 evolve: add selector for trouble types
Laurent Charignon <lcharignon@fb.com>
parents: 1403
diff changeset
  1879
    divergent = repo[divergent.rev()]
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1880
    base, others = divergentdata(divergent)
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1881
    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
  1882
        othersstr = "[%s]" % (','.join([str(i) for i in others]))
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1883
        msg = _("skipping %d:divergent with a changeset that got splitted into multiple ones:\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1884
                 "|[%s]\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1885
                 "| 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
  1886
                 "| 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
  1887
                 "such as:\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1888
                 "| - hg touch -D\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1889
                 "| - hg prune\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1890
                 "| \n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1891
                 "| You should contact your local evolution Guru for help.\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1892
                 % (divergent, othersstr))
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1893
        ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1894
        return 2
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1895
    other = others[0]
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1896
    if len(other.parents()) > 1:
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1897
        msg = _("skipping %s: divergent changeset can't be a merge (yet)\n" % divergent)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1898
        ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1899
        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
  1900
                 "| 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
  1901
                 "| `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
  1902
        ui.write_err(hint)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1903
        return 2
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1904
    if other.p1() not in divergent.parents():
1412
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1905
        msg = _("skipping %s: have a different parent than %s (not handled yet)\n") % (divergent, other)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1906
        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
  1907
                 "| 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
  1908
                 "| 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
  1909
                 "| 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
  1910
                 "| this command again.\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1911
                 "| - 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
  1912
                 "| - or:     hg rebase --dest 'p1(%(o)s)' -r %(d)s\n"
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1913
                 % {'d': divergent, 'o': other})
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1914
        ui.write_err(msg)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1915
        ui.write_err(hint)
8794a4680bdd evolve: warn about every skipped evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1411
diff changeset
  1916
        return 2
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1917
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1918
    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
  1919
    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
  1920
        ui.write(_('merge:'))
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1921
        displayer.show(divergent)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
  1922
        ui.write(_('with: '))
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1923
        displayer.show(other)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
  1924
        ui.write(_('base: '))
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1925
        displayer.show(base)
1498
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
  1926
    if confirm and ui.prompt(_('perform evolve? [Ny]'), 'n') != 'y':
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1927
        raise util.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
  1928
    if dryrun:
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1929
        ui.write('hg update -c %s &&\n' % divergent)
533
87c41ef95ebf test conflicting conflicting (sic) resolution
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 523
diff changeset
  1930
        ui.write('hg merge %s &&\n' % other)
517
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
  1931
        ui.write('hg commit -m "auto merge resolving conflict between '
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1932
                 '%s and %s"&&\n' % (divergent, other))
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1933
        ui.write('hg up -C %s &&\n' % base)
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1934
        ui.write('hg revert --all --rev tip &&\n')
517
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
  1935
        ui.write('hg commit -m "`hg log -r %s --template={desc}`";\n'
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1936
                 % divergent)
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1937
        return
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1938
    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
  1939
        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
  1940
        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
  1941
    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
  1942
    if progresscb: progresscb()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1943
    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
  1944
                         other.node(),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1945
                         branchmerge=True,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1946
                         force=False,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1947
                         partial=None,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1948
                         ancestor=base.node(),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1949
                         mergeancestor=True)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1950
    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
  1951
    if stats[3]:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1952
        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
  1953
                         "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
  1954
    if stats[3] > 0:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1955
        raise util.Abort('merge conflict between several amendments '
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1956
            '(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
  1957
            hint="""/!\ You can try:
534
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
  1958
/!\ * manual merge + resolve => new cset X
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
  1959
/!\ * 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
  1960
/!\ * hg revert --all -r X
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
  1961
/!\ * 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
  1962
/!\ * hg kill -n Y W Z
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
  1963
""")
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1964
    if progresscb: progresscb()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1965
    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
  1966
    try:
1112
c3e23fbf7bd7 evolve: wrap setparents calls in begin/endparentchange
Siddharth Agarwal <sid0@fb.com>
parents: 1111
diff changeset
  1967
        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
  1968
        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
  1969
        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
  1970
        oldlen = len(repo)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1971
        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
  1972
        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
  1973
            new = divergent
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1974
            # no changes
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1975
        else:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1976
            new = repo['.']
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
  1977
        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
  1978
        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
  1979
        tr.close()
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1980
    finally:
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1981
        tr.release()
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1982
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1983
def divergentdata(ctx):
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1984
    """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
  1985
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1986
    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
  1987
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1988
    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
  1989
    """
1375
9e062e6598e9 evolve: search divergence within all precursors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1374
diff changeset
  1990
    repo = ctx._repo.unfiltered()
9e062e6598e9 evolve: search divergence within all precursors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1374
diff changeset
  1991
    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
  1992
        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
  1993
        # 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
  1994
        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
  1995
        if newer:
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1996
            return base, tuple(ctx._repo[o] for o in newer[0])
1173
fc95401f952f evolve: tell user which "base of divergent changeset" is not found
Martin von Zweigbergk <martinvonz@google.com>
parents: 1168
diff changeset
  1997
    raise util.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
  1998
                     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
  1999
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  2000
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  2001
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
  2002
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
  2003
895
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
  2004
@command('^previous',
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
  2005
         [('B', 'move-bookmark', False,
1497
cebe06c16837 evolve: do not capitalize description of next/previous
timeless@mozdev.org
parents: 1496
diff changeset
  2006
             _('move active bookmark after update')),
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2007
          ('', 'merge', False, _('bring uncommitted change along')),
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2008
          ('n', 'dry-run', False, _('do not perform actions, just print what would be done'))],
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2009
         '[OPTION]...')
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
  2010
def cmdprevious(ui, repo, **opts):
724
fa049c1d9445 evolve: fix typo
André Sintzoff <andre.sintzoff@gmail.com>
parents: 723
diff changeset
  2011
    """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
  2012
    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
  2013
    wparents = wkctx.parents()
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2014
    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
  2015
    if len(wparents) != 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
  2016
        raise util.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
  2017
    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
  2018
        try:
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
  2019
            cmdutil.bailifchanged(repo)
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
  2020
        except error.Abort, exc:
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
  2021
            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
  2022
            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
  2023
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
  2024
    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
  2025
    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
  2026
    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
  2027
        p = parents[0]
1330
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
  2028
        bm = bmactive(repo)
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
  2029
        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
  2030
        if dryrunopt:
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2031
            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
  2032
            if shouldmove:
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2033
                ui.write('hg bookmark %s -r %s;\n' % (bm, p.rev()))
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2034
        else:
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2035
            ret = hg.update(repo, p.rev())
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2036
            if not ret:
1502
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2037
                wlock = repo.wlock()
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2038
                try:
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2039
                    if shouldmove:
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2040
                        repo._bookmarks[bm] = p.node()
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2041
                        repo._bookmarks.write()
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2042
                    else:
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2043
                        bmdeactivate(repo)
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2044
                finally:
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2045
                    wlock.release()
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
  2046
        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
  2047
        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
  2048
    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
  2049
        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
  2050
            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
  2051
        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
  2052
        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
  2053
895
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
  2054
@command('^next',
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
  2055
         [('B', 'move-bookmark', False,
1497
cebe06c16837 evolve: do not capitalize description of next/previous
timeless@mozdev.org
parents: 1496
diff changeset
  2056
             _('move active bookmark after update')),
1499
c936a243346a evolve: spelling uncommitted
timeless@mozdev.org
parents: 1498
diff changeset
  2057
          ('', 'merge', False, _('bring uncommitted change along')),
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2058
          ('', 'evolve', False, _('evolve the next changeset if necessary')),
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2059
          ('n', 'dry-run', False, _('do not perform actions, just print what would be done'))],
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2060
         '[OPTION]...')
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
  2061
def cmdnext(ui, repo, **opts):
1449
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2062
    """update to next child
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2063
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2064
    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
  2065
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2066
    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
  2067
    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
  2068
    wparents = wkctx.parents()
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2069
    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
  2070
    if len(wparents) != 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
  2071
        raise util.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
  2072
    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
  2073
        try:
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
  2074
            cmdutil.bailifchanged(repo)
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
  2075
        except error.Abort, exc:
fcc467ca740e next/prev: require --merge to move with uncommitted changes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1426
diff changeset
  2076
            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
  2077
            raise
87
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 82
diff changeset
  2078
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
  2079
    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
  2080
    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
  2081
    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
  2082
        c = children[0]
1330
efb75f4d55aa bookmarks: update to use new bookmarks api via compatibility layer
Ryan McElroy <rmcelroy@fb.com>
parents: 1311
diff changeset
  2083
        bm = bmactive(repo)
1160
e29a813f6af5 Make next/prev only move bookmarks optionally
Ryan McElroy <rmcelroy@fb.com>
parents: 1157
diff changeset
  2084
        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
  2085
        if dryrunopt:
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2086
            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
  2087
            if shouldmove:
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2088
                ui.write('hg bookmark %s -r %s;\n' % (bm, c.rev()))
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2089
        else:
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2090
            ret = hg.update(repo, c.rev())
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2091
            if not ret:
1502
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2092
                wlock = repo.wlock()
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2093
                try:
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2094
                    if shouldmove:
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2095
                        repo._bookmarks[bm] = c.node()
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2096
                        repo._bookmarks.write()
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2097
                    else:
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2098
                        bmdeactivate(repo)
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2099
                finally:
094b54a72c1d next/prev: properly lock repo before touching bookmarks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1500
diff changeset
  2100
                    wlock.release()
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
  2101
        displayer.show(c)
1446
a73d1ee48003 next: refactor the command code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1443
diff changeset
  2102
        result = 0
a73d1ee48003 next: refactor the command code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1443
diff changeset
  2103
    elif children:
1447
09206bdc2db4 next: reword error output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1446
diff changeset
  2104
        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
  2105
        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
  2106
            displayer.show(c)
1447
09206bdc2db4 next: reword error output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1446
diff changeset
  2107
        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
  2108
        result = 1
a73d1ee48003 next: refactor the command code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1443
diff changeset
  2109
    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
  2110
        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
  2111
        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
  2112
            ui.warn(_('no children\n'))
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2113
            if aspchildren:
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2114
                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
  2115
                        'do you want --evolve?)\n')
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2116
                ui.warn(msg % len(aspchildren))
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2117
            result = 1
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2118
        elif 1 < len(aspchildren):
1498
3d9a546dcbc5 evolve: annotate translatable strings with _()
timeless@mozdev.org
parents: 1497
diff changeset
  2119
            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
  2120
            for c in aspchildren:
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2121
                displayer.show(repo[c])
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2122
            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
  2123
            return 1
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2124
        else:
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2125
            cmdutil.bailifchanged(repo)
1500
b4dfafda72c2 next: add support for --dry-run
timeless@mozdev.org
parents: 1499
diff changeset
  2126
            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
  2127
                               False, lambda:None, category='unstable')
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2128
            if not result:
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2129
                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
  2130
            return result
9be1cadf7a07 next: add a --evolve option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1448
diff changeset
  2131
        return 1
1446
a73d1ee48003 next: refactor the command code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1443
diff changeset
  2132
    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
  2133
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2134
def _reachablefrombookmark(repo, revs, mark):
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2135
    """filter revisions and bookmarks reachable from the given bookmark
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2136
    yoinked from mq.py
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2137
    """
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2138
    marks = repo._bookmarks
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2139
    if mark not in marks:
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2140
        raise util.Abort(_("bookmark '%s' not found") % mark)
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2141
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2142
    # 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
  2143
    # 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
  2144
    # anything. revsets cannot detect that case.
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2145
    uniquebm = True
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2146
    for m, n in marks.iteritems():
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2147
        if m != mark and n == repo[mark].node():
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2148
            uniquebm = False
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2149
            break
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2150
    if uniquebm:
1513
4f7e0e0318a5 prune: reuse revset from repair instead of copy-pasting code
Ryan McElroy <rmcelroy@fb.com>
parents: 1512
diff changeset
  2151
        if util.safehasattr(repair, 'stripbmrevset'):
4f7e0e0318a5 prune: reuse revset from repair instead of copy-pasting code
Ryan McElroy <rmcelroy@fb.com>
parents: 1512
diff changeset
  2152
            rsrevs = repair.stripbmrevset(repo, mark)
4f7e0e0318a5 prune: reuse revset from repair instead of copy-pasting code
Ryan McElroy <rmcelroy@fb.com>
parents: 1512
diff changeset
  2153
        else:
4f7e0e0318a5 prune: reuse revset from repair instead of copy-pasting code
Ryan McElroy <rmcelroy@fb.com>
parents: 1512
diff changeset
  2154
            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
  2155
                               "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
  2156
                               "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
  2157
                               "obsolete()",
4f7e0e0318a5 prune: reuse revset from repair instead of copy-pasting code
Ryan McElroy <rmcelroy@fb.com>
parents: 1512
diff changeset
  2158
                               mark, mark, mark)
1135
db16c4ad15d0 fixup previous changesets (after forgot to amend).
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1134
diff changeset
  2159
        revs = set(revs)
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2160
        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
  2161
        revs = sorted(revs)
db16c4ad15d0 fixup previous changesets (after forgot to amend).
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1134
diff changeset
  2162
    return marks, revs
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2163
1501
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
  2164
def _deletebookmark(repo, marks, mark):
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
  2165
    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
  2166
    try:
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
  2167
        wlock = repo.wlock()
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
  2168
        lock = repo.lock()
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
  2169
        tr = repo.transaction('prune')
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
  2170
        del marks[mark]
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
  2171
        marks.recordchange(tr)
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
  2172
        tr.close()
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
  2173
        repo.ui.write(_("bookmark '%s' deleted\n") % mark)
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
  2174
    finally:
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
  2175
        lockmod.release(tr, lock, wlock)
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2176
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  2177
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  2178
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  2179
def _getmetadata(**opts):
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  2180
    metadata = {}
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  2181
    date = opts.get('date')
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  2182
    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
  2183
    if date:
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  2184
        metadata['date'] = '%i %i' % util.parsedate(date)
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  2185
    if user:
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  2186
        metadata['user'] = user
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  2187
    return metadata
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  2188
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  2189
365
9f6a77ec66cb evolve: switch the official name for "kill" to prune
Pierre-Yves.David@ens-lyon.org
parents: 362
diff changeset
  2190
@command('^prune|obsolete|kill',
682
6cbb52a8401b prune: rename --new to --succ
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 681
diff changeset
  2191
    [('n', 'new', [], _("successor changeset (DEPRECATED)")),
6cbb52a8401b prune: rename --new to --succ
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 681
diff changeset
  2192
     ('s', 'succ', [], _("successor changeset")),
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2193
     ('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
  2194
     ('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
  2195
     ('', 'biject', False, _("do a 1-1 map between rev and successor ranges")),
1471
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
  2196
     ('', 'fold', False, _("record a fold (multiple precursors, one successors)")),
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
  2197
     ('', 'split', False, _("record a split (on precursor, multiple successors)")),
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2198
     ('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
  2199
                             " bookmark"))] + metadataopts,
644
8e41d5b78dff support -r option in prune, add a test for this
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 636
diff changeset
  2200
    _('[OPTION] [-r] REV...'))
690
929d7617a13d prune: more command switch idea
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 689
diff changeset
  2201
    # -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
  2202
def cmdprune(ui, repo, *revs, **opts):
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  2203
    """hide changesets by marking them obsolete
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  2204
689
d48aae167b9d prune: documentation update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 688
diff changeset
  2205
    Obsolete changesets becomes invisible to all commands.
d48aae167b9d prune: documentation update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 688
diff changeset
  2206
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  2207
    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
  2208
    :hg:`evolve` to handle such situation.
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  2209
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  2210
    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
  2211
    non-obsolete parent.
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  2212
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  2213
    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
  2214
    of the pruned changeset exists.
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  2215
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  2216
    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
  2217
    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
  2218
    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
  2219
1471
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
  2220
    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
  2221
    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
  2222
    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
  2223
    "fold" requires a --fold flag.
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2224
    """
1134
7173c70ab2c3 prune: stop reinjecting all selected revisions back into the revrange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1132
diff changeset
  2225
    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
  2226
    succs = opts['new'] + opts['succ']
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2227
    bookmark = opts.get('bookmark')
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  2228
    metadata = _getmetadata(**opts)
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  2229
    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
  2230
    fold = opts.get('fold')
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
  2231
    split = opts.get('split')
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
  2232
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
  2233
    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
  2234
    if 1 < len(options):
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
  2235
        raise util.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
  2236
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2237
    if bookmark:
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2238
        marks,revs = _reachablefrombookmark(repo, revs, bookmark)
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2239
        if not revs:
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2240
            # no revisions to prune - delete bookmark immediately
1501
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
  2241
            _deletebookmark(repo, marks, bookmark)
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2242
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2243
    if not revs:
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2244
        raise util.Abort(_('nothing to prune'))
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2245
1295
1ac05eef72ca prune: prune fix transaction pattern
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1294
diff changeset
  2246
    wlock = lock = tr = None
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  2247
    try:
1019
0c733dab0036 prune: lock inside the try
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1018
diff changeset
  2248
        wlock = repo.wlock()
444
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
  2249
        lock = repo.lock()
1294
d1c29db2e055 prune: fix pruning w/ bookmarks and inhibit
Durham Goode <durham@fb.com>
parents: 1283
diff changeset
  2250
        tr = repo.transaction('prune')
691
6e63b4185a5c prune: update inline documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 690
diff changeset
  2251
        # defines pruned changesets
684
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
  2252
        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
  2253
        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
  2254
        for p in revs:
684
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
  2255
            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
  2256
            if not cp.mutable():
927
154510dc4318 evolve: fix grammar in a comment
Greg Ward <greg@gerg.ca>
parents: 925
diff changeset
  2257
                # note: createmarkers() would have raised something anyway
687
6c1fbef2952e prune: test and improve message of immutable aborting.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 685
diff changeset
  2258
                raise util.Abort('cannot prune immutable changeset: %s' % cp,
6c1fbef2952e prune: test and improve message of immutable aborting.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 685
diff changeset
  2259
                                 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
  2260
            precs.append(cp)
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
  2261
        if not precs:
683
6d24bd455f79 simplify locking in prune
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 682
diff changeset
  2262
            raise util.Abort('nothing to prune')
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  2263
1397
35f2f54b557c evolve: make prune respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1396
diff changeset
  2264
        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
  2265
            if repo.revs("(%ld::) - %ld", revs, revs):
1397
35f2f54b557c evolve: make prune respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1396
diff changeset
  2266
                raise util.Abort(_("cannot prune in the middle of a stack"))
35f2f54b557c evolve: make prune respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1396
diff changeset
  2267
691
6e63b4185a5c prune: update inline documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 690
diff changeset
  2268
        # defines successors changesets
1135
db16c4ad15d0 fixup previous changesets (after forgot to amend).
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1134
diff changeset
  2269
        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
  2270
        sucs.sort()
db16c4ad15d0 fixup previous changesets (after forgot to amend).
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1134
diff changeset
  2271
        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
  2272
        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
  2273
            msg = "Can't use multiple successors for multiple precursors"
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
  2274
            raise util.Abort(msg)
1471
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
  2275
        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
  2276
            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
  2277
                % (len(sucs), len(precs))
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  2278
            raise util.Abort(msg)
1471
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
  2279
        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
  2280
            msg = "please add --split if you want to do a split"
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
  2281
            raise util.Abort(msg)
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
  2282
        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
  2283
            msg = "please add --fold if you want to do a fold"
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
  2284
            raise util.Abort(msg)
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
  2285
        elif biject:
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  2286
            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
  2287
        else:
4140d680784e evolve: (issue4386) cleanup, split, fold and bijection in `hg prune`
Laurent Charignon <lcharignon@fb.com>
parents: 1469
diff changeset
  2288
            relations = [(p, sucs) for p in precs]
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  2289
683
6d24bd455f79 simplify locking in prune
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 682
diff changeset
  2290
        wdp = repo['.']
931
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  2291
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  2292
        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
  2293
            # '.' 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
  2294
            newnode = sucs[0]
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  2295
        else:
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  2296
            # 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
  2297
            newnode = wdp
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  2298
1239
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
  2299
            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
  2300
                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
  2301
1239
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
  2302
683
6d24bd455f79 simplify locking in prune
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 682
diff changeset
  2303
        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
  2304
            if opts.get('keep', False):
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
  2305
                # 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
  2306
                # 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
  2307
                # common at some point.
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
  2308
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
  2309
                # 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
  2310
                # 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
  2311
                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
  2312
                changedfiles = []
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
  2313
                for rev in descendantrevs:
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
  2314
                    # blindly reset the files, regardless of what actually changed
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
  2315
                    changedfiles.extend(repo[rev].files())
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
  2316
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
  2317
                # 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
  2318
                dirstate = repo.dirstate
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
  2319
                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
  2320
                changedfiles.extend(dirchanges)
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
  2321
                repo.dirstate.rebuild(newnode.node(), newnode.manifest(), changedfiles)
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
  2322
                repo.dirstate.write()
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
  2323
            else:
1344
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
  2324
                bookactive = bmactive(repo)
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
  2325
                # 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
  2326
                # 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
  2327
                # after
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
  2328
                movebookmark = bookactive and not bookmark
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
  2329
                if movebookmark:
1391
35518d26b549 merge with stable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1388 1390
diff changeset
  2330
                    bmdeactivate(repo)
1344
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
  2331
                    repo._bookmarks[bookactive] = newnode.node()
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
  2332
                    repo._bookmarks.write()
1221
524dbc8ffeac prune: add --keep to not touch the working copy
Durham Goode <durham@fb.com>
parents: 1220
diff changeset
  2333
                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
  2334
                ui.status(_('working directory now at %s\n') % newnode)
1344
376d3df9f47b Merge with stable
Laurent Charignon <lcharignon@fb.com>
parents: 1341 1342
diff changeset
  2335
                if movebookmark:
1391
35518d26b549 merge with stable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1388 1390
diff changeset
  2336
                    bmactivate(repo, bookactive)
1342
16017e1bb2a1 prune: with active bookmark should stay active
Laurent Charignon <lcharignon@fb.com>
parents: 1340
diff changeset
  2337
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2338
        # update bookmarks
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  2339
        if bookmark:
1501
5c962163f77a prune: ensure we prune bookmarks in a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1487
diff changeset
  2340
            _deletebookmark(repo, marks, bookmark)
1239
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
  2341
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
  2342
        # create markers
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
  2343
        obsolete.createmarkers(repo, relations, metadata=metadata)
1468
bc6cf6cc06fd evolve: remove trailing spaces
André Sintzoff <andre.sintzoff@gmail.com>
parents: 1467
diff changeset
  2344
1239
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
  2345
        # informs that changeset have been pruned
8a06b32061ce evolve: apply prune update before creating obsolescence markers
Laurent Charignon <lcharignon@fb.com>
parents: 1235
diff changeset
  2346
        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
  2347
693
d3c1fe0035d1 prune: handle bookmark
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 691
diff changeset
  2348
        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
  2349
            # used to be:
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
  2350
            #
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
  2351
            #   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
  2352
            #   if ldest:
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
  2353
            #      c = ldest[0]
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
  2354
            #
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
  2355
            # 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
  2356
            # 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
  2357
            for dest in ctx.ancestors():
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
  2358
                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
  2359
                    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
  2360
                    updatebookmarks(dest.node())
8cac667a0d7d prune: work around lazy revset slowdown
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1099
diff changeset
  2361
                    break
1294
d1c29db2e055 prune: fix pruning w/ bookmarks and inhibit
Durham Goode <durham@fb.com>
parents: 1283
diff changeset
  2362
d1c29db2e055 prune: fix pruning w/ bookmarks and inhibit
Durham Goode <durham@fb.com>
parents: 1283
diff changeset
  2363
        tr.close()
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  2364
    finally:
1295
1ac05eef72ca prune: prune fix transaction pattern
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1294
diff changeset
  2365
        lockmod.release(tr, lock, wlock)
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  2366
673
761b5b266985 evolve: removes amend from the list of advertised function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 672
diff changeset
  2367
@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
  2368
    [('A', 'addremove', None,
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  2369
     _('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
  2370
    ('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
  2371
    ('', 'close-branch', None,
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  2372
     _('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
  2373
    ('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
  2374
    ] + 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
  2375
    _('[OPTION]... [FILE]...'))
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  2376
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
  2377
    """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
  2378
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  2379
    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
  2380
    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
  2381
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  2382
    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
  2383
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  2384
    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
  2385
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  2386
    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
  2387
    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
  2388
    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
  2389
    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
  2390
    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
  2391
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  2392
    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
  2393
    """
742
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  2394
    opts = opts.copy()
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  2395
    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
  2396
    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
  2397
    opts['amend'] = True
1140
b7d85cd8ec7b amend: allow the --logfile argument to work properly
Matt Harbison <matt_harbison@yahoo.com>
parents: 1137
diff changeset
  2398
    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
  2399
        opts['message'] = repo['.'].description()
985
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
  2400
    _resolveoptions(ui, opts)
742
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  2401
    _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
  2402
    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
  2403
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2404
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2405
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
  2406
    touched = set()
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2407
    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
  2408
        touched.update(files)
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2409
    return touched
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2410
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2411
def _commitfiltered(repo, ctx, match, target=None):
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2412
    """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
  2413
    node identifier, or None if nothing changed.
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2414
    """
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2415
    base = ctx.p1()
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2416
    if target is None:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2417
        target = base
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2418
    # ctx
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2419
    initialfiles = _touchedbetween(repo, base, ctx)
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2420
    if base == target:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2421
        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
  2422
        newcontent = set()
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2423
    else:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2424
        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
  2425
        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
  2426
    # The commit touchs all existing files
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2427
    # + 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
  2428
    # - 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
  2429
    files = (initialfiles - affected) | newcontent
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2430
    if not newcontent and files == initialfiles:
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2431
        return None
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2432
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2433
    # Filter copies
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2434
    copied = copies.pathcopies(target, ctx)
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2435
    copied = dict((src, dst) for src, dst in copied.iteritems()
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2436
                  if dst in files)
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2437
    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
  2438
        if path in redirect:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2439
            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
  2440
        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
  2441
            return None
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2442
        fctx = contentctx[path]
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2443
        flags = fctx.flags()
955
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
  2444
        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
  2445
                          islink='l' in flags,
ef155e3ead8f evolve: abstract access to context.memfilectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 953
diff changeset
  2446
                          isexec='x' in flags,
ef155e3ead8f evolve: abstract access to context.memfilectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 953
diff changeset
  2447
                          copied=copied.get(path))
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2448
        return mctx
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2449
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2450
    new = context.memctx(repo,
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2451
                         parents=[base.node(), node.nullid],
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2452
                         text=ctx.description(),
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2453
                         files=files,
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2454
                         filectxfn=filectxfn,
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2455
                         user=ctx.user(),
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2456
                         date=ctx.date(),
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2457
                         extra=ctx.extra())
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2458
    # commitctx always create a new revision, no need to check
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2459
    newid = repo.commitctx(new)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2460
    return newid
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2461
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2462
def _uncommitdirstate(repo, oldctx, match):
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2463
    """Fix the dirstate after switching the working directory from
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2464
    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
  2465
    match.
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2466
    """
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2467
    ctx = repo['.']
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2468
    ds = repo.dirstate
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2469
    copies = dict(ds.copies())
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2470
    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
  2471
    for f in m:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2472
        if ds[f] == 'r':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2473
            # modified + removed -> removed
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2474
            continue
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2475
        ds.normallookup(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2476
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2477
    for f in a:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2478
        if ds[f] == 'r':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2479
            # added + removed -> unknown
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2480
            ds.drop(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2481
        elif ds[f] != 'a':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2482
            ds.add(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2483
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2484
    for f in r:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2485
        if ds[f] == 'a':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2486
            # removed + added -> normal
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2487
            ds.normallookup(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2488
        elif ds[f] != 'r':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2489
            ds.remove(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2490
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2491
    # Merge old parent and old working dir copies
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2492
    oldcopies = {}
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2493
    for f in (m + a):
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2494
        src = oldctx[f].renamed()
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2495
        if src:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2496
            oldcopies[f] = src[0]
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2497
    oldcopies.update(copies)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2498
    copies = dict((dst, oldcopies.get(src, src))
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2499
                  for dst, src in oldcopies.iteritems())
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2500
    # Adjust the dirstate copies
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2501
    for dst, src in copies.iteritems():
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2502
        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
  2503
            src = None
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2504
        ds.copy(src, dst)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2505
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2506
@command('^uncommit',
314
ebd286f06879 uncommit: add --all option
Patrick Mezard <patrick@mezard.eu>
parents: 313
diff changeset
  2507
    [('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
  2508
     ('r', 'rev', '', _('revert commit content to REV instead')),
314
ebd286f06879 uncommit: add --all option
Patrick Mezard <patrick@mezard.eu>
parents: 313
diff changeset
  2509
     ] + commands.walkopts,
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2510
    _('[OPTION]... [NAME]'))
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2511
def uncommit(ui, repo, *pats, **opts):
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2512
    """move changes from parent revision to working directory
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2513
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  2514
    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
  2515
    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
  2516
    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
  2517
    revision, and obsoletes the previous one.
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2518
867
6a67606e1c34 evolve: fix typos in uncommit docstring
André Sintzoff <andre.sintzoff@gmail.com>
parents: 858
diff changeset
  2519
    The --include option specifies patterns to uncommit.
6a67606e1c34 evolve: fix typos in uncommit docstring
André Sintzoff <andre.sintzoff@gmail.com>
parents: 858
diff changeset
  2520
    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
  2521
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2522
    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
  2523
    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
  2524
    directory.
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2525
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2526
    Return 0 if changed files are uncommitted.
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2527
    """
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2528
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
  2529
    wlock = lock = tr = None
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2530
    try:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2531
        wlock = repo.wlock()
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2532
        lock = repo.lock()
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2533
        wctx = repo[None]
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2534
        if len(wctx.parents()) <= 0:
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2535
            raise util.Abort(_("cannot uncommit null changeset"))
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2536
        if len(wctx.parents()) > 1:
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2537
            raise util.Abort(_("cannot uncommit while merging"))
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2538
        old = repo['.']
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2539
        if old.phase() == phases.public:
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2540
            raise util.Abort(_("cannot rewrite immutable changeset"))
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2541
        if len(old.parents()) > 1:
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2542
            raise util.Abort(_("cannot uncommit merge changeset"))
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2543
        oldphase = old.phase()
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
  2544
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2545
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2546
        rev = None
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2547
        if opts.get('rev'):
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2548
            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
  2549
            ctx = repo[None]
160fd06312fc uncommit: abort when rev specifies the current changeset
Nathan Goldbaum <ngoldbau@ucsc.edu>
parents: 1141
diff changeset
  2550
            if ctx.p1() == rev or ctx.p2() == rev:
160fd06312fc uncommit: abort when rev specifies the current changeset
Nathan Goldbaum <ngoldbau@ucsc.edu>
parents: 1141
diff changeset
  2551
                raise util.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
  2552
1364
f00d91365ab9 evolve: make uncommit respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1361
diff changeset
  2553
        onahead = old.rev() in repo.changelog.headrevs()
f00d91365ab9 evolve: make uncommit respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1361
diff changeset
  2554
        disallowunstable = not obsolete.isenabled(repo, obsolete.allowunstableopt)
f00d91365ab9 evolve: make uncommit respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1361
diff changeset
  2555
        if disallowunstable and not onahead:
f00d91365ab9 evolve: make uncommit respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1361
diff changeset
  2556
            raise util.Abort(_("cannot uncommit in the middle of a stack"))
f00d91365ab9 evolve: make uncommit respect allowunsable
Laurent Charignon <lcharignon@fb.com>
parents: 1361
diff changeset
  2557
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2558
        # Recommit the filtered changeset
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
  2559
        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
  2560
        updatebookmarks = _bookmarksupdater(repo, old.node(), tr)
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2561
        newid = None
1351
69e5de3e6129 evolve: small refactoring of the uncommit function
Laurent Charignon <lcharignon@fb.com>
parents: 1350
diff changeset
  2562
        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
  2563
        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
  2564
            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
  2565
            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
  2566
        if newid is None:
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2567
            raise util.Abort(_('nothing to uncommit'),
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2568
                             hint=_("use --all to uncommit all files"))
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2569
        # Move local changes on filtered changeset
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
  2570
        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
  2571
        phases.retractboundary(repo, tr, oldphase, [newid])
1112
c3e23fbf7bd7 evolve: wrap setparents calls in begin/endparentchange
Siddharth Agarwal <sid0@fb.com>
parents: 1111
diff changeset
  2572
        repo.dirstate.beginparentchange()
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2573
        repo.dirstate.setparents(newid, node.nullid)
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2574
        _uncommitdirstate(repo, old, match)
1112
c3e23fbf7bd7 evolve: wrap setparents calls in begin/endparentchange
Siddharth Agarwal <sid0@fb.com>
parents: 1111
diff changeset
  2575
        repo.dirstate.endparentchange()
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2576
        updatebookmarks(newid)
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2577
        if not repo[newid].files():
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2578
            ui.warn(_("new changeset is empty\n"))
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2579
            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
  2580
        tr.close()
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2581
    finally:
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
  2582
        lockmod.release(tr, lock, wlock)
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2583
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2584
@eh.wrapcommand('commit')
116
64ca29eef349 Add a -o option to commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 113
diff changeset
  2585
def commitwrapper(orig, ui, repo, *arg, **kwargs):
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2586
    if kwargs.get('amend', False):
1255
a2d4901e211e commit: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1253
diff changeset
  2587
        wlock = lock = None
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2588
    else:
1255
a2d4901e211e commit: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1253
diff changeset
  2589
        wlock = repo.wlock()
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2590
        lock = repo.lock()
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2591
    try:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2592
        obsoleted = kwargs.get('obsolete', [])
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2593
        if obsoleted:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2594
            obsoleted = repo.set('%lr', obsoleted)
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2595
        result = orig(ui, repo, *arg, **kwargs)
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2596
        if not result: # commit successed
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2597
            new = repo['-1']
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2598
            oldbookmarks = []
444
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
  2599
            markers = []
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2600
            for old in obsoleted:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2601
                oldbookmarks.extend(repo.nodebookmarks(old.node()))
444
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
  2602
                markers.append((old, (new,)))
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
  2603
            if markers:
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
  2604
                obsolete.createmarkers(repo, markers)
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2605
            for book in oldbookmarks:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2606
                repo._bookmarks[book] = new.node()
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2607
            if oldbookmarks:
612
15299bfd0813 adapt to 7f5dab94e48c in crew
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 604
diff changeset
  2608
                repo._bookmarks.write()
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2609
        return result
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2610
    finally:
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  2611
        lockmod.release(lock, wlock)
116
64ca29eef349 Add a -o option to commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 113
diff changeset
  2612
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2613
@command('^split',
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2614
    [('r', 'rev', [], _("revision to fold")),
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2615
    ] + commitopts + commitopts2,
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2616
    _('hg split [OPTION]... [-r] REV'))
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2617
def cmdsplit(ui, repo, *revs, **opts):
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2618
    """Split the current commit using interactive selection
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2619
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2620
    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
  2621
    redistributed into new changesets.
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2622
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2623
    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
  2624
    """
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2625
    tr = wlock = lock = None
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2626
    newcommits = []
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2627
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2628
    revopt = opts.get('rev')
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2629
    if revopt:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2630
        revs = scmutil.revrange(repo, revopt)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2631
        if len(revs) != 1:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2632
            raise util.Abort(_("you can only specify one revision to split"))
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2633
        else:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2634
            rev = list(revs)[0]
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2635
    else:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2636
        rev = '.'
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2637
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2638
    try:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2639
        wlock = repo.wlock()
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2640
        lock = repo.lock()
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2641
        cmdutil.bailifchanged(repo)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2642
        tr = repo.transaction('split')
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2643
        ctx = repo[rev]
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2644
        r = ctx.rev()
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2645
        disallowunstable = not obsolete.isenabled(repo,
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2646
                                                  obsolete.allowunstableopt)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2647
        if disallowunstable:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2648
            # XXX We should check head revs
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2649
            if repo.revs("(%d::) - %d", rev, rev):
1496
62aa11956a40 evolve: _() should not contain %
timeless@mozdev.org
parents: 1495
diff changeset
  2650
                raise util.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
  2651
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2652
        if len(ctx.parents()) > 1:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2653
            raise util.Abort(_("cannot split merge commits"))
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2654
        prev = ctx.p1()
1506
a55c691f4cc0 evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 1505
diff changeset
  2655
        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
  2656
        bookactive = bmactive(repo)
1ba64be11bf8 split: handle bookmarks instead of leaving them on precursor
Laurent Charignon <lcharignon@fb.com>
parents: 1484
diff changeset
  2657
        if bookactive is not None:
1ba64be11bf8 split: handle bookmarks instead of leaving them on precursor
Laurent Charignon <lcharignon@fb.com>
parents: 1484
diff changeset
  2658
            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
  2659
        bmdeactivate(repo)
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2660
        hg.update(repo, prev)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2661
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2662
        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
  2663
        def haschanges():
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2664
            modified, added, removed, deleted = repo.status()[:4]
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2665
            return modified or added or removed or deleted
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2666
        while haschanges():
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2667
            pats = ()
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2668
            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
  2669
                             cmdutil.recordfilter, *pats, **opts)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2670
            # 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
  2671
            # 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
  2672
            newcommits.append(repo['.'])
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2673
            if haschanges():
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2674
                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
  2675
                    commands.commit(ui, repo, **opts)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2676
                    newcommits.append(repo['.'])
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2677
                    break
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2678
            else:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2679
                ui.status("no more change to split\n")
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2680
1485
1ba64be11bf8 split: handle bookmarks instead of leaving them on precursor
Laurent Charignon <lcharignon@fb.com>
parents: 1484
diff changeset
  2681
        tip = repo[newcommits[-1]]
1ba64be11bf8 split: handle bookmarks instead of leaving them on precursor
Laurent Charignon <lcharignon@fb.com>
parents: 1484
diff changeset
  2682
        bmupdate(tip.node())
1ba64be11bf8 split: handle bookmarks instead of leaving them on precursor
Laurent Charignon <lcharignon@fb.com>
parents: 1484
diff changeset
  2683
        if bookactive is not None:
1ba64be11bf8 split: handle bookmarks instead of leaving them on precursor
Laurent Charignon <lcharignon@fb.com>
parents: 1484
diff changeset
  2684
            bmactivate(repo, bookactive)
1478
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2685
        obsolete.createmarkers(repo, [(repo[r], newcommits)])
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2686
        tr.close()
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2687
    finally:
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2688
        lockmod.release(tr, lock, wlock)
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2689
9603aa1ecdfd evolve: add a command to split commits
Laurent Charignon <lcharignon@fb.com>
parents: 1471
diff changeset
  2690
1220
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  2691
@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
  2692
    ('', '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
  2693
        "backup bundle")),
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  2694
    ])
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  2695
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
  2696
    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
  2697
        kwargs.get('bundle', False)):
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  2698
        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
  2699
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  2700
    if kwargs.get('force'):
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  2701
        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
  2702
                  "enabled\n"))
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  2703
    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
  2704
        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
  2705
                  "evolve enabled\n"))
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  2706
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  2707
    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
  2708
    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
  2709
    revs = repo.revs("(%ld)::", revs)
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  2710
    kwargs['rev'] = []
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  2711
    kwargs['new'] = []
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  2712
    kwargs['succ'] = []
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  2713
    kwargs['biject'] = False
71240f696f26 strip: add the option for wrapping the strip command
Durham Goode <durham@fb.com>
parents: 1219
diff changeset
  2714
    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
  2715
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2716
@command('^touch',
701
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
  2717
    [('r', 'rev', [], 'revision to update'),
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
  2718
     ('D', 'duplicate', False,
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
  2719
      '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
  2720
    # allow to choose the seed ?
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2721
    _('[-r] revs'))
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2722
def touch(ui, repo, *revs, **opts):
1168
2187f7c88ff6 evolve: fix capitalization in docstring for commands
André Sintzoff <andre.sintzoff@gmail.com>
parents: 1163
diff changeset
  2723
    """create successors that are identical to their predecessors except for the changeset ID
517
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
  2724
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
  2725
    This is used to "resurrect" changesets
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
  2726
    """
701
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
  2727
    duplicate = opts['duplicate']
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2728
    revs = list(revs)
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2729
    revs.extend(opts['rev'])
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2730
    if not revs:
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2731
        revs = ['.']
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2732
    revs = scmutil.revrange(repo, revs)
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2733
    if not revs:
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2734
        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
  2735
        return 1
701
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
  2736
    if not duplicate and repo.revs('public() and %ld', revs):
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2737
        raise util.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
  2738
    wlock = lock = tr = None
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2739
    try:
514
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
  2740
        wlock = repo.wlock()
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2741
        lock = repo.lock()
514
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
  2742
        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
  2743
        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
  2744
        newmapping = {}
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  2745
        for r in revs:
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  2746
            ctx = repo[r]
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  2747
            extra = ctx.extra().copy()
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  2748
            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
  2749
            # search for touched parent
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  2750
            p1 = ctx.p1().node()
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  2751
            p2 = ctx.p2().node()
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  2752
            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
  2753
            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
  2754
            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
  2755
                                          [p1, p2],
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  2756
                                          commitopts={'extra': extra})
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  2757
            # 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
  2758
            newmapping[ctx.node()] = new
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  2759
            if not duplicate:
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  2760
                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
  2761
            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
  2762
            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
  2763
                repo.dirstate.beginparentchange()
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  2764
                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
  2765
                repo.dirstate.endparentchange()
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  2766
        tr.close()
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2767
    finally:
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  2768
        lockmod.release(tr, lock, wlock)
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2769
934
f13facb01ac5 fold: add squash as a possible alias
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 933
diff changeset
  2770
@command('^fold|squash',
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2771
    [('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
  2772
     ('', '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
  2773
    ] + commitopts + commitopts2,
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2774
    _('hg fold [OPTION]... [-r] REV'))
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2775
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
  2776
    """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
  2777
1463
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
  2778
    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
  2779
    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
  2780
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2781
    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
  2782
    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
  2783
    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
  2784
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2785
    .. container:: verbose
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2786
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2787
     Some examples:
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2788
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2789
     - 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
  2790
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2791
         hg fold .^
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2792
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2793
     - 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
  2794
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2795
         hg fold 'draft()'
702
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
  2796
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2797
       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
  2798
       :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
  2799
1469
fa1a27009c76 evolve: fix typo in fold docstring
André Sintzoff <andre.sintzoff@gmail.com>
parents: 1468
diff changeset
  2800
     - 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
  2801
d830d4e9f212 fold: avoid using x:y in the help
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1463
diff changeset
  2802
         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
  2803
1463
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
  2804
     - Fold revisions 3 and 4:
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
  2805
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
  2806
        hg fold "3 + 4" --exact
71a3aa0349c5 evolve: improve the help of the fold command
Laurent Charignon <lcharignon@fb.com>
parents: 1460
diff changeset
  2807
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2808
     - 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
  2809
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2810
         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
  2811
    """
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2812
    revs = list(revs)
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2813
    revs.extend(opts['rev'])
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2814
    if not revs:
994
debf44fa91a2 fold: clarify message for empty revision set and abort instead (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 993
diff changeset
  2815
        raise util.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
  2816
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2817
    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
  2818
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2819
    if not opts['exact']:
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2820
        # 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
  2821
        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
  2822
        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
  2823
        if discardedrevs:
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2824
            raise util.Abort(_("cannot fold non-linear revisions"),
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2825
                               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
  2826
                                      "of working directory"))
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2827
        revs = extrevs
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2828
995
0f3a7efd6ee9 fold: emit error message when folding a single revision
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 994
diff changeset
  2829
    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
  2830
        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
  2831
        return 1
995
0f3a7efd6ee9 fold: emit error message when folding a single revision
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 994
diff changeset
  2832
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2833
    roots = repo.revs('roots(%ld)', revs)
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2834
    if len(roots) > 1:
998
85ec2a55fe7c fold: improve error messages for multiple heads and roots
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 997
diff changeset
  2835
        raise util.Abort(_("cannot fold non-linear revisions "
85ec2a55fe7c fold: improve error messages for multiple heads and roots
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 997
diff changeset
  2836
                           "(multiple roots given)"))
1120
9bc4857f573b evolve: use `first` and `last` on revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1118
diff changeset
  2837
    root = repo[roots.first()]
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2838
    if root.phase() <= phases.public:
997
f48cd2f48d14 fold: reword error message for public commits
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 996
diff changeset
  2839
        raise util.Abort(_("cannot fold public revisions"))
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2840
    heads = repo.revs('heads(%ld)', revs)
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2841
    if len(heads) > 1:
998
85ec2a55fe7c fold: improve error messages for multiple heads and roots
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 997
diff changeset
  2842
        raise util.Abort(_("cannot fold non-linear revisions "
85ec2a55fe7c fold: improve error messages for multiple heads and roots
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 997
diff changeset
  2843
                           "(multiple heads given)"))
1120
9bc4857f573b evolve: use `first` and `last` on revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1118
diff changeset
  2844
    head = repo[heads.first()]
1398
7ddcbf5469bc evolve: make fold aware of allowunstable
Laurent Charignon <lcharignon@fb.com>
parents: 1397
diff changeset
  2845
    disallowunstable = not obsolete.isenabled(repo, obsolete.allowunstableopt)
7ddcbf5469bc evolve: make fold aware of allowunstable
Laurent Charignon <lcharignon@fb.com>
parents: 1397
diff changeset
  2846
    if disallowunstable:
1415
aaccca501ae0 evolve: drop len comparison in prune and fold
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1414
diff changeset
  2847
        if repo.revs("(%ld::) - %ld", revs, revs):
1398
7ddcbf5469bc evolve: make fold aware of allowunstable
Laurent Charignon <lcharignon@fb.com>
parents: 1397
diff changeset
  2848
            raise util.Abort(_("cannot fold chain not ending with a head "\
7ddcbf5469bc evolve: make fold aware of allowunstable
Laurent Charignon <lcharignon@fb.com>
parents: 1397
diff changeset
  2849
                               "or with branching"))
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2850
    wlock = lock = None
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2851
    try:
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2852
        wlock = repo.wlock()
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2853
        lock = repo.lock()
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2854
        tr = repo.transaction('touch')
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2855
        try:
915
1ebe5c51919b fold: enable --date and --user options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 912
diff changeset
  2856
            commitopts = opts.copy()
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2857
            allctx = [repo[r] for r in revs]
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2858
            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
  2859
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2860
            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
  2861
                commitopts['edit'] = False
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2862
            else:
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2863
                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
  2864
                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
  2865
                         (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
  2866
                commitopts['message'] =  "\n".join(msgs)
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2867
                commitopts['edit'] = True
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2868
993
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
  2869
            newid, unusedvariable = rewrite(repo, root, allctx, head,
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
  2870
                                            [root.p1().node(), root.p2().node()],
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
  2871
                                            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
  2872
            phases.retractboundary(repo, tr, targetphase, [newid])
1070
527b12a59628 drop relevant marker compat
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1069
diff changeset
  2873
            obsolete.createmarkers(repo, [(ctx, (repo[newid],))
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2874
                                 for ctx in allctx])
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2875
            tr.close()
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2876
        finally:
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2877
            tr.release()
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2878
        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
  2879
        if repo['.'].rev() in revs:
549
b047e9417d96 Properly update after fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 548
diff changeset
  2880
            hg.update(repo, newid)
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2881
    finally:
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2882
        lockmod.release(lock, wlock)
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2883
587
8152fedbac65 evolve: smarter code for divergent changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 586
diff changeset
  2884
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2885
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2886
@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
  2887
def graftwrapper(orig, ui, repo, *revs, **kwargs):
419
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
  2888
    kwargs = dict(kwargs)
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
  2889
    revs = list(revs) + kwargs.get('rev', [])
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
  2890
    kwargs['rev'] = []
417
a1fb18ad29a1 evolve: avoid duplication in graft wrapper
Patrick Mezard <patrick@mezard.eu>
parents: 416
diff changeset
  2891
    obsoleted = kwargs.setdefault('obsolete', [])
419
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
  2892
1256
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
  2893
    wlock = lock = None
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  2894
    try:
1256
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
  2895
        wlock = repo.wlock()
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
  2896
        lock = repo.lock()
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  2897
        if kwargs.get('old_obsolete'):
418
18a0d96ed559 evolve: graft --continue is optional, test
Patrick Mezard <patrick@mezard.eu>
parents: 417
diff changeset
  2898
            if kwargs.get('continue'):
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  2899
                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
  2900
            else:
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  2901
                obsoleted.extend(revs)
151
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
  2902
        # 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
  2903
        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
  2904
        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
  2905
743
af74a5cdf96b conform to the Mercurial custom of lowercase messages
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 742
diff changeset
  2906
            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
  2907
                                'obsoleting (for now).'))
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
  2908
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  2909
        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
  2910
    finally:
1256
f8cb01637e75 graft: avoid potential deadlock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1255
diff changeset
  2911
        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
  2912
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2913
@eh.extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2914
def oldevolveextsetup(ui):
742
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  2915
    for cmd in ['kill', 'uncommit', 'touch', 'fold']:
1226
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  2916
        try:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  2917
            entry = extensions.wrapcommand(cmdtable, cmd,
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  2918
                                           warnobserrors)
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  2919
        except error.UnknownCommand:
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  2920
            # Commands may be disabled
901d2f4b21a9 config: allow disabling commands
Durham Goode <durham@fb.com>
parents: 1221
diff changeset
  2921
            continue
356
56d4c6207ef9 Move obserror warning into the obsolete extension.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 355
diff changeset
  2922
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2923
    entry = cmdutil.findcmd('commit', commands.table)[1]
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  2924
    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
  2925
                     _("make commit obsolete this revision (DEPRECATED)")))
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2926
    entry = cmdutil.findcmd('graft', commands.table)[1]
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  2927
    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
  2928
                     _("make graft obsoletes this revision (DEPRECATED)")))
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  2929
    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
  2930
                     _("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
  2931
816
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
  2932
#####################################################################
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
  2933
### Obsolescence marker exchange experimenation                   ###
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
  2934
#####################################################################
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
  2935
1036
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  2936
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
  2937
    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
  2938
                             False)
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  2939
    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
  2940
        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
  2941
    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
  2942
        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
  2943
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2944
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
  2945
    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
  2946
    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
  2947
        topic = 'OBSEXC'
6a7d34010f8f evolve: re enable progress for all
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1042
diff changeset
  2948
    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
  2949
1300
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2950
@eh.wrapfunction(exchange, '_pushdiscoveryobsmarkers')
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2951
def _pushdiscoveryobsmarkers(orig, pushop):
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2952
    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
  2953
        and pushop.repo.obsstore
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2954
        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
  2955
        repo = pushop.repo
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2956
        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
  2957
        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
  2958
        unfi = repo.unfiltered()
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2959
        cl = unfi.changelog
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2960
        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
  2961
            # do not trust core yet
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2962
            # 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
  2963
            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
  2964
            if nodes:
5717d023da63 obsexc: use the common discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1077
diff changeset
  2965
                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
  2966
                                   % len(nodes))
5717d023da63 obsexc: use the common discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1077
diff changeset
  2967
                pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes)
5717d023da63 obsexc: use the common discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1077
diff changeset
  2968
            else:
5717d023da63 obsexc: use the common discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1077
diff changeset
  2969
                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
  2970
                pushop.outobsmarkers = []
1300
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2971
                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
  2972
            return
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2973
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2974
        common = []
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2975
        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
  2976
                           % len(revs))
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2977
        commonrevs = list(unfi.revs('::%ln', pushop.outgoing.commonheads))
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2978
        common = findcommonobsmarkers(pushop.ui, unfi, pushop.remote, commonrevs)
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2979
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2980
        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
  2981
        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
  2982
        if nodes:
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2983
            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
  2984
                               % len(nodes))
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2985
            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
  2986
        else:
4a27123e0696 evolve: stop conditional wrapping of _pushdiscoveryobsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1299
diff changeset
  2987
            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
  2988
            pushop.outobsmarkers = []
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2989
1075
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
  2990
@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
  2991
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
  2992
    """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
  2993
    caps = orig(repo, proto)
1214
4b10e2c6f7e3 config: remove uses of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1213
diff changeset
  2994
    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
  2995
        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
  2996
    return caps
816
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
  2997
1075
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
  2998
@eh.extsetup
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
  2999
def _installobsmarkersdiscovery(ui):
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
  3000
    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
  3001
    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
  3002
    # wrap command content
1205f42ae54c discovery: use a different setup step for discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1074
diff changeset
  3003
    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
  3004
    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
  3005
        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
  3006
    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
  3007
    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
  3008
    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
  3009
    if getattr(exchange, '_pushdiscoveryobsmarkers', None) is None:
87d60434b434 evolve: keep vague compatibility with 3.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1107
diff changeset
  3010
        ui.warn('evolve: your mercurial version is too old\n'
87d60434b434 evolve: keep vague compatibility with 3.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1107
diff changeset
  3011
                'evolve: (running in degraded mode, push will includes all markers)\n')
87d60434b434 evolve: keep vague compatibility with 3.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1107
diff changeset
  3012
    else:
87d60434b434 evolve: keep vague compatibility with 3.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1107
diff changeset
  3013
        olddisco = exchange.pushdiscoverymapping['obsmarker']
87d60434b434 evolve: keep vague compatibility with 3.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1107
diff changeset
  3014
        def newdisco(pushop):
87d60434b434 evolve: keep vague compatibility with 3.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1107
diff changeset
  3015
            _pushdiscoveryobsmarkers(olddisco, pushop)
87d60434b434 evolve: keep vague compatibility with 3.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1107
diff changeset
  3016
        exchange.pushdiscoverymapping['obsmarker'] = newdisco
816
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
  3017
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3018
### Set discovery START
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3019
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3020
from mercurial import dagutil
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3021
from mercurial import setdiscovery
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3022
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3023
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
  3024
    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
  3025
        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
  3026
    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
  3027
        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
  3028
    else:
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3029
        assert False
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3030
    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
  3031
    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
  3032
    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
  3033
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3034
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
  3035
    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
  3036
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3037
def srv_obshash1(repo, proto, nodes):
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3038
    return wireproto.encodelist(_obshash(repo, wireproto.decodelist(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
  3039
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3040
@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
  3041
def local_obshash(peer, nodes):
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3042
    return _obshash(peer._repo, nodes)
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3043
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3044
@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
  3045
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
  3046
    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
  3047
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3048
@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
  3049
def peer_obshash(self, nodes):
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3050
    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
  3051
    try:
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3052
        return wireproto.decodelist(d)
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3053
    except ValueError:
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3054
        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
  3055
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3056
@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
  3057
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
  3058
    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
  3059
    try:
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3060
        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
  3061
    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
  3062
        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
  3063
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3064
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
  3065
                         initialsamplesize=100,
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3066
                         fullsamplesize=200):
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3067
    # from discovery
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3068
    roundtrips = 0
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3069
    cl = local.changelog
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3070
    dag = dagutil.revlogdag(cl)
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3071
    missing = set()
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3072
    common = set()
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3073
    undecided = set(probeset)
1494
aca2495425a6 evolve: add progress for the obsmarkers discovery parts
timeless@mozdev.org
parents: 1488
diff changeset
  3074
    totalnb = len(undecided)
aca2495425a6 evolve: add progress for the obsmarkers discovery parts
timeless@mozdev.org
parents: 1488
diff changeset
  3075
    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
  3076
    _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
  3077
    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
  3078
        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
  3079
        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
  3080
    else:
1249
1556d8fed538 discovery: stop being stupid about variable name
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1244
diff changeset
  3081
        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
  3082
        localhash = _obsrelsethashtreefm0(local)
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3083
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3084
    while undecided:
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3085
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3086
        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
  3087
        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
  3088
            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
  3089
        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
  3090
            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
  3091
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3092
        roundtrips += 1
1494
aca2495425a6 evolve: add progress for the obsmarkers discovery parts
timeless@mozdev.org
parents: 1488
diff changeset
  3093
        ui.progress("comparing with other", totalnb - len(undecided),
aca2495425a6 evolve: add progress for the obsmarkers discovery parts
timeless@mozdev.org
parents: 1488
diff changeset
  3094
                    total=totalnb)
1072
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3095
        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
  3096
                 % (roundtrips, len(undecided), len(sample)))
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3097
        # 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
  3098
        sample = list(sample)
1249
1556d8fed538 discovery: stop being stupid about variable name
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1244
diff changeset
  3099
        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
  3100
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3101
        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
  3102
                 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
  3103
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3104
        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
  3105
        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
  3106
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3107
        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
  3108
        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
  3109
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3110
        undecided.difference_update(missing)
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3111
        undecided.difference_update(common)
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3112
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3113
1494
aca2495425a6 evolve: add progress for the obsmarkers discovery parts
timeless@mozdev.org
parents: 1488
diff changeset
  3114
    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
  3115
    result = dag.headsetofconnecteds(common)
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3116
    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
  3117
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3118
    if not result:
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3119
        return set([nullid])
1639810c11c2 code movement: gather discovery code together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1071
diff changeset
  3120
    return dag.externalizeall(result)
816
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
  3121
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
  3122
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
  3123
_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
  3124
854
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
  3125
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
  3126
    """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
  3127
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
  3128
    @util.propertycache
879
85b3d54516a7 exchange: expose length of pushed markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 877
diff changeset
  3129
    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
  3130
        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
  3131
1080
41d2555141ea evolve: allow read() from the magic StringIO
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1079
diff changeset
  3132
    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
  3133
        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
  3134
        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
  3135
961
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
  3136
    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
  3137
        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
  3138
        while d:
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
  3139
            yield d
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
  3140
            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
  3141
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
  3142
@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
  3143
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
  3144
    """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
  3145
    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
  3146
    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
  3147
        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
  3148
            return
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  3149
        stepsdone.add('obsmarkers')
1118
fbc400c1b022 evolve: adapt to core changeset 4f14303e8954
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1117
diff changeset
  3150
    if util.safehasattr(pushop, 'cgresult'):
fbc400c1b022 evolve: adapt to core changeset 4f14303e8954
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1117
diff changeset
  3151
        cgresult = pushop.cgresult
fbc400c1b022 evolve: adapt to core changeset 4f14303e8954
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1117
diff changeset
  3152
    else:
fbc400c1b022 evolve: adapt to core changeset 4f14303e8954
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1117
diff changeset
  3153
        cgresult = pushop.ret
fbc400c1b022 evolve: adapt to core changeset 4f14303e8954
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1117
diff changeset
  3154
    if cgresult == 0:
1077
cdfc19f25478 obsexc: push nothing if push fail
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1076
diff changeset
  3155
        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
  3156
    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
  3157
    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
  3158
    remote = pushop.remote
1214
4b10e2c6f7e3 config: remove uses of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1213
diff changeset
  3159
    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
  3160
        'obsolete' in remote.listkeys('namespaces')):
1078
5717d023da63 obsexc: use the common discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1077
diff changeset
  3161
        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
  3162
        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
  3163
            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
  3164
        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
  3165
            obsdata = pushobsmarkerStringIO()
1091
236a8e81551e compat: use in-core encodemarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1090
diff changeset
  3166
            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
  3167
                obsdata.write(chunk)
957
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  3168
            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
  3169
            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
  3170
            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
  3171
                               % (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
  3172
                      True)
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  3173
            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
  3174
            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
  3175
        else:
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  3176
            rslts = []
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  3177
            remotedata = _pushkeyescape(markers).items()
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  3178
            totalbytes = sum(len(d) for k,d in remotedata)
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  3179
            sentbytes = 0
1037
bddee73b361e evolve: add "absolescence" in front of markers in the message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1036
diff changeset
  3180
            obsexcmsg(repo.ui, "pushing %i obsolescence markers in %i pushkey payload (%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
  3181
                                % (len(markers), len(remotedata), totalbytes),
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  3182
                      True)
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  3183
            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
  3184
                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
  3185
                          total=totalbytes)
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  3186
                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
  3187
                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
  3188
                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
  3189
                          total=totalbytes)
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  3190
            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
  3191
            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
  3192
                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
  3193
                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
  3194
        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
  3195
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  3196
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  3197
@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
  3198
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
  3199
    """wireprotocol peer method"""
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  3200
    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
  3201
                    _('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
  3202
    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
  3203
    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
  3204
        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
  3205
    return ret
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  3206
880
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
  3207
@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
  3208
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
  3209
    """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
  3210
    (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
  3211
    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
  3212
                    _('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
  3213
    try:
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
  3214
        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
  3215
        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
  3216
        if len(vals) < 2:
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
  3217
            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
  3218
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
  3219
        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
  3220
            if l.strip():
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
  3221
                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
  3222
        return vals[0]
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
  3223
    except socket.error, err:
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
  3224
        if err.args[0] in (errno.ECONNRESET, errno.EPIPE):
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
  3225
            raise util.Abort(_('push failed: %s') % err.args[1])
fa35aeb64d32 evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 1206
diff changeset
  3226
        raise util.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
  3227
1081
dddb8a70437c obsexc: add support for evoext_pushobsmarkers_0 on localpeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1080
diff changeset
  3228
@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
  3229
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
  3230
    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
  3231
    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
  3232
    return caps
dddb8a70437c obsexc: add support for evoext_pushobsmarkers_0 on localpeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1080
diff changeset
  3233
1314
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
  3234
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
  3235
    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
  3236
    try:
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  3237
        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
  3238
        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
  3239
        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
  3240
        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
  3241
            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
  3242
        tr.close()
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  3243
    finally:
1308
676d88a82d4a evolve: improve transaction related code to use the lock module
Laurent Charignon <lcharignon@fb.com>
parents: 1307
diff changeset
  3244
        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
  3245
    repo.hook('evolve_pushobsmarkers')
1314
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
  3246
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
  3247
@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
  3248
def local_pushobsmarkers(peer, obsfile):
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
  3249
    data = obsfile.read()
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
  3250
    _pushobsmarkers(peer._repo, data)
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
  3251
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
  3252
def srv_pushobsmarkers(repo, proto):
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
  3253
    """wireprotocol command"""
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
  3254
    fp = StringIO()
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
  3255
    proto.redirect()
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
  3256
    proto.getfile(fp)
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
  3257
    data = fp.getvalue()
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
  3258
    fp.close()
d13d97363521 evolve: refactoring of code related to pushing obs markers
Laurent Charignon <lcharignon@fb.com>
parents: 1313
diff changeset
  3259
    _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
  3260
    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
  3261
1095
26334cfd4e95 evolve: fix a typo in a long function name
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1094
diff changeset
  3262
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
  3263
    """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
  3264
    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
  3265
7671717afef8 exchange: extract computation of pulled markers boundary in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 824
diff changeset
  3266
    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
  3267
    repo = pullop.repo
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
  3268
    remote = pullop.remote
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
  3269
    unfi = repo.unfiltered()
1196
9e3f332f7630 discovery: filter null from the discovery revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1193
diff changeset
  3270
    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
  3271
    common = [nullid]
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
  3272
    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
  3273
        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
  3274
                           % len(revs))
865
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
  3275
        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
  3276
    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
  3277
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  3278
@eh.uisetup
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  3279
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
  3280
    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
  3281
1097
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1096
diff changeset
  3282
@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
  3283
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
  3284
    ret = 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
  3285
    if 'obsmarkers' in kwargs and pullop.remote.capable('_evoext_getbundle_obscommon'):
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1096
diff changeset
  3286
        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
  3287
        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
  3288
        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
  3289
            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
  3290
    return ret
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  3291
1301
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3292
@eh.wrapfunction(exchange, '_getbundleobsmarkerpart')
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3293
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
  3294
    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
  3295
        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
  3296
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3297
    heads = kwargs.get('heads')
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3298
    if kwargs.get('obsmarkers', False):
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3299
        if heads is None:
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3300
            heads = repo.heads()
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3301
        obscommon = kwargs.get('evo_obscommon', ())
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3302
        assert obscommon
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3303
        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
  3304
        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
  3305
        markers = repo.obsstore.relevantmarkers(subset)
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3306
        exchange.buildobsmarkerspart(bundler, markers)
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3307
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3308
@eh.uisetup
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3309
def installgetbundlepartgen(ui):
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3310
    origfunc = exchange.getbundle2partsmapping['obsmarkers']
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3311
    def newfunc(*args, **kwargs):
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3312
        return _getbundleobsmarkerpart(origfunc, *args, **kwargs)
896d66841f7f evolve: stop conditional wrapping of _getbundleobsmarkerpart
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1300
diff changeset
  3313
    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
  3314
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3315
@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
  3316
def _pullobsolete(orig, pullop):
1214
4b10e2c6f7e3 config: remove uses of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1213
diff changeset
  3317
    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
  3318
        return None
1132
7a1784a1c642 pullobsolete: handle migration from todosteps to donesteps
Augie Fackler <raf@durin42.com>
parents: 1131
diff changeset
  3319
    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
  3320
        return None
7a1784a1c642 pullobsolete: handle migration from todosteps to donesteps
Augie Fackler <raf@durin42.com>
parents: 1131
diff changeset
  3321
    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
  3322
        return None
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  3323
    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
  3324
    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
  3325
        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
  3326
    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
  3327
        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
  3328
    tr = None
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3329
    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
  3330
    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
  3331
    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
  3332
        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
  3333
        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
  3334
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
  3335
    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
  3336
    new = 0
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  3337
1082
74bc8a0c2c02 pull: drop the custom bundle2 part
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1081
diff changeset
  3338
    if wirepull:
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  3339
        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
  3340
        obsdata = obsdata.read()
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  3341
        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
  3342
            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
  3343
                           % len(obsdata))
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  3344
            tr = pullop.gettransaction()
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  3345
            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
  3346
            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
  3347
            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
  3348
            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
  3349
        else:
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  3350
            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
  3351
        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
  3352
    if new:
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  3353
        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
  3354
    return tr
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3355
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3356
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
  3357
    revset = ''
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3358
    args = []
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3359
    repo = repo.unfiltered()
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3360
    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
  3361
        revset = 'all()'
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3362
    elif heads:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3363
        revset += "(::%ln)"
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3364
        args.append(heads)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3365
    else:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3366
        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
  3367
    if common:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3368
        revset += ' - (::%ln)'
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3369
        args.append(common)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3370
    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
  3371
    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
  3372
    obsdata = StringIO()
1091
236a8e81551e compat: use in-core encodemarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1090
diff changeset
  3373
    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
  3374
        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
  3375
    obsdata.seek(0)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3376
    return obsdata
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3377
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3378
@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
  3379
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
  3380
    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
  3381
    opts = {}
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3382
    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
  3383
        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
  3384
    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
  3385
        opts['common'] = wireproto.encodelist(common)
897
b5227608d9dd evolve: use new api _callcompressable
Olle Lundberg <geek@nerd.sh>
parents: 896
diff changeset
  3386
    if util.safehasattr(self, '_callcompressable'):
b5227608d9dd evolve: use new api _callcompressable
Olle Lundberg <geek@nerd.sh>
parents: 896
diff changeset
  3387
        f = self._callcompressable("evoext_pullobsmarkers_0", **opts)
b5227608d9dd evolve: use new api _callcompressable
Olle Lundberg <geek@nerd.sh>
parents: 896
diff changeset
  3388
    else:
b5227608d9dd evolve: use new api _callcompressable
Olle Lundberg <geek@nerd.sh>
parents: 896
diff changeset
  3389
        f = self._callstream("evoext_pullobsmarkers_0", **opts)
b5227608d9dd evolve: use new api _callcompressable
Olle Lundberg <geek@nerd.sh>
parents: 896
diff changeset
  3390
        f = self._decompress(f)
898
934b6f0feffd evolve: small white space change
Olle Lundberg <geek@nerd.sh>
parents: 897
diff changeset
  3391
    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
  3392
    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
  3393
    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
  3394
    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
  3395
    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
  3396
    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
  3397
    while current < length:
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
  3398
        readsize = min(length-current, chunk)
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
  3399
        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
  3400
        current += readsize
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  3401
        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
  3402
    obsexcprg(ui, None)
870
1a23c7c52a43 exchange: fix pull over wire protocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 869
diff changeset
  3403
    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
  3404
    return data
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3405
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3406
@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
  3407
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
  3408
    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
  3409
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  3410
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
  3411
    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
  3412
    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
  3413
        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
  3414
            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
  3415
    obsdata = _getobsmarkersstream(repo, **opts)
877
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
  3416
    finaldata = StringIO()
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
  3417
    obsdata = obsdata.getvalue()
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
  3418
    finaldata.write('%20i' % len(obsdata))
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
  3419
    finaldata.write(obsdata)
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
  3420
    finaldata.seek(0)
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
  3421
    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
  3422
1244
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3423
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
  3424
    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
  3425
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3426
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
  3427
    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
  3428
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3429
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
  3430
    cache = []
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3431
    unfi = repo.unfiltered()
1203
936aa82884ab evolve: cache marker encoding to avoid performance degradation
Mathias De Maré <mathias.demare@gmail.com>
parents: 1202
diff changeset
  3432
    markercache = {}
1495
625b75a01196 evolve: add progress for _obsrelsethashtree
timeless@mozdev.org
parents: 1494
diff changeset
  3433
    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
  3434
    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
  3435
        ctx = unfi[i]
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3436
        entry = 0
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3437
        sha = util.sha1()
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3438
        # 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
  3439
        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
  3440
            p = p.rev()
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3441
            if p < 0:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3442
                p = nullid
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3443
            else:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3444
                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
  3445
            if p != nullid:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3446
                entry += 1
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3447
                sha.update(p)
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3448
        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
  3449
        if tmarkers:
1203
936aa82884ab evolve: cache marker encoding to avoid performance degradation
Mathias De Maré <mathias.demare@gmail.com>
parents: 1202
diff changeset
  3450
            bmarkers = []
936aa82884ab evolve: cache marker encoding to avoid performance degradation
Mathias De Maré <mathias.demare@gmail.com>
parents: 1202
diff changeset
  3451
            for m in tmarkers:
936aa82884ab evolve: cache marker encoding to avoid performance degradation
Mathias De Maré <mathias.demare@gmail.com>
parents: 1202
diff changeset
  3452
                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
  3453
                    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
  3454
                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
  3455
            bmarkers.sort()
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3456
            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
  3457
                entry += 1
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3458
                sha.update(m)
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3459
        if entry:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3460
            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
  3461
        else:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3462
            cache.append((ctx.node(), nullid))
1495
625b75a01196 evolve: add progress for _obsrelsethashtree
timeless@mozdev.org
parents: 1494
diff changeset
  3463
        repo.ui.progress("preparing locally", i, total=len(unfi))
625b75a01196 evolve: add progress for _obsrelsethashtree
timeless@mozdev.org
parents: 1494
diff changeset
  3464
    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
  3465
    return cache
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3466
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3467
@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
  3468
        [('', 'v0', None, 'hash on marker format "0"'),
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3469
         ('', 'v1', None, 'hash on marker format "1" (default)')
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3470
         ,] , _(''))
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3471
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
  3472
    """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
  3473
    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
  3474
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3475
    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
  3476
    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
  3477
    if v0 and v1:
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3478
        raise util.Abort('cannot only specify one format')
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3479
    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
  3480
        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
  3481
    else:
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3482
        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
  3483
3249814dabd1 discovery: introduce a obshash1 function using fm1 during hashing (issue4587)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1230
diff changeset
  3484
    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
  3485
        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
  3486
1159
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
  3487
_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
  3488
1202
4099b087f672 evolve: handle invalid obsmarkers in the `debugobsconvert`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1198
diff changeset
  3489
1302
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  3490
@eh.wrapfunction(obsolete, '_checkinvalidmarkers')
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  3491
def _checkinvalidmarkers(orig, markers):
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  3492
    """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
  3493
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  3494
    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
  3495
    subtle handling.
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  3496
    """
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  3497
    if 'debugobsconvert' in sys.argv:
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  3498
        return
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  3499
    for mark in markers:
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  3500
        if node.nullid in mark[1]:
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  3501
            raise util.Abort(_('bad obsolescence marker detected: '
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  3502
                               'invalid successors nullid'),
ebcf23fe3032 evolve: stop conditional wrapping of _checkinvalidmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1301
diff changeset
  3503
                             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
  3504
1159
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
  3505
@command(
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
  3506
    'debugobsconvert',
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
  3507
    [('', '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
  3508
    '')
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
  3509
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
  3510
    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
  3511
    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
  3512
        msg = _('New format is the same as the old format, not upgrading!')
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
  3513
        raise util.Abort(msg)
1465
777e5c369d99 compat: use svfs instead of sopener
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1464
diff changeset
  3514
    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
  3515
    known = set()
6f08a8f6bb1d debugobsconvert: also deduplicate markers in the process
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1159
diff changeset
  3516
    markers = []
1172
8d28bb4fc127 debugobsconvert: fix 6f08a8f6bb1d and add proper test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1171
diff changeset
  3517
    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
  3518
        # filter out invalid markers
4099b087f672 evolve: handle invalid obsmarkers in the `debugobsconvert`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1198
diff changeset
  3519
        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
  3520
            m = list(m)
4099b087f672 evolve: handle invalid obsmarkers in the `debugobsconvert`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1198
diff changeset
  3521
            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
  3522
            m = tuple(m)
1169
6f08a8f6bb1d debugobsconvert: also deduplicate markers in the process
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1159
diff changeset
  3523
        if m in known:
6f08a8f6bb1d debugobsconvert: also deduplicate markers in the process
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1159
diff changeset
  3524
            continue
1172
8d28bb4fc127 debugobsconvert: fix 6f08a8f6bb1d and add proper test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1171
diff changeset
  3525
        known.add(m)
1169
6f08a8f6bb1d debugobsconvert: also deduplicate markers in the process
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1159
diff changeset
  3526
        markers.append(m)
1170
4697f23e0ede debugobsconvert: fix a typo on "version"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1169
diff changeset
  3527
    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
  3528
        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
  3529
    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
  3530
    f.close()
04bd66779a1f obsup: hack extension to make in-place upgrading of obsolete markers easy
Augie Fackler <raf@durin42.com>
parents: 1157
diff changeset
  3531
    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
  3532
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  3533
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  3534
@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
  3535
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
  3536
    """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
  3537
    caps = orig(repo, proto)
1214
4b10e2c6f7e3 config: remove uses of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1213
diff changeset
  3538
    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
  3539
        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
  3540
        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
  3541
        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
  3542
        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
  3543
        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
  3544
    return caps
863
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3545
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  3546
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  3547
@eh.extsetup
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  3548
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
  3549
    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
  3550
    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
  3551
    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
  3552
    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
  3553
    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
  3554
    # wrap command content
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 871
diff changeset
  3555
    oldcap, args = wireproto.commands['capabilities']
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 871
diff changeset
  3556
    def newcap(repo, proto):
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 871
diff changeset
  3557
        return capabilities(oldcap, repo, proto)
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 871
diff changeset
  3558
    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
  3559
1509
405be3783fbc evolve: ignore ui argument passed to help loader
Yuya Nishihara <yuya@tcha.org>
parents: 1507
diff changeset
  3560
# Mercurial >= 3.6 passes ui
405be3783fbc evolve: ignore ui argument passed to help loader
Yuya Nishihara <yuya@tcha.org>
parents: 1507
diff changeset
  3561
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
  3562
    return help.gettext(evolutionhelptext)
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  3563
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  3564
@eh.uisetup
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  3565
def _setuphelp(ui):
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  3566
    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
  3567
        if entry[0] == "evolution":
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  3568
            break
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  3569
    else:
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  3570
        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
  3571
                      _helploader))
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
  3572
        help.helptable.sort()