hgext/obsolete.py
author Pierre-Yves David <pierre-yves.david@logilab.fr>
Wed, 08 Aug 2012 16:51:45 +0200
changeset 455 f46a41006136
parent 454 4e34a723115b
child 456 79aacd34bf1e
permissions -rw-r--r--
obsolete: simplify rebase wrapping code and change relation creation We have don't have changeset simply pruned by rebase. When they disapeared, that means that destination is a valid successors for them.
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
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 53
diff changeset
    42
89
757153438e58 [obsolet] base64 encore obsolete rel for pushkey
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
    43
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    44
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
    45
aa1255c2ac8f obsolete: move version checks at the start of the file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 432
diff changeset
    46
try:
aa1255c2ac8f obsolete: move version checks at the start of the file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 432
diff changeset
    47
    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
    48
    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
    49
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
    50
        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
    51
439
6cff54825233 obsolete: reorder import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 438
diff changeset
    52
import sys
6cff54825233 obsolete: reorder import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 438
diff changeset
    53
from mercurial.i18n import _
6cff54825233 obsolete: reorder import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 438
diff changeset
    54
from mercurial import cmdutil
6cff54825233 obsolete: reorder import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 438
diff changeset
    55
from mercurial import commands
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    56
from mercurial import context
46
3b0364fc822f Do not propagate obsolete changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 44
diff changeset
    57
from mercurial import discovery
3b0364fc822f Do not propagate obsolete changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 44
diff changeset
    58
from mercurial import error
439
6cff54825233 obsolete: reorder import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 438
diff changeset
    59
from mercurial import extensions
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
    60
from mercurial import localrepo
115
d60eddda9546 add an option to ensure unstable are secret
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 114
diff changeset
    61
from mercurial import phases
439
6cff54825233 obsolete: reorder import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 438
diff changeset
    62
from mercurial import revset
6cff54825233 obsolete: reorder import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 438
diff changeset
    63
from mercurial import scmutil
6cff54825233 obsolete: reorder import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 438
diff changeset
    64
from mercurial import templatekw
435
97d82fbd2c24 obsolete: clean up import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 434
diff changeset
    65
from mercurial.node import bin, short, nullid
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    66
432
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    67
# This extension hold the following code
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    68
#
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    69
# - Extension Helper code
450
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
    70
# - Obsolescence cache
432
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    71
# - ...
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    72
# - Older format compat
160
24346b78cd99 mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 150
diff changeset
    73
432
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    74
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    75
432
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    76
#####################################################################
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
    77
### Extension helper                                              ###
432
6347bc69b49a obsolete: some more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 431
diff changeset
    78
#####################################################################
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    79
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    80
class exthelper(object):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    81
    """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
    82
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    83
    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
    84
    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
    85
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    86
    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
    87
    """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    88
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    89
    def __init__(self):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    90
        self._uicallables = []
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    91
        self._extcallables = []
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    92
        self._repocallables = []
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    93
        self._revsetsymbols = []
431
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
    94
        self._templatekws = []
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    95
        self._commandwrappers = []
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    96
        self._extcommandwrappers = []
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    97
        self._functionwrappers = []
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    98
        self._duckpunchers = []
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    99
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   100
    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
   101
        """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
   102
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   103
        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
   104
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   105
        - 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
   106
          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
   107
          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
   108
          passed to runcommand
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   109
        - 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
   110
        - 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
   111
          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
   112
          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
   113
          during extsetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   114
        - 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
   115
          module members
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   116
        - 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
   117
        - pushkey setup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   118
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   119
        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
   120
            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
   121
        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
   122
            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
   123
        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
   124
            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
   125
        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
   126
            c(ui)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   127
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   128
    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
   129
        """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
   130
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   131
        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
   132
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   133
        - 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
   134
        - 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
   135
        - Extend revsets 
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   136
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   137
        knownexts = {}
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   138
        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
   139
            revset.symbols[name] = symbol
431
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   140
        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
   141
            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
   142
        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
   143
            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
   144
                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
   145
                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
   146
                    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
   147
                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
   148
            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
   149
        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
   150
            c(ui)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   151
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   152
    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
   153
        """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
   154
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   155
        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
   156
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   157
        - 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
   158
        - Modify configuration variables
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   159
        - 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
   160
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   161
        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
   162
            c(ui, repo)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   163
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   164
    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
   165
        """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
   166
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   167
        example::
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
            @eh.uisetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   170
            def setupbabar(ui):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   171
                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
   172
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   173
        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
   174
        return call
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   175
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   176
    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
   177
        """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
   178
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   179
        example::
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
            @eh.extsetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   182
            def setupcelestine(ui):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   183
                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
   184
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   185
        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
   186
        return call
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   187
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   188
    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
   189
        """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
   190
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   191
        example::
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
            @eh.reposetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   194
            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
   195
                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
   196
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   197
        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
   198
        return call
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   199
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   200
    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
   201
        """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
   202
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   203
        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
   204
        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
   205
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   206
        example::
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
            @eh.revset('hidden')
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   209
            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
   210
                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
   211
                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
   212
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   213
        def dec(symbol):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   214
            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
   215
            return symbol
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   216
        return dec
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   217
431
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   218
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   219
    def templatekw(self, keywordname):
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   220
        """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
   221
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   222
        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
   223
        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
   224
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   225
        example::
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
            @eh.templatekw('babar')
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   228
            def kwbabar(ctx):
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   229
                return 'babar'
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   230
        """
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   231
        def dec(keyword):
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   232
            self._templatekws.append((keywordname, keyword))
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   233
            return keyword
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   234
        return dec
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   235
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   236
    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
   237
        """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
   238
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   239
        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
   240
        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
   241
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   242
        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
   243
        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
   244
        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
   245
        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
   246
        installed during `extsetup`
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   247
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   248
        example::
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   249
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   250
            @eh.wrapcommand('summary')
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   251
            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
   252
                ui.note('Barry!')
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   253
                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
   254
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   255
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   256
        def dec(wrapper):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   257
            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
   258
                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
   259
            else:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   260
                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
   261
            return wrapper
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   262
        return dec
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   263
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   264
    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
   265
        """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
   266
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   267
        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
   268
        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
   269
        (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
   270
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   271
        example::
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   272
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   273
            @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
   274
            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
   275
                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
   276
                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
   277
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   278
        def dec(wrapper):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   279
            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
   280
            return wrapper
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   281
        return dec
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 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
   284
        """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
   285
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   286
        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
   287
        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
   288
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   289
        example::
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
            @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
   292
            def babar(ctx):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   293
                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
   294
        """
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   295
        def dec(func):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   296
            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
   297
            return func
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   298
        return dec
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
eh = exthelper()
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   301
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
   302
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
   303
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
   304
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   305
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   306
### Obsolescence Caching Logic                                    ###
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   307
#####################################################################
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   308
450
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   309
# Obsolescence related logic can be very slow if we don't have efficient cache.
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   310
#
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   311
# This section implements a cache mechanism that did not make it into core for
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   312
# time reason. It store meaningful set of revision related to obsolescence
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   313
# (obsolete, unstabletble ...
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   314
#
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   315
# Here is:
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   316
#
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   317
# - Computation of meaningful set,
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   318
# - Cache access logic,
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   319
# - Cache invalidation logic,
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   320
# - revset and ctx using this cache.
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   321
#
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   322
450
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   323
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   324
### Computation of meaningful set
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   325
#
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   326
# Most set can be computed with "simple" revset.
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   327
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   328
#: { set name -> function to compute this set } mapping
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   329
#:   function take a single "repo" argument.
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   330
#:
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   331
#: Use the `cachefor` decorator to register new cache function
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   332
cachefuncs = {}
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   333
def cachefor(name):
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   334
    """Decorator to register a function as computing the cache for a set"""
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   335
    def decorator(func):
450
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   336
        assert name not in cachefuncs
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   337
        cachefuncs[name] = func
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   338
        return func
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   339
    return decorator
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   340
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   341
@cachefor('obsolete')
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   342
def _computeobsoleteset(repo):
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   343
    """the set of obsolete revision"""
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   344
    obs = set()
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   345
    nm = repo.changelog.nodemap
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   346
    for prec in repo.obsstore.precursors:
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   347
        rev = nm.get(prec)
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   348
        if rev is not None:
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   349
            obs.add(rev)
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   350
    return set(repo.revs('%ld - public()', obs))
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   351
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   352
@cachefor('unstable')
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   353
def _computeunstableset(repo):
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   354
    """the set of non obsolete revision with obsolete parent"""
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   355
    return set(repo.revs('(obsolete()::) - obsolete()'))
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   356
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   357
@cachefor('suspended')
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   358
def _computesuspendedset(repo):
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   359
    """the set of obsolete parent with non obsolete descendant"""
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   360
    return set(repo.revs('obsolete() and obsolete()::unstable()'))
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   361
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   362
@cachefor('extinct')
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   363
def _computeextinctset(repo):
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   364
    """the set of obsolete parent without non obsolete descendant"""
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   365
    return set(repo.revs('obsolete() - obsolete()::unstable()'))
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   366
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   367
@eh.wrapfunction(obsolete.obsstore, '__init__')
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   368
def _initobsstorecache(orig, obsstore, *args, **kwargs):
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   369
    """add a caches attributes to obsstore"""
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   370
    obsstore.caches = {}
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   371
    return orig(obsstore, *args, **kwargs)
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   372
450
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   373
### Cache access
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   374
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   375
def getobscache(repo, name):
450
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   376
    """Return the set of revision that belong to the <name> set
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   377
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   378
    Such access may compute the set and cache it for future use"""
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   379
    if not repo.obsstore:
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   380
        return ()
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   381
    if name not in repo.obsstore.caches:
450
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   382
        repo.obsstore.caches[name] = cachefuncs[name](repo)
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   383
    return repo.obsstore.caches[name]
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   384
450
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   385
### Cache clean up
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   386
#
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   387
# To be simple we need to invalidate obsolescence cache when:
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   388
#
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   389
# - new changeset is added:
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   390
# - public phase is changed
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   391
# - obsolescence marker are added
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   392
# - strip is used a repo
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   393
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   394
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   395
def clearobscaches(repo):
450
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   396
    """Remove all obsolescence related cache from a repo
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   397
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   398
    This remove all cache in obsstore is the obsstore already exist on the
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   399
    repo.
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   400
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   401
    (We could be smarter here)"""
449
4f23f224afb4 obsolete: Improves cache invalidation logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 448
diff changeset
   402
    if 'obsstore' in repo._filecache:
4f23f224afb4 obsolete: Improves cache invalidation logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 448
diff changeset
   403
        repo.obsstore.caches.clear()
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   404
450
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   405
@eh.wrapfunction(localrepo.localrepository, 'addchangegroup')  # new changeset
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   406
@eh.wrapfunction(phases, 'retractboundary')  # phase movement
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   407
@eh.wrapfunction(phases, 'advanceboundary')  # phase movement
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   408
@eh.wrapfunction(localrepo.localrepository, 'destroyed')  # strip
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   409
def wrapclearcache(orig, repo, *args, **kwargs):
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   410
    try:
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   411
        return orig(repo, *args, **kwargs)
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   412
    finally:
450
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   413
        # we are a bit wide here
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   414
        # we could restrict to:
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   415
        # advanceboundary + phase==public
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   416
        # retractboundary + phase==draft
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   417
        clearobscaches(repo)
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   418
450
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   419
@eh.wrapfunction(obsolete.obsstore, 'add')  # new marker
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   420
def clearonadd(orig, obsstore, *args, **kwargs):
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   421
    try:
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   422
        return orig(obsstore, *args, **kwargs)
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   423
    finally:
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   424
        obsstore.caches.clear()
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   425
450
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   426
### Use the case
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   427
# Function in core that could benefic from the cache are overwritten by cache using version
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   428
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   429
# changectx method
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   430
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   431
@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
   432
def unstable(ctx):
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   433
    """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
   434
    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
   435
        return False
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   436
    return ctx.rev() in getobscache(ctx._repo, 'unstable')
148
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   437
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   438
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   439
@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
   440
def extinct(ctx):
ea4aa1890b16 obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 212
diff changeset
   441
    """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
   442
    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
   443
        return False
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   444
    return ctx.rev() in getobscache(ctx._repo, 'extinct')
213
ea4aa1890b16 obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 212
diff changeset
   445
450
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   446
# revset
4d18739b506b obsolete: document the cache stuff
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 449
diff changeset
   447
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   448
@eh.revset('obsolete')
39
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 38
diff changeset
   449
def revsetobsolete(repo, subset, x):
397
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   450
    """``obsolete()``
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   451
    Changeset is obsolete.
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   452
    """
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   453
    args = revset.getargs(x, 0, 0, 'obsolete takes no argument')
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   454
    obsoletes = getobscache(repo, 'obsolete')
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   455
    return [r for r in subset if r in obsoletes]
252
470232cea503 [obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 228
diff changeset
   456
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   457
@eh.revset('unstable')
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   458
def revsetunstable(repo, subset, x):
397
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   459
    """``unstable()``
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   460
    Unstable changesets are non-obsolete with obsolete ancestors.
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   461
    """
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   462
    args = revset.getargs(x, 0, 0, 'unstable takes no arguments')
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   463
    unstables = getobscache(repo, 'unstable')
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   464
    return [r for r in subset if r in unstables]
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   465
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   466
@eh.revset('extinct')
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   467
def revsetextinct(repo, subset, x):
397
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   468
    """``extinct()``
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   469
    Obsolete changesets with obsolete descendants only.
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   470
    """
310
2d0dc5c18489 [obsolete] fix revset error message
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 308
diff changeset
   471
    args = revset.getargs(x, 0, 0, 'extinct takes no arguments')
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   472
    extincts = getobscache(repo, 'extinct')
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   473
    return [r for r in subset if r in extincts]
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   474
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   475
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   476
### Complete troubles computation logic                           ###
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   477
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   478
451
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   479
# there is two kind of trouble not handled by core right now:
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   480
# - latecomer: (successors for public changeset)
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   481
# - conflicting: (two changeset try to succeed to the same precursors)
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   482
#
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   483
# This section add support for those two addition trouble
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   484
#
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   485
# - Cache computation
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   486
# - revset and ctx method
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   487
# - push warning
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   488
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   489
### Cache computation
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   490
448
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   491
@cachefor('latecomer')
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   492
def _computelatecomerset(repo):
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   493
    """the set of rev trying to obsolete public revision"""
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   494
    query = 'allsuccessors(public()) - obsolete() - public()'
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   495
    return set(repo.revs(query))
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   496
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   497
@cachefor('conflicting')
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   498
def _computeconflictingset(repo):
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   499
    """the set of rev trying to obsolete public revision"""
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   500
    conflicting = set()
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   501
    obsstore = repo.obsstore
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   502
    newermap = {}
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   503
    for ctx in repo.set('(not public()) - obsolete()'):
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   504
        prec = obsstore.successors.get(ctx.node(), ())
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   505
        toprocess = set(prec)
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   506
        while toprocess:
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   507
            prec = toprocess.pop()[0]
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   508
            if prec not in newermap:
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   509
                newermap[prec] = newerversion(repo, prec)
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   510
            newer = [n for n in newermap[prec] if n] # filter kill
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   511
            if len(newer) > 1:
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   512
                conflicting.add(ctx.rev())
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   513
                break
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   514
        toprocess.update(obsstore.successors.get(prec, ()))
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   515
    return conflicting
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   516
451
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   517
### changectx method
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   518
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   519
@eh.addattr(context.changectx, 'latecomer')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   520
def latecomer(ctx):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   521
    """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
   522
    if ctx.node() is None:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   523
        return False
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   524
    return ctx.rev() in getobscache(ctx._repo, 'latecomer')
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   525
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   526
@eh.addattr(context.changectx, 'conflicting')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   527
def conflicting(ctx):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   528
    """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
   529
    if ctx.node() is None:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   530
        return False
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   531
    return ctx.rev() in getobscache(ctx._repo, 'conflicting')
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   532
451
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   533
### revset symbol
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   534
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   535
@eh.revset('latecomer')
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   536
def revsetlatecomer(repo, subset, x):
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   537
    """``latecomer()``
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   538
    Changesets marked as successors of public changesets.
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   539
    """
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   540
    args = revset.getargs(x, 0, 0, 'latecomer takes no arguments')
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   541
    lates = getobscache(repo, 'latecomer')
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   542
    return [r for r in subset if r in lates]
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   543
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   544
@eh.revset('conflicting')
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   545
def revsetconflicting(repo, subset, x):
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   546
    """``conflicting()``
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   547
    Changesets marked as successors of a same changeset.
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   548
    """
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   549
    args = revset.getargs(x, 0, 0, 'conflicting takes no arguments')
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   550
    conf = getobscache(repo, 'conflicting')
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   551
    return [r for r in subset if r in conf]
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   552
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   553
448
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   554
### Discovery wrapping
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   555
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   556
@eh.wrapfunction(discovery, 'checkheads')
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   557
def wrapcheckheads(orig, repo, remote, outgoing, *args, **kwargs):
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   558
    """wrap mercurial.discovery.checkheads
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   559
451
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   560
    * prevent latecomer and unstable to be pushed
448
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   561
    """
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   562
    # do not push instability
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   563
    for h in outgoing.missingheads:
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   564
        # Checking heads is enough, obsolete descendants are either
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   565
        # obsolete or unstable.
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   566
        ctx = repo[h]
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   567
        if ctx.latecomer():
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   568
            raise util.Abort(_("push includes a latecomer changeset: %s!")
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   569
                             % ctx)
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   570
        if ctx.conflicting():
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   571
            raise util.Abort(_("push includes a conflicting changeset: %s!")
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   572
                             % ctx)
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   573
    return orig(repo, remote, outgoing, *args, **kwargs)
96c896f0180b obsolete: some more movement
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 447
diff changeset
   574
437
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
#####################################################################
445
52b5e14c63d5 obsolete: enforce pdiff and pstatus alias in the extension
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 444
diff changeset
   577
### Additional Utilities                                          ###
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   578
#####################################################################
354
bd26eb9714fb obsolete: Detect conflicting changeset!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 351
diff changeset
   579
451
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   580
# This section contains a lot of small utility function and method
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   581
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   582
# - Function to create markers
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   583
# - useful alias pstatus and pdiff (should probably go in evolve)
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   584
# - "troubles" method on changectx
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   585
# - function to travel throught the obsolescence graph
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   586
# - function to find useful changeset to stabilize
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   587
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   588
### Marker Create
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   589
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   590
def createmarkers(repo, relations, metadata=None, flag=0):
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   591
    """Add obsolete markers between changeset in a repo
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   592
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   593
    <relations> must be an iterable of (<old>, (<new>, ...)) tuple.
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   594
    `old` and `news` are changectx.
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   595
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   596
    Current user and date are used except if specified otherwise in the
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   597
    metadata attribute.
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   598
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   599
    /!\ assume the repo have been locked byt the user /!\
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   600
    """
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   601
    # prepare metadata
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   602
    if metadata is None:
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   603
        metadata = {}
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   604
    if 'date' not in metadata:
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   605
        metadata['date'] = '%i %i' % util.makedate()
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   606
    if 'user' not in metadata:
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   607
        metadata['user'] = repo.ui.username()
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   608
    # check future marker
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   609
    tr = repo.transaction('add-obsolescence-marker')
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   610
    try:
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   611
        for prec, sucs in relations:
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   612
            if not prec.mutable():
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   613
                raise util.Abort("Cannot obsolete immutable changeset: %s" % prec)
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   614
            nprec = prec.node()
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   615
            nsucs = tuple(s.node() for s in sucs)
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   616
            if nprec in nsucs:
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   617
                raise util.Abort("Changeset %s cannot obsolete himself" % prec)
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   618
            repo.obsstore.create(tr, nprec, nsucs, flag, metadata)
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   619
            clearobscaches(repo)
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   620
        tr.close()
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   621
    finally:
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   622
        tr.release()
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   623
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   624
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   625
### Useful alias
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   626
445
52b5e14c63d5 obsolete: enforce pdiff and pstatus alias in the extension
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 444
diff changeset
   627
@eh.uisetup
52b5e14c63d5 obsolete: enforce pdiff and pstatus alias in the extension
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 444
diff changeset
   628
def _installalias(ui):
52b5e14c63d5 obsolete: enforce pdiff and pstatus alias in the extension
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 444
diff changeset
   629
    if ui.config('alias', 'pstatus', None) is None:
52b5e14c63d5 obsolete: enforce pdiff and pstatus alias in the extension
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 444
diff changeset
   630
        ui.setconfig('alias', 'pstatus', 'status --rev .^')
52b5e14c63d5 obsolete: enforce pdiff and pstatus alias in the extension
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 444
diff changeset
   631
    if ui.config('alias', 'pdiff', None) is None:
52b5e14c63d5 obsolete: enforce pdiff and pstatus alias in the extension
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 444
diff changeset
   632
        ui.setconfig('alias', 'pdiff', 'diff --rev .^')
52b5e14c63d5 obsolete: enforce pdiff and pstatus alias in the extension
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 444
diff changeset
   633
451
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   634
# - "troubles" method on changectx
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   635
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   636
@eh.addattr(context.changectx, 'troubles')
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   637
def troubles(ctx):
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   638
    """Return a tuple listing all the troubles that affect a changeset
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   639
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   640
    Troubles may be "unstable", "latecomer" or "conflicting".
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   641
    """
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   642
    troubles = []
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   643
    if ctx.unstable():
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   644
        troubles.append('unstable')
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   645
    if ctx.latecomer():
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   646
        troubles.append('latecomer')
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   647
    if ctx.conflicting():
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   648
        troubles.append('conflicting')
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   649
    return tuple(troubles)
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   650
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   651
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   652
### Obsolescence graph
dc1bd3595075 more doc and cleanup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 450
diff changeset
   653
452
3cf7ce72dbda add cleanup todo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 451
diff changeset
   654
# XXX SOME MAJOR CLEAN UP TO DO HERE XXX
3cf7ce72dbda add cleanup todo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 451
diff changeset
   655
305
0b444d7c5c96 update revset vocabulary to use precursors, successors
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 304
diff changeset
   656
def _precursors(repo, s):
0b444d7c5c96 update revset vocabulary to use precursors, successors
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 304
diff changeset
   657
    """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
   658
    cs = set()
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   659
    nm = repo.changelog.nodemap
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   660
    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
   661
    for r in s:
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   662
        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
   663
            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
   664
            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
   665
                cs.add(pr)
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   666
    return cs
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   667
305
0b444d7c5c96 update revset vocabulary to use precursors, successors
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 304
diff changeset
   668
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
   669
    """transitive precursors of a subset"""
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   670
    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
   671
    seen = set()
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   672
    allsubjects = repo.obsstore.successors
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   673
    while toproceed:
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   674
        nc = toproceed.pop()
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   675
        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
   676
            np = mark[0]
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   677
            if np not in seen:
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   678
                seen.add(np)
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   679
                toproceed.append(np)
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   680
    nm = repo.changelog.nodemap
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   681
    cs = set()
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   682
    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
   683
        pr = nm.get(p)
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   684
        if pr is not None:
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   685
            cs.add(pr)
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   686
    return cs
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   687
306
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   688
def _successors(repo, s):
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   689
    """Successors of a changeset"""
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   690
    cs = set()
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   691
    nm = repo.changelog.nodemap
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   692
    markerbyobj = repo.obsstore.precursors
306
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   693
    for r in s:
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   694
        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
   695
            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
   696
                sr = nm.get(sub)
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   697
                if sr is not None:
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   698
                    cs.add(sr)
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   699
    return cs
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   700
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   701
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
   702
    """transitive successors of a subset"""
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   703
    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
   704
    seen = set()
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   705
    allobjects = repo.obsstore.precursors
306
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   706
    while toproceed:
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   707
        nc = toproceed.pop()
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   708
        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
   709
            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
   710
                if sub not in seen:
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   711
                    seen.add(sub)
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   712
                    toproceed.append(sub)
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   713
    nm = repo.changelog.nodemap
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   714
    cs = set()
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   715
    for s in seen:
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   716
        sr = nm.get(s)
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   717
        if sr is not None:
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   718
            cs.add(sr)
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   719
    return cs
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   720
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   721
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   722
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   723
def newerversion(repo, obs):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   724
    """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
   725
    toproceed = set([(obs,)])
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   726
    # XXX known optimization available
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   727
    newer = set()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   728
    objectrels = repo.obsstore.precursors
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   729
    while toproceed:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   730
        current = toproceed.pop()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   731
        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
   732
        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
   733
        if current:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   734
            n, = current
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   735
            if n in objectrels:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   736
                markers = objectrels[n]
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   737
                for mark in markers:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   738
                    toproceed.add(tuple(mark[1]))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   739
            else:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   740
                newer.add(tuple(current))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   741
        else:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   742
            newer.add(())
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   743
    return sorted(newer)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   744
442
48d18ba05480 obsolete: extract high level marker creation in a dedicated util function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 441
diff changeset
   745
437
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
### Extending revset and template                                 ###
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   748
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   749
454
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   750
# this section add several useful revset symbol not yet in core.
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   751
# they are subject to changes
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   752
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   753
### hidden revset is not in core yet
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   754
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   755
@eh.revset('hidden')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   756
def revsethidden(repo, subset, x):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   757
    """``hidden()``
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   758
    Changeset is hidden.
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   759
    """
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   760
    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
   761
    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
   762
454
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   763
### XXX I'm not sure this revset is useful
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   764
@eh.revset('suspended')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   765
def revsetsuspended(repo, subset, x):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   766
    """``suspended()``
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   767
    Obsolete changesets with non-obsolete descendants.
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   768
    """
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   769
    args = revset.getargs(x, 0, 0, 'suspended takes no arguments')
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   770
    suspended = getobscache(repo, 'suspended')
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   771
    return [r for r in subset if r in suspended]
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   772
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   773
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   774
@eh.revset('precursors')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   775
def revsetprecursors(repo, subset, x):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   776
    """``precursors(set)``
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   777
    Immediate precursors of changesets in set.
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   778
    """
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   779
    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
   780
    cs = _precursors(repo, s)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   781
    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
   782
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   783
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   784
@eh.revset('allprecursors')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   785
def revsetallprecursors(repo, subset, x):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   786
    """``allprecursors(set)``
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   787
    Transitive precursors of changesets in set.
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   788
    """
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   789
    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
   790
    cs = _allprecursors(repo, s)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   791
    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
   792
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   793
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   794
@eh.revset('successors')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   795
def revsetsuccessors(repo, subset, x):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   796
    """``successors(set)``
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   797
    Immediate successors of changesets in set.
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
    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
   800
    cs = _successors(repo, s)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   801
    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
   802
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
   803
@eh.revset('allsuccessors')
306
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   804
def revsetallsuccessors(repo, subset, x):
397
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   805
    """``allsuccessors(set)``
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   806
    Transitive successors of changesets in set.
0bd63f294a6f obsolete: improve revset online help
Patrick Mezard <patrick@mezard.eu>
parents: 393
diff changeset
   807
    """
306
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   808
    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
   809
    cs = _allsuccessors(repo, s)
8cfa3163dfaa obsolete: add precursors and successors revset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 305
diff changeset
   810
    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
   811
299
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   812
### template keywords
454
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   813
# XXX it does not handle troubles well :-/
299
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   814
431
bd05022c7856 obsolete: add and use templatekw decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 430
diff changeset
   815
@eh.templatekw('obsolete')
299
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   816
def obsoletekw(repo, ctx, templ, **args):
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   817
    """:obsolete: String. The obsolescence level of the node, could be
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   818
    ``stable``, ``unstable``, ``suspended`` or ``extinct``.
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   819
    """
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   820
    rev = ctx.rev()
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   821
    if ctx.obsolete():
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   822
        if ctx.extinct():
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   823
            return 'extinct'
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   824
        else:
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   825
            return 'suspended'
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   826
    elif ctx.unstable():
299
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   827
        return 'unstable'
eda6491ca269 obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   828
    return 'stable'
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   829
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   830
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   831
### Various trouble warning                                       ###
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   832
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   833
454
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   834
# This section take care of issue warning to the user when troubles appear
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   835
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   836
@eh.wrapcommand("update")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   837
@eh.wrapcommand("pull")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   838
def wrapmayobsoletewc(origfn, ui, repo, *args, **opts):
454
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   839
    """Warn that the working directory parent is an obsolete changeset"""
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   840
    res = origfn(ui, repo, *args, **opts)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   841
    if repo['.'].obsolete():
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   842
        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
   843
    return res
71
19e1930587a0 [obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 70
diff changeset
   844
454
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   845
# XXX this could wrap transaction code
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   846
# XXX (but this is a bit a layer violation)
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   847
@eh.wrapcommand("commit")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   848
@eh.wrapcommand("push")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   849
@eh.wrapcommand("pull")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   850
@eh.wrapcommand("graft")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   851
@eh.wrapcommand("phase")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   852
@eh.wrapcommand("unbundle")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   853
def warnobserrors(orig, ui, repo, *args, **kwargs):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   854
    """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
   855
    priorunstables = len(repo.revs('unstable()'))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   856
    priorlatecomers = len(repo.revs('latecomer()'))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   857
    priorconflictings = len(repo.revs('conflicting()'))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   858
    #print orig, priorunstables
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   859
    #print len(repo.revs('secret() - obsolete()'))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   860
    try:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   861
        return orig(ui, repo, *args, **kwargs)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   862
    finally:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   863
        newunstables = len(repo.revs('unstable()')) - priorunstables
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   864
        newlatecomers = len(repo.revs('latecomer()')) - priorlatecomers
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   865
        newconflictings = len(repo.revs('conflicting()')) - priorconflictings
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   866
        #print orig, newunstables
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   867
        #print len(repo.revs('secret() - obsolete()'))
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   868
        if newunstables > 0:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   869
            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
   870
        if newlatecomers > 0:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   871
            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
   872
        if newconflictings > 0:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   873
            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
   874
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   875
@eh.reposetup
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   876
def _repostabilizesetup(ui, repo):
454
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   877
    """Add a hint for "hg stabilize" when troubles make push fails
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   878
    """
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   879
    if not repo.local():
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   880
        return
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   881
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   882
    opush = repo.push
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   883
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   884
    class stabilizerrepo(repo.__class__):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   885
        def push(self, remote, *args, **opts):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   886
            """wrapper around pull that pull obsolete relation"""
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   887
            try:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   888
                result = opush(remote, *args, **opts)
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   889
            except util.Abort, ex:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   890
                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
   891
                         "or --force to ignore warnings")
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   892
                if (len(ex.args) >= 1
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   893
                    and ex.args[0].startswith('push includes ')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   894
                    and ex.hint is None):
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   895
                    ex.hint = hint
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   896
                raise
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   897
            return result
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   898
    repo.__class__ = stabilizerrepo
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   899
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   900
#####################################################################
454
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   901
### Core Other extension compat                                   ###
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   902
#####################################################################
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   903
454
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   904
# This section make official history rewritter create obsolete marker
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   905
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   906
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   907
### commit --amend
454
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   908
# make commit --amend create obsolete marker
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   909
#
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   910
# The precursor is still strip from the repository.
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   911
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   912
@eh.wrapfunction(cmdutil, 'amend')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   913
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
   914
    oldnode = old.node()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   915
    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
   916
    if new != oldnode:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   917
        lock = repo.lock()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   918
        try:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   919
            tr = repo.transaction('post-amend-obst')
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   920
            try:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   921
                meta = {
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   922
                    'date':  '%i %i' % util.makedate(),
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   923
                    'user': ui.username(),
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   924
                    }
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   925
                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
   926
                tr.close()
447
fa85e7205e0b obsolete: move caches on obsstore
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 446
diff changeset
   927
                clearobscaches(repo)
437
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   928
            finally:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   929
                tr.release()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   930
        finally:
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   931
            lock.release()
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   932
    return new
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   933
48ac58354b7b obsolete: sort all code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 436
diff changeset
   934
### rebase
454
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   935
#
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   936
# - ignore obsolete changeset
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
   937
# - create obsolete marker *instead of* striping
150
f12fd2410a60 obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 148
diff changeset
   938
253
8ee6c5b98d73 [obsolete] fix new api: be more flexible on rebase's buildstate signature
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 252
diff changeset
   939
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
   940
    """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
   941
    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
   942
    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
   943
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   944
def defineparents(orig, repo, rev, target, state, *args, **kwargs):
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   945
    rebasestate = getattr(repo, '_rebasestate', None)
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   946
    if rebasestate is not None:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   947
        repo._rebasestate = dict(state)
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   948
        repo._rebasetarget = target
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   949
    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
   950
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   951
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
   952
    """wrapper for rebase 's concludenode that set obsolete relation"""
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   953
    newrev = orig(repo, rev, p1, *args, **kwargs)
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   954
    rebasestate = getattr(repo, '_rebasestate', None)
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   955
    if rebasestate is not None:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   956
        if newrev is not None:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   957
            nrev = repo[newrev].rev()
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   958
        else:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   959
            nrev = p1
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   960
        repo._rebasestate[rev] = nrev
71
19e1930587a0 [obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 70
diff changeset
   961
    return newrev
19e1930587a0 [obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 70
diff changeset
   962
274
6622a24f3b0f obsolete: fix rebase wrapping
Patrick Mezard <patrick@mezard.eu>
parents: 273
diff changeset
   963
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
   964
5eecfda0a5c7 obsolete: enable rebase --keep again
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 310
diff changeset
   965
    reallykeep = kwargs.get('keep', False)
275
336210dada95 obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents: 274
diff changeset
   966
    kwargs = dict(kwargs)
84
c4cc5f3bcf12 [obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 83
diff changeset
   967
    kwargs['keep'] = True
c4cc5f3bcf12 [obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 83
diff changeset
   968
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   969
    # 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
   970
    # replacements if any. Doing it in concludenode() prevents
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   971
    # aborting the rebase, and is not called with all relevant
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   972
    # revisions in --collapse case. Instead, we try to track the
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   973
    # rebase state structure by sampling/updating it in
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   974
    # defineparents() and concludenode(). The obsolete markers are
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   975
    # added from this state after a successful call.
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   976
    repo._rebasestate = {}
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   977
    repo._rebasetarget = None
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   978
    try:
443
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
   979
        l = repo.lock()
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
   980
        try:
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
   981
            res = orig(ui, repo, *args, **kwargs)
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
   982
            if not reallykeep:
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
   983
                # Filter nullmerge or unrebased entries
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
   984
                repo._rebasestate = dict(p for p in repo._rebasestate.iteritems()
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
   985
                                         if p[1] >= 0)
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
   986
                if not res and not kwargs.get('abort') and repo._rebasestate:
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
   987
                    # Rebased revisions are assumed to be descendants of
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
   988
                    # targetrev. If a source revision is mapped to targetrev
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
   989
                    # or to another rebased revision, it must have been
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
   990
                    # removed.
455
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
   991
                    markers = []
443
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
   992
                    if kwargs.get('collapse'):
455
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
   993
                        # collapse assume revision disapear because they are all
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
   994
                        # in the created revision
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
   995
                        newrevs = set(repo._rebasestate.values())
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
   996
                        newrevs.remove(repo._rebasetarget)
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
   997
                        if newrevs:
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
   998
                            # we create new revision.
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
   999
                            # A single one by --collapse design
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
  1000
                            assert len(newrevs) == 1
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
  1001
                            new = tuple(repo[n] for n in newrevs)
443
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
  1002
                        else:
455
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
  1003
                            # every body died. no new changeset created
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
  1004
                            new = (repo[repo._rebasetarget],)
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
  1005
                        for rev, newrev in sorted(repo._rebasestate.items()):
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
  1006
                            markers.append((repo[rev], new))
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
  1007
                    else:
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
  1008
                        # no collapse assume revision disapear because they are
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
  1009
                        # contained in parent
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
  1010
                        for rev, newrev in sorted(repo._rebasestate.items()):
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
  1011
                            markers.append((repo[rev], (repo[newrev],)))
f46a41006136 obsolete: simplify rebase wrapping code and change relation creation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 454
diff changeset
  1012
                    createmarkers(repo, markers)
443
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
  1013
            return res
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
  1014
        finally:
3f8c11865ed2 obsolete: remove usage of addcollapsedobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 442
diff changeset
  1015
            l.release()
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
  1016
    finally:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
  1017
        delattr(repo, '_rebasestate')
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
  1018
        delattr(repo, '_rebasetarget')
84
c4cc5f3bcf12 [obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 83
diff changeset
  1019
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1020
@eh.extsetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1021
def _rebasewrapping(ui):
356
56d4c6207ef9 Move obserror warning into the obsolete extension.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 354
diff changeset
  1022
    # warning about more obsolete
42
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
  1023
    try:
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
  1024
        rebase = extensions.find('rebase')
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
  1025
        if rebase:
356
56d4c6207ef9 Move obserror warning into the obsolete extension.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 354
diff changeset
  1026
            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
  1027
            extensions.wrapfunction(rebase, 'buildstate', buildstate)
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
  1028
            extensions.wrapfunction(rebase, 'defineparents', defineparents)
42
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
  1029
            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
  1030
            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
  1031
    except KeyError:
305
0b444d7c5c96 update revset vocabulary to use precursors, successors
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 304
diff changeset
  1032
        pass  # rebase not found
39
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 38
diff changeset
  1033
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1034
430
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
  1035
#####################################################################
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
  1036
### Older format management                                       ###
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
  1037
#####################################################################
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
  1038
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
  1039
# 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
  1040
# 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
  1041
439
6cff54825233 obsolete: reorder import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 438
diff changeset
  1042
import json
6cff54825233 obsolete: reorder import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 438
diff changeset
  1043
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1044
@eh.reposetup
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1045
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
  1046
    """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
  1047
    """
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1048
    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
  1049
        return
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1050
    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
  1051
        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
  1052
            break
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1053
    else:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1054
        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
  1055
        if not data:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1056
            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
  1057
        if data:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1058
            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
  1059
                             '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
  1060
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1061
def _obsdeserialise(flike):
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1062
    """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
  1063
454
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
  1064
    this desierialize into a {subject -> objects} mapping
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
  1065
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
  1066
    this was the very first format ever."""
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1067
    rels = {}
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1068
    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
  1069
        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
  1070
        subnode = bin(subhex)
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1071
        if subnode == nullid:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1072
            subnode = None
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1073
        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
  1074
    return rels
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
  1075
441
d702f0d26c6a obsolete: remove debugsuccessors
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 440
diff changeset
  1076
cmdtable = {}
d702f0d26c6a obsolete: remove debugsuccessors
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 440
diff changeset
  1077
command = cmdutil.command(cmdtable)
276
f26e9bc5f7fc obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents: 275
diff changeset
  1078
@command('debugconvertobsolete', [], '')
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
  1079
def cmddebugconvertobsolete(ui, repo):
278
fa0b9b8a83c0 obsolete: add or fix debug commands help
Patrick Mezard <patrick@mezard.eu>
parents: 277
diff changeset
  1080
    """import markers from an .hg/obsolete-relations file"""
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
  1081
    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
  1082
    err = 0
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
  1083
    l = repo.lock()
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
  1084
    some = False
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
  1085
    try:
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1086
        unlink = []
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1087
        tr = repo.transaction('convert-obsolete')
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
  1088
        try:
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1089
            repo._importoldobsolete = True
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1090
            store = repo.obsstore
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1091
            ### very first format
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
  1092
            try:
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1093
                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
  1094
                try:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1095
                    some = True
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1096
                    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
  1097
                        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
  1098
                        suc = bin(subhex)
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1099
                        prec = bin(objhex)
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1100
                        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
  1101
                        meta = {
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1102
                            '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
  1103
                            'user': ui.username(),
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1104
                            }
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1105
                        try:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1106
                            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
  1107
                            cnt += 1
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1108
                        except ValueError:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1109
                            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
  1110
                                              % (line))
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1111
                            err += 1
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1112
                finally:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1113
                    f.close()
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1114
                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
  1115
            except IOError:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1116
                pass
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1117
            ### second (json) format
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1118
            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
  1119
            if data:
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
  1120
                some = True
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1121
                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
  1122
                    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
  1123
                    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
  1124
                    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
  1125
                    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
  1126
                    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
  1127
                    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
  1128
                        try:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1129
                            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
  1130
                        except LOOKUP_ERRORS:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1131
                            pass
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1132
                    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
  1133
                        try:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1134
                            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
  1135
                        except LOOKUP_ERRORS:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1136
                            pass
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1137
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1138
                    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
  1139
                    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
  1140
                                 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
  1141
                    try:
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1142
                        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
  1143
                        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
  1144
                        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
  1145
                                     0, meta)
341
7653f80fd7a4 obsolete: harden convertion from first format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 340
diff changeset
  1146
                        cnt += 1
7653f80fd7a4 obsolete: harden convertion from first format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 340
diff changeset
  1147
                    except ValueError:
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1148
                        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
  1149
                                     % (oldobject, oldsubjects))
341
7653f80fd7a4 obsolete: harden convertion from first format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 340
diff changeset
  1150
                        err += 1
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1151
                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
  1152
            tr.close()
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1153
            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
  1154
                util.unlink(path)
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1155
        finally:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
  1156
            tr.release()
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
  1157
    finally:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
  1158
        del repo._importoldobsolete
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
  1159
        l.release()
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
  1160
    if not some:
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
  1161
            ui.warn('nothing to do\n')
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
  1162
    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
  1163
    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
  1164
        ui.write_err('%i conversion failed. check you graph!\n' % err)