hgext/obsolete.py
author Pierre-Yves David <pierre-yves.david@logilab.fr>
Tue, 07 Aug 2012 15:02:54 +0200
changeset 437 48ac58354b7b
parent 436 1e042eeb2d1a
child 438 b1b7b5ef506a
permissions -rw-r--r--
obsolete: sort all code Move (splitting some function) all code in dedicated section The hook wrapping have disapeared in the process.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     1
# obsolete.py - introduce the obsolete concept in mercurial.
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     2
#
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     3
# Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     4
#                Logilab SA        <contact@logilab.fr>
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     5
#
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     6
# This software may be used and distributed according to the terms of the
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     7
# GNU General Public License version 2 or any later version.
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
     8
"""Introduce the Obsolete concept to mercurial
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
     9
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    10
General concept
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    11
===============
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    12
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    13
This extension introduces the *obsolete* concept. It adds a new *obsolete*
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    14
relation between two changesets. A relation ``<changeset B> obsolete <changeset
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    15
A>`` is set to denote that ``<changeset B>`` is new version of ``<changeset
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    16
A>``.
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    17
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    18
The *obsolete* relation act as a **perpendicular history** to the standard
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    19
changeset history. Standard changeset history versions files. The *obsolete*
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    20
relation versions changesets.
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    21
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    22
:obsolete:     a changeset that has been replaced by another one.
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    23
:unstable:     a changeset that is not obsolete but has an obsolete ancestor.
85
531058dbd703 [obsolete] vocabulary update suggestion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 84
diff changeset
    24
:suspended:    an obsolete changeset with unstable descendant.
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    25
:extinct:      an obsolete changeset without unstable descendant.
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
    26
               (subject to garbage collection)
85
531058dbd703 [obsolete] vocabulary update suggestion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 84
diff changeset
    27
531058dbd703 [obsolete] vocabulary update suggestion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 84
diff changeset
    28
Another name for unstable could be out of sync.
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    29
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    30
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    31
Usage and Feature
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    32
=================
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    33
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    34
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    35
New commands
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    36
------------
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    37
415
ea7f2a4ad530 obsolete: fix doc, rebase no longer aborts with --keep
Patrick Mezard <patrick@mezard.eu>
parents: 409
diff changeset
    38
Note that rebased changesets are now marked obsolete instead of being stripped.
275
336210dada95 obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents: 274
diff changeset
    39
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    40
"""
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    41
435
97d82fbd2c24 obsolete: clean up import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 434
diff changeset
    42
import sys
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 53
diff changeset
    43
75
d7b11772f0b5 [obsolete] published changeset can't be obsoleted
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 74
diff changeset
    44
from mercurial.i18n import _
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    45
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
    46
import json
89
757153438e58 [obsolet] base64 encore obsolete rel for pushkey
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
    47
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
    48
import struct
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
    49
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
    50
_pack = struct.pack
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
    51
_unpack = struct.unpack
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
    52
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    53
from mercurial import util
433
aa1255c2ac8f obsolete: move version checks at the start of the file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 432
diff changeset
    54
aa1255c2ac8f obsolete: move version checks at the start of the file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 432
diff changeset
    55
try:
aa1255c2ac8f obsolete: move version checks at the start of the file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 432
diff changeset
    56
    from mercurial import obsolete
aa1255c2ac8f obsolete: move version checks at the start of the file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 432
diff changeset
    57
    obsolete._enabled = True
aa1255c2ac8f obsolete: move version checks at the start of the file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 432
diff changeset
    58
except ImportError:
aa1255c2ac8f obsolete: move version checks at the start of the file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 432
diff changeset
    59
        raise util.Abort('Obsolete extension requires Mercurial 2.3 (or later)')
aa1255c2ac8f obsolete: move version checks at the start of the file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 432
diff changeset
    60
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    61
from mercurial import context
39
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 38
diff changeset
    62
from mercurial import revset
40
b9a5a596d9ef proper computation of hidden changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 39
diff changeset
    63
from mercurial import scmutil
42
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
    64
from mercurial import extensions
46
3b0364fc822f Do not propagate obsolete changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 44
diff changeset
    65
from mercurial import discovery
3b0364fc822f Do not propagate obsolete changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 44
diff changeset
    66
from mercurial import error
79
9906560f585e [obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 75
diff changeset
    67
from mercurial import commands
115
d60eddda9546 add an option to ensure unstable are secret
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 114
diff changeset
    68
from mercurial import phases
435
97d82fbd2c24 obsolete: clean up import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 434
diff changeset
    69
from mercurial.node import bin, short, nullid
276
f26e9bc5f7fc obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents: 275
diff changeset
    70
from mercurial import cmdutil
299
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
    71
from mercurial import templatekw
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    72
432
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    73
# This extension hold the following code
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    74
#
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    75
# - Extension Helper code
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    76
# - ...
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    77
# - Older format compat
160
24346b78cd99 mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 150
diff changeset
    78
432
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    79
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    80
432
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    81
#####################################################################
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
    82
### Extension helper                                              ###
432
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    83
#####################################################################
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    84
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    85
class exthelper(object):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    86
    """Helper for modular extension setup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    87
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    88
    A single helper should be intanciated for each extension. Helper method are
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    89
    then used as decorator for various purpose.
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    90
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    91
    All decorator returns the original function and may be chained.
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    92
    """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    93
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    94
    def __init__(self):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    95
        self._uicallables = []
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    96
        self._extcallables = []
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    97
        self._repocallables = []
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    98
        self._revsetsymbols = []
431
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
    99
        self._templatekws = []
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   100
        self._commandwrappers = []
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   101
        self._extcommandwrappers = []
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   102
        self._functionwrappers = []
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   103
        self._duckpunchers = []
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   104
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   105
    def final_uisetup(self, ui):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   106
        """Method to be used as a the extension uisetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   107
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   108
        The following operations belong here:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   109
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   110
        - Changes to ui.__class__ . The ui object that will be used to run the
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   111
          command has not yet been created. Changes made here will affect ui
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   112
          objects created after this, and in particular the ui that will be
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   113
          passed to runcommand
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   114
        - Command wraps (extensions.wrapcommand)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   115
        - Changes that need to be visible by other extensions: because
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   116
          initialization occurs in phases (all extensions run uisetup, then all
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   117
          run extsetup), a change made here will be visible by other extensions
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   118
          during extsetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   119
        - Monkeypatches or function wraps (extensions.wrapfunction) of dispatch
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   120
          module members
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   121
        - Setup of pre-* and post-* hooks
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   122
        - pushkey setup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   123
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   124
        for cont, funcname, func in self._duckpunchers:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   125
            setattr(cont, funcname, func)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   126
        for command, wrapper in self._commandwrappers:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   127
            extensions.wrapcommand(commands.table, command, wrapper)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   128
        for cont, funcname, wrapper in self._functionwrappers:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   129
            extensions.wrapfunction(cont, funcname, wrapper)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   130
        for c in self._uicallables:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   131
            c(ui)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   132
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   133
    def final_extsetup(self, ui):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   134
        """Method to be used as a the extension extsetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   135
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   136
        The following operations belong here:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   137
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   138
        - Changes depending on the status of other extensions. (if extensions.find('mq'))
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   139
        - Add a global option to all commands
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   140
        - Extend revsets 
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   141
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   142
        knownexts = {}
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   143
        for name, symbol in self._revsetsymbols:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   144
            revset.symbols[name] = symbol
431
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   145
        for name, kw in self._templatekws:
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   146
            templatekw.keywords[name] = kw
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   147
        for ext, command, wrapper in self._extcommandwrappers:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   148
            if ext not in knownexts:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   149
                e = extensions.find('rebase')
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   150
                if e is None:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   151
                    raise util.Abort('extension %s not found' %e)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   152
                knownexts[ext] = e.cmdtable
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   153
            extensions.wrapcommand(knownexts[ext], commands, wrapper)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   154
        for c in self._extcallables:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   155
            c(ui)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   156
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   157
    def final_reposetup(self, ui, repo):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   158
        """Method to be used as a the extension reposetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   159
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   160
        The following operations belong here:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   161
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   162
        - All hooks but pre-* and post-*
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   163
        - Modify configuration variables
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   164
        - Changes to repo.__class__, repo.dirstate.__class__
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   165
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   166
        for c in self._repocallables:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   167
            c(ui, repo)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   168
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   169
    def uisetup(self, call):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   170
        """Decorated function will be executed during uisetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   171
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   172
        example::
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   173
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   174
            @eh.uisetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   175
            def setupbabar(ui):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   176
                print 'this is uisetup!'
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   177
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   178
        self._uicallables.append(call)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   179
        return call
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   180
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   181
    def extsetup(self, call):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   182
        """Decorated function will be executed during extsetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   183
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   184
        example::
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   185
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   186
            @eh.extsetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   187
            def setupcelestine(ui):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   188
                print 'this is extsetup!'
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   189
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   190
        self._uicallables.append(call)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   191
        return call
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   192
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   193
    def reposetup(self, call):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   194
        """Decorated function will be executed during reposetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   195
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   196
        example::
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   197
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   198
            @eh.reposetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   199
            def setupzephir(ui, repo):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   200
                print 'this is reposetup!'
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   201
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   202
        self._repocallables.append(call)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   203
        return call
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   204
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   205
    def revset(self, symbolname):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   206
        """Decorated function is a revset symbol
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   207
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   208
        The name of the symbol must be given as the decorator argument.
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   209
        The symbol is added during `extsetup`.
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   210
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   211
        example::
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   212
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   213
            @eh.revset('hidden')
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   214
            def revsetbabar(repo, subset, x):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   215
                args = revset.getargs(x, 0, 0, 'babar accept no argument')
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   216
                return [r for r in subset if 'babar' in repo[r].description()]
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   217
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   218
        def dec(symbol):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   219
            self._revsetsymbols.append((symbolname, symbol))
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   220
            return symbol
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   221
        return dec
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   222
431
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   223
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   224
    def templatekw(self, keywordname):
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   225
        """Decorated function is a revset keyword
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   226
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   227
        The name of the keyword must be given as the decorator argument.
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   228
        The symbol is added during `extsetup`.
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   229
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   230
        example::
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   231
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   232
            @eh.templatekw('babar')
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   233
            def kwbabar(ctx):
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   234
                return 'babar'
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   235
        """
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   236
        def dec(keyword):
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   237
            self._templatekws.append((keywordname, keyword))
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   238
            return keyword
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   239
        return dec
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   240
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   241
    def wrapcommand(self, command, extension=None):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   242
        """Decorated function is a command wrapper
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   243
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   244
        The name of the command must be given as the decorator argument.
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   245
        The wrapping is installed during `uisetup`.
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   246
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   247
        If the second option `extension` argument is provided, the wrapping
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   248
        will be applied in the extension commandtable. This argument must be a
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   249
        string that will be searched using `extension.find` if not found and
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   250
        Abort error is raised. If the wrapping apply to an extension, it is
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   251
        installed during `extsetup`
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   252
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   253
        example::
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   254
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   255
            @eh.wrapcommand('summary')
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   256
            def wrapsummary(orig, ui, repo, *args, **kwargs):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   257
                ui.note('Barry!')
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   258
                return orig(ui, repo, *args, **kwargs)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   259
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   260
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   261
        def dec(wrapper):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   262
            if extension is None:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   263
                self._commandwrappers.append((command, wrapper))
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   264
            else:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   265
                self._extcommandwrappers.append((extension, command, wrapper))
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   266
            return wrapper
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   267
        return dec
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   268
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   269
    def wrapfunction(self, container, funcname):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   270
        """Decorated function is a function wrapper
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   271
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   272
        This function take two argument, the container and the name of the
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   273
        function to wrap. The wrapping is performed during `uisetup`.
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   274
        (there is don't support extension)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   275
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   276
        example::
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   277
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   278
            @eh.function(discovery, 'checkheads')
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   279
            def wrapfunction(orig, *args, **kwargs):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   280
                ui.note('His head smashed in and his heart cut out')
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   281
                return orig(*args, **kwargs)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   282
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   283
        def dec(wrapper):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   284
            self._functionwrappers.append((container, funcname, wrapper))
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   285
            return wrapper
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   286
        return dec
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   287
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   288
    def addattr(self, container, funcname):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   289
        """Decorated function is to be added to the container
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   290
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   291
        This function take two argument, the container and the name of the
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   292
        function to wrap. The wrapping is performed during `uisetup`.
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   293
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   294
        example::
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   295
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   296
            @eh.function(context.changectx, 'babar')
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   297
            def babar(ctx):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   298
                return 'babar' in ctx.description
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   299
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   300
        def dec(func):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   301
            self._duckpunchers.append((container, funcname, func))
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   302
            return func
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   303
        return dec
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   304
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   305
eh = exthelper()
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   306
uisetup = eh.final_uisetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   307
extsetup = eh.final_extsetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   308
reposetup = eh.final_reposetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   309
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   310
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   311
### Obsolescence Caching Logic                                    ###
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   312
#####################################################################
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   313
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   314
@eh.addattr(context.changectx, 'unstable')
148
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   315
def unstable(ctx):
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   316
    """is the changeset unstable (have obsolete ancestor)"""
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   317
    if ctx.node() is None:
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   318
        return False
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   319
    return ctx.rev() in ctx._repo._unstableset
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   320
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   321
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   322
@eh.addattr(context.changectx, 'extinct')
213
ea4aa1890b16 obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 212
diff changeset
   323
def extinct(ctx):
ea4aa1890b16 obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 212
diff changeset
   324
    """is the changeset extinct by other"""
ea4aa1890b16 obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 212
diff changeset
   325
    if ctx.node() is None:
ea4aa1890b16 obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 212
diff changeset
   326
        return False
ea4aa1890b16 obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 212
diff changeset
   327
    return ctx.rev() in ctx._repo._extinctset
ea4aa1890b16 obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 212
diff changeset
   328
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   329
@eh.revset('obsolete')
39
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 38
diff changeset
   330
def revsetobsolete(repo, subset, x):
397
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   331
    """``obsolete()``
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   332
    Changeset is obsolete.
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   333
    """
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   334
    args = revset.getargs(x, 0, 0, 'obsolete takes no argument')
252
470232cea503 [obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 228
diff changeset
   335
    return [r for r in subset if r in repo._obsoleteset and repo._phasecache.phase(repo, r) > 0]
470232cea503 [obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 228
diff changeset
   336
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   337
@eh.revset('unstable')
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   338
def revsetunstable(repo, subset, x):
397
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   339
    """``unstable()``
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   340
    Unstable changesets are non-obsolete with obsolete ancestors.
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   341
    """
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   342
    args = revset.getargs(x, 0, 0, 'unstable takes no arguments')
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   343
    return [r for r in subset if r in repo._unstableset]
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   344
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   345
@eh.revset('extinct')
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   346
def revsetextinct(repo, subset, x):
397
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   347
    """``extinct()``
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   348
    Obsolete changesets with obsolete descendants only.
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   349
    """
310
2d0dc5c18489 [obsolete] fix revset error message
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 308
diff changeset
   350
    args = revset.getargs(x, 0, 0, 'extinct takes no arguments')
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   351
    return [r for r in subset if r in repo._extinctset]
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   352
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   353
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   354
@eh.wrapfunction(phases, 'advanceboundary')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   355
def wrapclearcache(orig, repo, *args, **kwargs):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   356
    try:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   357
        return orig(repo, *args, **kwargs)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   358
    finally:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   359
        repo._clearobsoletecache()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   360
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   361
@eh.reposetup
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   362
def _repocachesetup(ui, repo):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   363
    if not repo.local():
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   364
        return
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   365
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   366
    o_updatebranchcache = repo.updatebranchcache
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   367
    class cachedobsolescencegrepo(repo.__class__):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   368
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   369
        # XXX move me on obssotre
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   370
        @util.propertycache
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   371
        def _obsoleteset(self):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   372
            """the set of obsolete revision"""
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   373
            obs = set()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   374
            nm = self.changelog.nodemap
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   375
            for prec in self.obsstore.precursors:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   376
                rev = nm.get(prec)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   377
                if rev is not None:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   378
                    obs.add(rev)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   379
            return obs
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   380
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   381
        # XXX move me on obssotre
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   382
        @util.propertycache
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   383
        def _unstableset(self):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   384
            """the set of non obsolete revision with obsolete parent"""
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   385
            return set(self.revs('(obsolete()::) - obsolete()'))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   386
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   387
        # XXX move me on obssotre
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   388
        @util.propertycache
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   389
        def _suspendedset(self):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   390
            """the set of obsolete parent with non obsolete descendant"""
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   391
            return set(self.revs('obsolete() and obsolete()::unstable()'))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   392
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   393
        # XXX move me on obssotre
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   394
        @util.propertycache
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   395
        def _extinctset(self):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   396
            """the set of obsolete parent without non obsolete descendant"""
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   397
            return set(self.revs('obsolete() - obsolete()::unstable()'))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   398
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   399
        # XXX move me on obssotre
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   400
        @util.propertycache
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   401
        def _latecomerset(self):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   402
            """the set of rev trying to obsolete public revision"""
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   403
            query = 'allsuccessors(public()) - obsolete() - public()'
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   404
            return set(self.revs(query))
143
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   405
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   406
        # XXX move me on obssotre
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   407
        @util.propertycache
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   408
        def _conflictingset(self):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   409
            """the set of rev trying to obsolete public revision"""
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   410
            conflicting = set()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   411
            obsstore = self.obsstore
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   412
            newermap = {}
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   413
            for ctx in self.set('(not public()) - obsolete()'):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   414
                prec = obsstore.successors.get(ctx.node(), ())
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   415
                toprocess = set(prec)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   416
                while toprocess:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   417
                    prec = toprocess.pop()[0]
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   418
                    if prec not in newermap:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   419
                        newermap[prec] = newerversion(self, prec)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   420
                    newer = [n for n in newermap[prec] if n] # filter kill
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   421
                    if len(newer) > 1:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   422
                        conflicting.add(ctx.rev())
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   423
                        break
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   424
                toprocess.update(obsstore.successors.get(prec, ()))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   425
            return conflicting
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   426
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   427
        def _clearobsoletecache(self):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   428
            if '_obsoleteset' in vars(self):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   429
                del self._obsoleteset
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   430
            self._clearunstablecache()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   431
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   432
        def updatebranchcache(self):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   433
            o_updatebranchcache()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   434
            self._clearunstablecache()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   435
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   436
        def _clearunstablecache(self):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   437
            if '_unstableset' in vars(self):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   438
                del self._unstableset
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   439
            if '_suspendedset' in vars(self):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   440
                del self._suspendedset
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   441
            if '_extinctset' in vars(self):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   442
                del self._extinctset
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   443
            if '_latecomerset' in vars(self):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   444
                del self._latecomerset
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   445
            if '_conflictingset' in vars(self):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   446
                del self._conflictingset
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   447
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   448
    repo.__class__ = cachedobsolescencegrepo
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   449
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   450
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   451
### Complete troubles computation logic                           ###
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   452
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   453
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   454
@eh.addattr(context.changectx, 'latecomer')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   455
def latecomer(ctx):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   456
    """is the changeset latecomer (Try to succeed to public change)"""
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   457
    if ctx.node() is None:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   458
        return False
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   459
    return ctx.rev() in ctx._repo._latecomerset
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   460
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   461
@eh.addattr(context.changectx, 'conflicting')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   462
def conflicting(ctx):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   463
    """is the changeset conflicting (Try to succeed to public change)"""
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   464
    if ctx.node() is None:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   465
        return False
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   466
    return ctx.rev() in ctx._repo._conflictingset
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   467
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   468
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   469
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   470
### Additional Utilities functions                                ###
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   471
#####################################################################
354
bd26eb9714fb obsolete: Detect conflicting changeset!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 351
diff changeset
   472
305
0b444d7c5c96 update revset vocabulary to use precursors, successors
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 304
diff changeset
   473
def _precursors(repo, s):
0b444d7c5c96 update revset vocabulary to use precursors, successors
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 304
diff changeset
   474
    """Precursor of a changeset"""
143
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   475
    cs = set()
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   476
    nm = repo.changelog.nodemap
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   477
    markerbysubj = repo.obsstore.successors
143
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   478
    for r in s:
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   479
        for p in markerbysubj.get(repo[r].node(), ()):
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   480
            pr = nm.get(p[0])
143
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   481
            if pr is not None:
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   482
                cs.add(pr)
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   483
    return cs
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   484
305
0b444d7c5c96 update revset vocabulary to use precursors, successors
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 304
diff changeset
   485
def _allprecursors(repo, s):  # XXX we need a better naming
0b444d7c5c96 update revset vocabulary to use precursors, successors
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 304
diff changeset
   486
    """transitive precursors of a subset"""
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   487
    toproceed = [repo[r].node() for r in s]
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   488
    seen = set()
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   489
    allsubjects = repo.obsstore.successors
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   490
    while toproceed:
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   491
        nc = toproceed.pop()
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   492
        for mark in allsubjects.get(nc, ()):
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   493
            np = mark[0]
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   494
            if np not in seen:
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   495
                seen.add(np)
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   496
                toproceed.append(np)
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   497
    nm = repo.changelog.nodemap
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   498
    cs = set()
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   499
    for p in seen:
204
50039b9b535e 2.2 compat: nodemap.get take a single argument now.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 203
diff changeset
   500
        pr = nm.get(p)
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   501
        if pr is not None:
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   502
            cs.add(pr)
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   503
    return cs
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   504
306
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   505
def _successors(repo, s):
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   506
    """Successors of a changeset"""
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   507
    cs = set()
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   508
    nm = repo.changelog.nodemap
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   509
    markerbyobj = repo.obsstore.precursors
306
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   510
    for r in s:
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   511
        for p in markerbyobj.get(repo[r].node(), ()):
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   512
            for sub in p[1]:
306
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   513
                sr = nm.get(sub)
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   514
                if sr is not None:
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   515
                    cs.add(sr)
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   516
    return cs
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   517
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   518
def _allsuccessors(repo, s):  # XXX we need a better naming
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   519
    """transitive successors of a subset"""
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   520
    toproceed = [repo[r].node() for r in s]
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   521
    seen = set()
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   522
    allobjects = repo.obsstore.precursors
306
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   523
    while toproceed:
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   524
        nc = toproceed.pop()
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   525
        for mark in allobjects.get(nc, ()):
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   526
            for sub in mark[1]:
306
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   527
                if sub not in seen:
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   528
                    seen.add(sub)
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   529
                    toproceed.append(sub)
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   530
    nm = repo.changelog.nodemap
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   531
    cs = set()
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   532
    for s in seen:
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   533
        sr = nm.get(s)
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   534
        if sr is not None:
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   535
            cs.add(sr)
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   536
    return cs
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   537
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   538
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   539
### diagnostique tools
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   540
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   541
def unstables(repo):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   542
    """Return all unstable changeset"""
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   543
    return scmutil.revrange(repo, ['obsolete():: and (not obsolete())'])
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   544
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   545
def newerversion(repo, obs):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   546
    """Return the newer version of an obsolete changeset"""
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   547
    toproceed = set([(obs,)])
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   548
    # XXX known optimization available
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   549
    newer = set()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   550
    objectrels = repo.obsstore.precursors
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   551
    while toproceed:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   552
        current = toproceed.pop()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   553
        assert len(current) <= 1, 'splitting not handled yet. %r' % current
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   554
        current = [n for n in current if n != nullid]
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   555
        if current:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   556
            n, = current
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   557
            if n in objectrels:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   558
                markers = objectrels[n]
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   559
                for mark in markers:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   560
                    toproceed.add(tuple(mark[1]))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   561
            else:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   562
                newer.add(tuple(current))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   563
        else:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   564
            newer.add(())
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   565
    return sorted(newer)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   566
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   567
cmdtable = {}
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   568
command = cmdutil.command(cmdtable)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   569
@command('debugsuccessors', [], '')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   570
def cmddebugsuccessors(ui, repo):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   571
    """dump obsolete changesets and their successors
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   572
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   573
    Each line matches an existing marker, the first identifier is the
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   574
    obsolete changeset identifier, followed by it successors.
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   575
    """
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   576
    lock = repo.lock()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   577
    try:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   578
        allsuccessors = repo.obsstore.precursors
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   579
        for old in sorted(allsuccessors):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   580
            successors = [sorted(m[1]) for m in allsuccessors[old]]
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   581
            for i, group in enumerate(sorted(successors)):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   582
                ui.write('%s' % short(old))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   583
                for new in group:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   584
                    ui.write(' %s' % short(new))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   585
                ui.write('\n')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   586
    finally:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   587
        lock.release()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   588
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   589
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   590
@eh.reposetup
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   591
def _repoobsutilsetup(ui, repo):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   592
    if not repo.local():
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   593
        return
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   594
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   595
    class obsoletingrepo(repo.__class__):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   596
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   597
        # XXX kill me
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   598
        def addobsolete(self, sub, obj):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   599
            """Add a relation marking that node <sub> is a new version of <obj>"""
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   600
            assert sub != obj
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   601
            if not repo[obj].phase():
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   602
                if sub is None:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   603
                    self.ui.warn(
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   604
                        _("trying to kill immutable changeset %(obj)s\n")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   605
                        % {'obj': short(obj)})
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   606
                if sub is not None:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   607
                    self.ui.warn(
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   608
                        _("%(sub)s try to obsolete immutable changeset %(obj)s\n")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   609
                        % {'sub': short(sub), 'obj': short(obj)})
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   610
            lock = self.lock()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   611
            try:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   612
                tr = self.transaction('add-obsolete')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   613
                try:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   614
                    meta = {
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   615
                        'date':  '%i %i' % util.makedate(),
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   616
                        'user': ui.username(),
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   617
                        }
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   618
                    subs = (sub == nullid) and [] or [sub]
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   619
                    mid = self.obsstore.create(tr, obj, subs, 0, meta)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   620
                    tr.close()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   621
                    self._clearobsoletecache()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   622
                    return mid
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   623
                finally:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   624
                    tr.release()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   625
            finally:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   626
                lock.release()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   627
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   628
        # XXX kill me
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   629
        def addcollapsedobsolete(self, oldnodes, newnode):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   630
            """Mark oldnodes as collapsed into newnode."""
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   631
            # Assume oldnodes are all descendants of a single rev
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   632
            rootrevs = self.revs('roots(%ln)', oldnodes)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   633
            assert len(rootrevs) == 1, rootrevs
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   634
            #rootnode = self[rootrevs[0]].node()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   635
            for n in oldnodes:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   636
                self.addobsolete(newnode, n)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   637
    repo.__class__ = obsoletingrepo
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   638
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   639
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   640
### Extending revset and template                                 ###
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   641
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   642
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   643
@eh.revset('hidden')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   644
def revsethidden(repo, subset, x):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   645
    """``hidden()``
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   646
    Changeset is hidden.
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   647
    """
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   648
    args = revset.getargs(x, 0, 0, 'hidden takes no argument')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   649
    return [r for r in subset if r in repo.hiddenrevs]
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   650
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   651
## troubles
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   652
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   653
@eh.revset('suspended')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   654
def revsetsuspended(repo, subset, x):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   655
    """``suspended()``
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   656
    Obsolete changesets with non-obsolete descendants.
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   657
    """
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   658
    args = revset.getargs(x, 0, 0, 'suspended takes no arguments')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   659
    return [r for r in subset if r in repo._suspendedset]
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   660
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   661
@eh.revset('latecomer')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   662
def revsetlatecomer(repo, subset, x):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   663
    """``latecomer()``
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   664
    Changesets marked as successors of public changesets.
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   665
    """
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   666
    args = revset.getargs(x, 0, 0, 'latecomer takes no arguments')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   667
    return [r for r in subset if r in repo._latecomerset]
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   668
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   669
@eh.revset('conflicting')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   670
def revsetconflicting(repo, subset, x):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   671
    """``conflicting()``
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   672
    Changesets marked as successors of a same changeset.
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   673
    """
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   674
    args = revset.getargs(x, 0, 0, 'conflicting takes no arguments')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   675
    return [r for r in subset if r in repo._conflictingset]
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   676
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   677
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   678
@eh.revset('obsparents')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   679
@eh.revset('precursors')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   680
def revsetprecursors(repo, subset, x):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   681
    """``precursors(set)``
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   682
    Immediate precursors of changesets in set.
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   683
    """
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   684
    s = revset.getset(repo, range(len(repo)), x)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   685
    cs = _precursors(repo, s)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   686
    return [r for r in subset if r in cs]
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   687
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   688
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   689
@eh.revset('obsancestors')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   690
@eh.revset('allprecursors')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   691
def revsetallprecursors(repo, subset, x):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   692
    """``allprecursors(set)``
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   693
    Transitive precursors of changesets in set.
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   694
    """
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   695
    s = revset.getset(repo, range(len(repo)), x)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   696
    cs = _allprecursors(repo, s)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   697
    return [r for r in subset if r in cs]
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   698
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   699
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   700
@eh.revset('obschildrend')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   701
@eh.revset('successors')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   702
def revsetsuccessors(repo, subset, x):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   703
    """``successors(set)``
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   704
    Immediate successors of changesets in set.
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   705
    """
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   706
    s = revset.getset(repo, range(len(repo)), x)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   707
    cs = _successors(repo, s)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   708
    return [r for r in subset if r in cs]
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   709
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   710
@eh.revset('obsdescendants')
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   711
@eh.revset('allsuccessors')
306
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   712
def revsetallsuccessors(repo, subset, x):
397
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   713
    """``allsuccessors(set)``
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   714
    Transitive successors of changesets in set.
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   715
    """
306
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   716
    s = revset.getset(repo, range(len(repo)), x)
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   717
    cs = _allsuccessors(repo, s)
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   718
    return [r for r in subset if r in cs]
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   719
299
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   720
### template keywords
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   721
431
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   722
@eh.templatekw('obsolete')
299
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   723
def obsoletekw(repo, ctx, templ, **args):
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   724
    """:obsolete: String. The obsolescence level of the node, could be
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   725
    ``stable``, ``unstable``, ``suspended`` or ``extinct``.
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   726
    """
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   727
    rev = ctx.rev()
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   728
    if rev in repo._extinctset:
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   729
        return 'extinct'
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   730
    if rev in repo._suspendedset:
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   731
        return 'suspended'
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   732
    if rev in repo._unstableset:
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   733
        return 'unstable'
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   734
    return 'stable'
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   735
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   736
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   737
### Various trouble warning                                       ###
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   738
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   739
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   740
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   741
### Discovery wrapping
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   742
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   743
@eh.wrapfunction(discovery, 'checkheads')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   744
def wrapcheckheads(orig, repo, remote, outgoing, *args, **kwargs):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   745
    """wrap mercurial.discovery.checkheads
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   746
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   747
    * prevent unstability to be pushed
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   748
    * patch remote to ignore obsolete heads on remote
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   749
    """
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   750
    # do not push instability
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   751
    for h in outgoing.missingheads:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   752
        # Checking heads is enough, obsolete descendants are either
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   753
        # obsolete or unstable.
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   754
        ctx = repo[h]
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   755
        if ctx.latecomer():
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   756
            raise util.Abort(_("push includes a latecomer changeset: %s!")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   757
                             % ctx)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   758
        if ctx.conflicting():
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   759
            raise util.Abort(_("push includes a conflicting changeset: %s!")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   760
                             % ctx)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   761
    return orig(repo, remote, outgoing, *args, **kwargs)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   762
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   763
@eh.wrapcommand("update")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   764
@eh.wrapcommand("pull")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   765
def wrapmayobsoletewc(origfn, ui, repo, *args, **opts):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   766
    res = origfn(ui, repo, *args, **opts)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   767
    if repo['.'].obsolete():
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   768
        ui.warn(_('Working directory parent is obsolete\n'))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   769
    return res
71
19e1930587a0 [obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 70
diff changeset
   770
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   771
@eh.wrapcommand("commit")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   772
@eh.wrapcommand("push")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   773
@eh.wrapcommand("pull")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   774
@eh.wrapcommand("graft")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   775
@eh.wrapcommand("phase")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   776
@eh.wrapcommand("unbundle")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   777
def warnobserrors(orig, ui, repo, *args, **kwargs):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   778
    """display warning is the command resulted in more instable changeset"""
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   779
    priorunstables = len(repo.revs('unstable()'))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   780
    priorlatecomers = len(repo.revs('latecomer()'))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   781
    priorconflictings = len(repo.revs('conflicting()'))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   782
    #print orig, priorunstables
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   783
    #print len(repo.revs('secret() - obsolete()'))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   784
    try:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   785
        return orig(ui, repo, *args, **kwargs)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   786
    finally:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   787
        newunstables = len(repo.revs('unstable()')) - priorunstables
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   788
        newlatecomers = len(repo.revs('latecomer()')) - priorlatecomers
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   789
        newconflictings = len(repo.revs('conflicting()')) - priorconflictings
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   790
        #print orig, newunstables
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   791
        #print len(repo.revs('secret() - obsolete()'))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   792
        if newunstables > 0:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   793
            ui.warn(_('%i new unstables changesets\n') % newunstables)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   794
        if newlatecomers > 0:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   795
            ui.warn(_('%i new latecomers changesets\n') % newlatecomers)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   796
        if newconflictings > 0:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   797
            ui.warn(_('%i new conflictings changesets\n') % newconflictings)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   798
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   799
@eh.reposetup
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   800
def _repostabilizesetup(ui, repo):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   801
    if not repo.local():
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   802
        return
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   803
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   804
    opush = repo.push
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   805
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   806
    class stabilizerrepo(repo.__class__):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   807
        def push(self, remote, *args, **opts):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   808
            """wrapper around pull that pull obsolete relation"""
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   809
            try:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   810
                result = opush(remote, *args, **opts)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   811
            except util.Abort, ex:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   812
                hint = _("use 'hg stabilize' to get a stable history "
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   813
                         "or --force to ignore warnings")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   814
                if (len(ex.args) >= 1
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   815
                    and ex.args[0].startswith('push includes ')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   816
                    and ex.hint is None):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   817
                    ex.hint = hint
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   818
                raise
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   819
            return result
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   820
    repo.__class__ = stabilizerrepo
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   821
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   822
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   823
### Other extension compat                                        ###
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   824
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   825
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   826
### commit --amend
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   827
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   828
@eh.wrapfunction(cmdutil, 'amend')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   829
def wrapcmdutilamend(orig, ui, repo, commitfunc, old, *args, **kwargs):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   830
    oldnode = old.node()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   831
    new = orig(ui, repo, commitfunc, old, *args, **kwargs)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   832
    if new != oldnode:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   833
        lock = repo.lock()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   834
        try:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   835
            tr = repo.transaction('post-amend-obst')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   836
            try:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   837
                meta = {
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   838
                    'date':  '%i %i' % util.makedate(),
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   839
                    'user': ui.username(),
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   840
                    }
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   841
                repo.obsstore.create(tr, oldnode, [new], 0, meta)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   842
                tr.close()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   843
                repo._clearobsoletecache()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   844
            finally:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   845
                tr.release()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   846
        finally:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   847
            lock.release()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   848
    return new
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   849
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   850
### rebase
150
f12fd2410a60 obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 148
diff changeset
   851
253
8ee6c5b98d73 [obsolete] fix new api: be more flexible on rebase's buildstate signature
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 252
diff changeset
   852
def buildstate(orig, repo, dest, rebaseset, *ags, **kws):
150
f12fd2410a60 obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 148
diff changeset
   853
    """wrapper for rebase 's buildstate that exclude obsolete changeset"""
f12fd2410a60 obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 148
diff changeset
   854
    rebaseset = repo.revs('%ld - extinct()', rebaseset)
253
8ee6c5b98d73 [obsolete] fix new api: be more flexible on rebase's buildstate signature
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 252
diff changeset
   855
    return orig(repo, dest, rebaseset, *ags, **kws)
150
f12fd2410a60 obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 148
diff changeset
   856
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   857
def defineparents(orig, repo, rev, target, state, *args, **kwargs):
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   858
    rebasestate = getattr(repo, '_rebasestate', None)
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   859
    if rebasestate is not None:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   860
        repo._rebasestate = dict(state)
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   861
        repo._rebasetarget = target
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   862
    return orig(repo, rev, target, state, *args, **kwargs)
150
f12fd2410a60 obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 148
diff changeset
   863
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   864
def concludenode(orig, repo, rev, p1, *args, **kwargs):
74
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   865
    """wrapper for rebase 's concludenode that set obsolete relation"""
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   866
    newrev = orig(repo, rev, p1, *args, **kwargs)
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   867
    rebasestate = getattr(repo, '_rebasestate', None)
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   868
    if rebasestate is not None:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   869
        if newrev is not None:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   870
            nrev = repo[newrev].rev()
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   871
        else:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   872
            nrev = p1
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   873
        repo._rebasestate[rev] = nrev
71
19e1930587a0 [obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 70
diff changeset
   874
    return newrev
19e1930587a0 [obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 70
diff changeset
   875
274
6622a24f3b0f obsolete: fix rebase wrapping
Patrick Mezard <patrick@mezard.eu>
parents: 273
diff changeset
   876
def cmdrebase(orig, ui, repo, *args, **kwargs):
311
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   877
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   878
    reallykeep = kwargs.get('keep', False)
275
336210dada95 obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents: 274
diff changeset
   879
    kwargs = dict(kwargs)
84
c4cc5f3bcf12 [obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 83
diff changeset
   880
    kwargs['keep'] = True
c4cc5f3bcf12 [obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 83
diff changeset
   881
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   882
    # We want to mark rebased revision as obsolete and set their
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   883
    # replacements if any. Doing it in concludenode() prevents
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   884
    # aborting the rebase, and is not called with all relevant
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   885
    # revisions in --collapse case. Instead, we try to track the
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   886
    # rebase state structure by sampling/updating it in
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   887
    # defineparents() and concludenode(). The obsolete markers are
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   888
    # added from this state after a successful call.
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   889
    repo._rebasestate = {}
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   890
    repo._rebasetarget = None
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   891
    try:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   892
        res = orig(ui, repo, *args, **kwargs)
311
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   893
        if not reallykeep:
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   894
            # Filter nullmerge or unrebased entries
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   895
            repo._rebasestate = dict(p for p in repo._rebasestate.iteritems()
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   896
                                     if p[1] >= 0)
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   897
            if not res and not kwargs.get('abort') and repo._rebasestate:
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   898
                # Rebased revisions are assumed to be descendants of
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   899
                # targetrev. If a source revision is mapped to targetrev
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   900
                # or to another rebased revision, it must have been
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   901
                # removed.
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   902
                targetrev = repo[repo._rebasetarget].rev()
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   903
                newrevs = set([targetrev])
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   904
                replacements = {}
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   905
                for rev, newrev in sorted(repo._rebasestate.items()):
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   906
                    oldnode = repo[rev].node()
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   907
                    if newrev not in newrevs:
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   908
                        newnode = repo[newrev].node()
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   909
                        newrevs.add(newrev)
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   910
                    else:
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   911
                        newnode = nullid
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   912
                    replacements[oldnode] = newnode
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   913
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   914
                if kwargs.get('collapse'):
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   915
                    newnodes = set(n for n in replacements.values() if n != nullid)
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   916
                    if newnodes:
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   917
                        # Collapsing into more than one revision?
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   918
                        assert len(newnodes) == 1, newnodes
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   919
                        newnode = newnodes.pop()
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   920
                    else:
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   921
                        newnode = nullid
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   922
                    repo.addcollapsedobsolete(replacements, newnode)
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   923
                else:
311
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   924
                    for oldnode, newnode in replacements.iteritems():
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   925
                        repo.addobsolete(newnode, oldnode)
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   926
        return res
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   927
    finally:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   928
        delattr(repo, '_rebasestate')
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   929
        delattr(repo, '_rebasetarget')
84
c4cc5f3bcf12 [obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 83
diff changeset
   930
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   931
@eh.extsetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   932
def _rebasewrapping(ui):
356
56d4c6207ef9 Move obserror warning into the obsolete extension.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 354
diff changeset
   933
    # warning about more obsolete
42
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
   934
    try:
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
   935
        rebase = extensions.find('rebase')
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
   936
        if rebase:
356
56d4c6207ef9 Move obserror warning into the obsolete extension.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 354
diff changeset
   937
            entry = extensions.wrapcommand(rebase.cmdtable, 'rebase', warnobserrors)
150
f12fd2410a60 obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 148
diff changeset
   938
            extensions.wrapfunction(rebase, 'buildstate', buildstate)
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   939
            extensions.wrapfunction(rebase, 'defineparents', defineparents)
42
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
   940
            extensions.wrapfunction(rebase, 'concludenode', concludenode)
84
c4cc5f3bcf12 [obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 83
diff changeset
   941
            extensions.wrapcommand(rebase.cmdtable, "rebase", cmdrebase)
42
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
   942
    except KeyError:
305
0b444d7c5c96 update revset vocabulary to use precursors, successors
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 304
diff changeset
   943
        pass  # rebase not found
39
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 38
diff changeset
   944
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   945
430
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
   946
#####################################################################
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
   947
### Older format management                                       ###
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
   948
#####################################################################
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
   949
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
   950
# Code related to detection and management of older legacy format never
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
   951
# handled by core
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   952
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   953
@eh.reposetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   954
def _checkoldobsolete(ui, repo):
430
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
   955
    """Detect that a repo still carry some old obsolete format
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
   956
    """
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   957
    if not repo.local():
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   958
        return
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   959
    for arg in sys.argv:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   960
        if 'debugc' in arg:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   961
            break
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   962
    else:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   963
        data = repo.opener.tryread('obsolete-relations')
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   964
        if not data:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   965
            data = repo.sopener.tryread('obsoletemarkers')
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   966
        if data:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   967
            raise util.Abort('old format of obsolete marker detected!\n'
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   968
                             'run `hg debugconvertobsolete` once.')
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   969
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   970
def _obsdeserialise(flike):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   971
    """read a file like object serialised with _obsserialise
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   972
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   973
    this desierialize into a {subject -> objects} mapping"""
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   974
    rels = {}
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   975
    for line in flike:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   976
        subhex, objhex = line.split()
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   977
        subnode = bin(subhex)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   978
        if subnode == nullid:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   979
            subnode = None
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   980
        rels.setdefault( subnode, set()).add(bin(objhex))
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   981
    return rels
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   982
276
f26e9bc5f7fc obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents: 275
diff changeset
   983
@command('debugconvertobsolete', [], '')
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   984
def cmddebugconvertobsolete(ui, repo):
278
fa0b9b8a83c0 obsolete: add or fix debug commands help
Patrick Mezard <patrick@mezard.eu>
parents: 277
diff changeset
   985
    """import markers from an .hg/obsolete-relations file"""
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   986
    cnt = 0
337
ebfd1b96a013 obsolete: convert try to guess what invalid node id are
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 336
diff changeset
   987
    err = 0
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   988
    l = repo.lock()
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   989
    some = False
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   990
    try:
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   991
        unlink = []
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   992
        tr = repo.transaction('convert-obsolete')
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   993
        try:
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   994
            repo._importoldobsolete = True
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   995
            store = repo.obsstore
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   996
            ### very first format
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   997
            try:
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   998
                f = repo.opener('obsolete-relations')
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   999
                try:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1000
                    some = True
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1001
                    for line in f:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1002
                        subhex, objhex = line.split()
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1003
                        suc = bin(subhex)
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1004
                        prec = bin(objhex)
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1005
                        sucs = (suc==nullid) and [] or [suc]
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1006
                        meta = {
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1007
                            'date':  '%i %i' % util.makedate(),
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1008
                            'user': ui.username(),
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1009
                            }
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1010
                        try:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1011
                            store.create(tr, prec, sucs, 0, meta)
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1012
                            cnt += 1
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1013
                        except ValueError:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1014
                            repo.ui.write_err("invalid old marker line: %s"
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1015
                                              % (line))
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1016
                            err += 1
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1017
                finally:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1018
                    f.close()
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1019
                unlink.append(repo.join('obsolete-relations'))
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1020
            except IOError:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1021
                pass
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1022
            ### second (json) format
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1023
            data = repo.sopener.tryread('obsoletemarkers')
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1024
            if data:
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
  1025
                some = True
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1026
                for oldmark in json.loads(data):
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1027
                    del oldmark['id']  # dropped for now
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1028
                    del oldmark['reason']  # unused until then
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1029
                    oldobject = str(oldmark.pop('object'))
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1030
                    oldsubjects = [str(s) for s in oldmark.pop('subjects', [])]
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1031
                    LOOKUP_ERRORS = (error.RepoLookupError, error.LookupError)
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1032
                    if len(oldobject) != 40:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1033
                        try:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1034
                            oldobject = repo[oldobject].node()
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1035
                        except LOOKUP_ERRORS:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1036
                            pass
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1037
                    if any(len(s) != 40 for s in oldsubjects):
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1038
                        try:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1039
                            oldsubjects = [repo[s].node() for s in oldsubjects]
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1040
                        except LOOKUP_ERRORS:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1041
                            pass
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1042
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1043
                    oldmark['date'] = '%i %i' % tuple(oldmark['date'])
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1044
                    meta = dict((k.encode('utf-8'), v.encode('utf-8'))
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1045
                                 for k, v in oldmark.iteritems())
341
7653f80fd7a4 obsolete: harden convertion from first format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 340
diff changeset
  1046
                    try:
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1047
                        succs = [bin(n) for n in oldsubjects]
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1048
                        succs = [n for n in succs if n != nullid]
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1049
                        store.create(tr, bin(oldobject), succs,
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1050
                                     0, meta)
341
7653f80fd7a4 obsolete: harden convertion from first format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 340
diff changeset
  1051
                        cnt += 1
7653f80fd7a4 obsolete: harden convertion from first format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 340
diff changeset
  1052
                    except ValueError:
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1053
                        repo.ui.write_err("invalid marker %s -> %s\n"
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1054
                                     % (oldobject, oldsubjects))
341
7653f80fd7a4 obsolete: harden convertion from first format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 340
diff changeset
  1055
                        err += 1
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1056
                unlink.append(repo.sjoin('obsoletemarkers'))
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1057
            tr.close()
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1058
            for path in unlink:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1059
                util.unlink(path)
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1060
        finally:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1061
            tr.release()
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
  1062
    finally:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
  1063
        del repo._importoldobsolete
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
  1064
        l.release()
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
  1065
    if not some:
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
  1066
            ui.warn('nothing to do\n')
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
  1067
    ui.status('%i obsolete marker converted\n' % cnt)
337
ebfd1b96a013 obsolete: convert try to guess what invalid node id are
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 336
diff changeset
  1068
    if err:
ebfd1b96a013 obsolete: convert try to guess what invalid node id are
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 336
diff changeset
  1069
        ui.write_err('%i conversion failed. check you graph!\n' % err)