hgext/obsolete.py
author Patrick Mezard <patrick@mezard.eu>
Thu, 21 Jun 2012 19:58:57 +0200
changeset 298 f597421662f7
parent 297 590ac023c536
child 299 eda6491ca269
permissions -rw-r--r--
obsolete: unify collapsed revisions markers handling When collapsing A, B and C into D, amend was registering: A -> D B -> D A -> B C -> D A -> C while the rebase wrapper was doing: A -> D B -> D C -> D At this point, I have no argument to favor one or another or even a new one like: A -> B B -> C C -> D so I am aligning the rebase implementation on the older amend one. At least we can now change them all at once.
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
Display and Exchange
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    35
--------------------
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    36
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    37
obsolete changesets are hidden. (except if they have non obsolete changeset)
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    38
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    39
obsolete changesets are not exchanged. This will probably change later but it
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    40
was the simpler solution for now.
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    41
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    42
New commands
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    43
------------
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    44
275
336210dada95 obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents: 274
diff changeset
    45
Note that rebased changesets are not marked obsolete rather than being stripped
336210dada95 obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents: 274
diff changeset
    46
In this experimental extensions, this is done forcing the --keep option. Trying
336210dada95 obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents: 274
diff changeset
    47
to use the --keep option of rebase with this extensionn this experimental
336210dada95 obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents: 274
diff changeset
    48
extension will cause such a call to abort. Until better releasen please use
336210dada95 obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents: 274
diff changeset
    49
graft command to rebase and copy changesets.
336210dada95 obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents: 274
diff changeset
    50
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    51
Context object
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    52
--------------
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    53
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    54
Context gains a ``obsolete`` method that will return True if a changeset is
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    55
obsolete False otherwise.
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    56
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    57
revset
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    58
------
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    59
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    60
Add an ``obsolete()`` entry.
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    61
70
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
    62
repo extension
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    63
--------------
70
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
    64
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    65
To Do
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    66
~~~~~
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    67
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    68
- refuse to obsolete published changesets
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    69
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    70
- handle split
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    71
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    72
- handle conflict
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    73
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    74
- handle unstable // out of sync
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    75
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    76
"""
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    77
52
62bdc2567099 Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
    78
import os
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 53
diff changeset
    79
try:
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 53
diff changeset
    80
    from cStringIO import StringIO
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 53
diff changeset
    81
except ImportError:
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 53
diff changeset
    82
    from StringIO import StringIO
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 53
diff changeset
    83
75
d7b11772f0b5 [obsolete] published changeset can't be obsoleted
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 74
diff changeset
    84
from mercurial.i18n import _
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    85
89
757153438e58 [obsolet] base64 encore obsolete rel for pushkey
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
    86
import base64
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
    87
import json
89
757153438e58 [obsolet] base64 encore obsolete rel for pushkey
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
    88
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    89
from mercurial import util
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    90
from mercurial import context
39
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 38
diff changeset
    91
from mercurial import revset
40
b9a5a596d9ef proper computation of hidden changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 39
diff changeset
    92
from mercurial import scmutil
42
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
    93
from mercurial import extensions
44
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
    94
from mercurial import pushkey
46
3b0364fc822f Do not propagate obsolete changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 44
diff changeset
    95
from mercurial import discovery
3b0364fc822f Do not propagate obsolete changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 44
diff changeset
    96
from mercurial import error
79
9906560f585e [obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 75
diff changeset
    97
from mercurial import commands
114
1a64195e2b09 nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 112
diff changeset
    98
from mercurial import changelog
115
d60eddda9546 add an option to ensure unstable are secret
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 114
diff changeset
    99
from mercurial import phases
80
5d029a358252 [obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 79
diff changeset
   100
from mercurial.node import hex, bin, short, nullid
52
62bdc2567099 Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   101
from mercurial.lock import release
252
470232cea503 [obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 228
diff changeset
   102
from mercurial import localrepo
276
f26e9bc5f7fc obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents: 275
diff changeset
   103
from mercurial import cmdutil
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   104
160
24346b78cd99 mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 150
diff changeset
   105
try:
24346b78cd99 mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 150
diff changeset
   106
    from mercurial.localrepo import storecache
24346b78cd99 mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 150
diff changeset
   107
    storecache('babar') # to trigger import
197
c2d692c8f599 stronger try except for store cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 160
diff changeset
   108
except (TypeError, ImportError):
160
24346b78cd99 mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 150
diff changeset
   109
    def storecache(*args):
24346b78cd99 mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 150
diff changeset
   110
        return scmutil.filecache(*args, instore=True)
24346b78cd99 mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 150
diff changeset
   111
24346b78cd99 mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 150
diff changeset
   112
72
774932a6cc0d [obsolete] rationalize doc header.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 71
diff changeset
   113
### Patch changectx
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   114
#############################
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   115
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   116
def obsolete(ctx):
37
9493ffa68633 Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 32
diff changeset
   117
    """is the changeset obsolete by other"""
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   118
    if ctx.node()is None:
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   119
        return False
112
eae9be0ee00e adapt obsolete to phase.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 109
diff changeset
   120
    return bool(ctx._repo.obsoletedby(ctx.node())) and ctx.phase()
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   121
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   122
context.changectx.obsolete = obsolete
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   123
148
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   124
def unstable(ctx):
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   125
    """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
   126
    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
   127
        return False
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   128
    return ctx.rev() in ctx._repo._unstableset
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   129
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   130
context.changectx.unstable = unstable
8e93e1f67205 obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 144
diff changeset
   131
213
ea4aa1890b16 obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 212
diff changeset
   132
def extinct(ctx):
ea4aa1890b16 obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 212
diff changeset
   133
    """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
   134
    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
   135
        return False
ea4aa1890b16 obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 212
diff changeset
   136
    return ctx.rev() in ctx._repo._extinctset
ea4aa1890b16 obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 212
diff changeset
   137
ea4aa1890b16 obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 212
diff changeset
   138
context.changectx.extinct = extinct
ea4aa1890b16 obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 212
diff changeset
   139
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   140
72
774932a6cc0d [obsolete] rationalize doc header.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 71
diff changeset
   141
### revset
39
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 38
diff changeset
   142
#############################
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 38
diff changeset
   143
112
eae9be0ee00e adapt obsolete to phase.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 109
diff changeset
   144
39
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 38
diff changeset
   145
def revsetobsolete(repo, subset, x):
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   146
    """obsolete changesets"""
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   147
    args = revset.getargs(x, 0, 0, 'obsolete takes no argument')
252
470232cea503 [obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 228
diff changeset
   148
    return [r for r in subset if r in repo._obsoleteset and repo._phasecache.phase(repo, r) > 0]
470232cea503 [obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 228
diff changeset
   149
470232cea503 [obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 228
diff changeset
   150
# XXX Backward compatibility, to be removed once stabilized
470232cea503 [obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 228
diff changeset
   151
if '_phasecache' not in vars(localrepo.localrepository): # new api
470232cea503 [obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 228
diff changeset
   152
    def revsetobsolete(repo, subset, x):
470232cea503 [obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 228
diff changeset
   153
        """obsolete changesets"""
470232cea503 [obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 228
diff changeset
   154
        args = revset.getargs(x, 0, 0, 'obsolete takes no argument')
470232cea503 [obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 228
diff changeset
   155
        return [r for r in subset if r in repo._obsoleteset and repo._phaserev[r] > 0]
39
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 38
diff changeset
   156
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   157
def revsetunstable(repo, subset, x):
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   158
    """non obsolete changesets descendant of obsolete one"""
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   159
    args = revset.getargs(x, 0, 0, 'unstable takes no arguments')
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   160
    return [r for r in subset if r in repo._unstableset]
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   161
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   162
def revsetsuspended(repo, subset, x):
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   163
    """obsolete changesets with non obsolete descendants"""
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   164
    args = revset.getargs(x, 0, 0, 'unstable takes no arguments')
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   165
    return [r for r in subset if r in repo._suspendedset]
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   166
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   167
def revsetextinct(repo, subset, x):
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   168
    """obsolete changesets without obsolete descendants"""
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   169
    args = revset.getargs(x, 0, 0, 'unstable takes no arguments')
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   170
    return [r for r in subset if r in repo._extinctset]
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   171
143
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   172
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   173
def _obsparents(repo, s):
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   174
    """obsolete parents of a subset"""
143
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   175
    cs = set()
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   176
    nm = repo.changelog.nodemap
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   177
    markerbysubj = repo.obsoletestore.subjects
143
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   178
    for r in s:
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   179
        for p in markerbysubj.get(repo[r].node(), ()):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   180
            pr = nm.get(p['object'])
143
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   181
            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
   182
                cs.add(pr)
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   183
    return cs
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   184
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   185
def revsetobsparents(repo, subset, x):
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   186
    """obsolete parents"""
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   187
    s = revset.getset(repo, range(len(repo)), x)
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   188
    cs = _obsparents(repo, s)
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   189
    return [r for r in subset if r in cs]
143
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   190
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   191
def _obsancestors(repo, s):
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   192
    """obsolete ancestors of a subset"""
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   193
    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
   194
    seen = set()
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   195
    allsubjects = repo.obsoletestore.subjects
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   196
    while toproceed:
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   197
        nc = toproceed.pop()
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   198
        for mark in allsubjects.get(nc, ()):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   199
            np = mark['object']
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   200
            if np not in seen:
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   201
                seen.add(np)
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   202
                toproceed.append(np)
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   203
    nm = repo.changelog.nodemap
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   204
    cs = set()
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   205
    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
   206
        pr = nm.get(p)
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   207
        if pr is not None:
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   208
            cs.add(pr)
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   209
    return cs
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   210
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   211
def revsetobsancestors(repo, subset, x):
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   212
    """obsolete parents"""
143
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   213
    s = revset.getset(repo, range(len(repo)), x)
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   214
    cs = _obsancestors(repo, s)
143
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   215
    return [r for r in subset if r in cs]
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   216
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   217
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   218
71
19e1930587a0 [obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 70
diff changeset
   219
### Other Extension compat
19e1930587a0 [obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 70
diff changeset
   220
############################
19e1930587a0 [obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 70
diff changeset
   221
150
f12fd2410a60 obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 148
diff changeset
   222
253
8ee6c5b98d73 [obsolete] fix new api: be more flexible on rebase's buildstate signature
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 252
diff changeset
   223
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
   224
    """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
   225
    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
   226
    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
   227
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   228
def defineparents(orig, repo, rev, target, state, *args, **kwargs):
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   229
    rebasestate = getattr(repo, '_rebasestate', None)
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   230
    if rebasestate is not None:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   231
        repo._rebasestate = dict(state)
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   232
        repo._rebasetarget = target
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   233
    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
   234
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   235
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
   236
    """wrapper for rebase 's concludenode that set obsolete relation"""
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   237
    newrev = orig(repo, rev, p1, *args, **kwargs)
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   238
    rebasestate = getattr(repo, '_rebasestate', None)
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   239
    if rebasestate is not None:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   240
        if newrev is not None:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   241
            nrev = repo[newrev].rev()
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   242
        else:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   243
            nrev = p1
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   244
        repo._rebasestate[rev] = nrev
71
19e1930587a0 [obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 70
diff changeset
   245
    return newrev
19e1930587a0 [obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 70
diff changeset
   246
274
6622a24f3b0f obsolete: fix rebase wrapping
Patrick Mezard <patrick@mezard.eu>
parents: 273
diff changeset
   247
def cmdrebase(orig, ui, repo, *args, **kwargs):
275
336210dada95 obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents: 274
diff changeset
   248
    if kwargs.get('keep', False):
336210dada95 obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents: 274
diff changeset
   249
        raise util.Abort(_('rebase --keep option is unsupported with obsolete '
336210dada95 obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents: 274
diff changeset
   250
                           'extension'), hint=_("see 'hg help obsolete'"))
336210dada95 obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents: 274
diff changeset
   251
    kwargs = dict(kwargs)
84
c4cc5f3bcf12 [obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 83
diff changeset
   252
    kwargs['keep'] = True
c4cc5f3bcf12 [obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 83
diff changeset
   253
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   254
    # 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
   255
    # replacements if any. Doing it in concludenode() prevents
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   256
    # aborting the rebase, and is not called with all relevant
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   257
    # revisions in --collapse case. Instead, we try to track the
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   258
    # rebase state structure by sampling/updating it in
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   259
    # defineparents() and concludenode(). The obsolete markers are
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   260
    # added from this state after a successful call.
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   261
    repo._rebasestate = {}
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   262
    repo._rebasetarget = None
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   263
    maxrev = len(repo) - 1
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   264
    try:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   265
        res = orig(ui, repo, *args, **kwargs)
297
590ac023c536 rebase: improve invalid revisions filtering
Patrick Mezard <patrick@mezard.eu>
parents: 285
diff changeset
   266
        # Filter nullmerge or unrebased entries
590ac023c536 rebase: improve invalid revisions filtering
Patrick Mezard <patrick@mezard.eu>
parents: 285
diff changeset
   267
        repo._rebasestate = dict(p for p in repo._rebasestate.iteritems()
590ac023c536 rebase: improve invalid revisions filtering
Patrick Mezard <patrick@mezard.eu>
parents: 285
diff changeset
   268
                                 if p[1] >= 0)
590ac023c536 rebase: improve invalid revisions filtering
Patrick Mezard <patrick@mezard.eu>
parents: 285
diff changeset
   269
        if not res and not kwargs.get('abort') and repo._rebasestate:
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   270
            # Rebased revisions are assumed to be descendants of
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   271
            # targetrev. If a source revision is mapped to targetrev
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   272
            # or to another rebased revision, it must have been
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   273
            # removed.
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   274
            targetrev = repo[repo._rebasetarget].rev()
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   275
            newrevs = set([targetrev])
298
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   276
            replacements = {}
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   277
            for rev, newrev in sorted(repo._rebasestate.items()):
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   278
                oldnode = repo[rev].node()
297
590ac023c536 rebase: improve invalid revisions filtering
Patrick Mezard <patrick@mezard.eu>
parents: 285
diff changeset
   279
                if newrev not in newrevs:
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   280
                    newnode = repo[newrev].node()
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   281
                    newrevs.add(newrev)
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   282
                else:
298
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   283
                    newnode = nullid
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   284
                replacements[oldnode] = newnode
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   285
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   286
            if kwargs.get('collapse'):
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   287
                newnodes = set(n for n in replacements.values() if n != nullid)
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   288
                if newnodes:
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   289
                    # Collapsing into more than one revision?
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   290
                    assert len(newnodes) == 1, newnodes
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   291
                    newnode = newnodes.pop()
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   292
                else:
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   293
                    newnode = nullid
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   294
                repo.addcollapsedobsolete(replacements, newnode)
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   295
            else:
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   296
                for oldnode, newnode in replacements.iteritems():
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   297
                    repo.addobsolete(newnode, oldnode)
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   298
        return res
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   299
    finally:
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   300
        delattr(repo, '_rebasestate')
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   301
        delattr(repo, '_rebasetarget')
84
c4cc5f3bcf12 [obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 83
diff changeset
   302
71
19e1930587a0 [obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 70
diff changeset
   303
39
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 38
diff changeset
   304
def extsetup(ui):
75
d7b11772f0b5 [obsolete] published changeset can't be obsoleted
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 74
diff changeset
   305
39
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 38
diff changeset
   306
    revset.symbols["obsolete"] = revsetobsolete
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   307
    revset.symbols["unstable"] = revsetunstable
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   308
    revset.symbols["suspended"] = revsetsuspended
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   309
    revset.symbols["extinct"] = revsetextinct
143
0599fb01dc41 add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 135
diff changeset
   310
    revset.symbols["obsparents"] = revsetobsparents
144
f387658d6d22 Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 143
diff changeset
   311
    revset.symbols["obsancestors"] = revsetobsancestors
46
3b0364fc822f Do not propagate obsolete changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 44
diff changeset
   312
3b0364fc822f Do not propagate obsolete changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 44
diff changeset
   313
42
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
   314
    try:
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
   315
        rebase = extensions.find('rebase')
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
   316
        if rebase:
150
f12fd2410a60 obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 148
diff changeset
   317
            extensions.wrapfunction(rebase, 'buildstate', buildstate)
282
05ab164c6593 obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents: 279
diff changeset
   318
            extensions.wrapfunction(rebase, 'defineparents', defineparents)
42
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
   319
            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
   320
            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
   321
    except KeyError:
eb6a06d7eae3 Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 41
diff changeset
   322
        pass # rebase not found
39
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 38
diff changeset
   323
44
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   324
# Pushkey mechanism for mutable
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   325
#########################################
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   326
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 53
diff changeset
   327
def pushobsolete(repo, key, old, raw):
74
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   328
    """push obsolete relation through pushkey"""
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   329
    assert key == "markers"
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   330
    l = repo.lock()
44
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   331
    try:
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 53
diff changeset
   332
        tmp = StringIO()
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 53
diff changeset
   333
        tmp.write(raw)
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 53
diff changeset
   334
        tmp.seek(0)
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   335
        repo.obsoletestore.load(tmp)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   336
        repo.obsoletestore._dirty = True # XXX meh
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   337
        return 1
44
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   338
    finally:
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   339
        l.release()
44
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   340
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   341
def listobsolete(repo):
74
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   342
    """dump all obsolete relation in
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   343
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   344
    XXX this have be improved"""
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 53
diff changeset
   345
    tmp = StringIO()
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   346
    repo.obsoletestore.save(tmp)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   347
    return {'markers': base64.b64encode(tmp.getvalue())}
44
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   348
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   349
pushkey.register('obsolete', pushobsolete, listobsolete)
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   350
214
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   351
### Discovery wrapping
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   352
#############################
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   353
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   354
class blist(list, object):
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   355
    """silly class to have non False but empty list"""
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   356
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   357
    def __nonzero__(self):
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   358
        return bool(len(self.orig))
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   359
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   360
def wrapfindcommonoutgoing(orig, repo, *args, **kwargs):
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   361
    """wrap mercurial.discovery.findcommonoutgoing to remove extinct changeset
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   362
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   363
    Such excluded changeset are removed from excluded  and will *not* appear
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   364
    are excluded secret changeset.
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   365
    """
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   366
    outgoing = orig(repo, *args, **kwargs)
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   367
    orig = outgoing.excluded
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   368
    outgoing.excluded = blist(n for n in orig if not repo[n].extinct())
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   369
    # when no revision is specified (push everything) a shortcut is taken when
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   370
    # nothign was exclude. taking this code path when extinct changeset have
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   371
    # been excluded leads to repository corruption.
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   372
    outgoing.excluded.orig = orig
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   373
    return outgoing
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   374
217
786eb34d93ea obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 215
diff changeset
   375
def wrapcheckheads(orig, repo, remote, outgoing, *args, **kwargs):
218
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   376
    """wrap mercurial.discovery.checkheads
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   377
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   378
    * prevent unstability to be pushed
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   379
    * patch remote to ignore obsolete heads on remote
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   380
    """
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   381
    # do not push instability
217
786eb34d93ea obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 215
diff changeset
   382
    for h in outgoing.missingheads:
786eb34d93ea obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 215
diff changeset
   383
        # checking heads only is enought because any thing base on obsolete
786eb34d93ea obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 215
diff changeset
   384
        # changeset is either obsolete or unstable.
786eb34d93ea obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 215
diff changeset
   385
        ctx =  repo[h]
786eb34d93ea obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 215
diff changeset
   386
        hint = _("use 'hg stabilize' to get a stable history (or --force to proceed)")
786eb34d93ea obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 215
diff changeset
   387
        if ctx.unstable():
786eb34d93ea obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 215
diff changeset
   388
            raise util.Abort(_("Trying to push unstable changeset: %s!") % ctx,
786eb34d93ea obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 215
diff changeset
   389
                             hint=hint)
786eb34d93ea obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 215
diff changeset
   390
        if ctx.obsolete():
786eb34d93ea obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 215
diff changeset
   391
            raise util.Abort(_("Trying to push obsolete changeset: %s!") % ctx,
786eb34d93ea obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 215
diff changeset
   392
                             hint=hint)
218
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   393
    ### patch remote branch map
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   394
    # do not read it this burn eyes
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   395
    try:
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   396
        if 'oldbranchmap' not in vars(remote):
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   397
            remote.oldbranchmap = remote.branchmap
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   398
            def branchmap():
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   399
                newbm = {}
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   400
                oldbm = None
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   401
                if (util.safehasattr(phases, 'visiblebranchmap')
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   402
                    and not util.safehasattr(remote, 'ignorevisiblebranchmap')
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   403
                   ):
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   404
                    remote.ignorevisiblebranchmap = False
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   405
                    remote.branchmap = remote.oldbranchmap
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   406
                    oldbm = phases.visiblebranchmap(remote)
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   407
                    remote.branchmap = remote.newbranchmap
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   408
                    remote.ignorevisiblebranchmap = True
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   409
                if oldbm is None:
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   410
                    oldbm = remote.oldbranchmap()
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   411
                for branch, nodes in oldbm.iteritems():
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   412
                    nodes = list(nodes)
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   413
                    new = set()
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   414
                    while nodes:
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   415
                        n = nodes.pop()
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   416
                        if n in repo.obsoletestore.objects:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   417
                            markers = repo.obsoletestore.objects[n]
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   418
                            for mark in markers:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   419
                                for newernode in mark['subjects']:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   420
                                    if newernode is not None:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   421
                                        nodes.append(newernode)
218
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   422
                        else:
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   423
                            new.add(n)
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   424
                    if new:
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   425
                        newbm[branch] = list(new)
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   426
                return newbm
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   427
            remote.ignorevisiblebranchmap = True
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   428
            remote.branchmap = branchmap
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   429
            remote.newbranchmap = branchmap
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   430
        return orig(repo, remote, outgoing, *args, **kwargs)
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   431
    finally:
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   432
        remote.__dict__.pop('branchmap', None) # restore class one
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   433
        remote.__dict__.pop('oldbranchmap', None)
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   434
        remote.__dict__.pop('newbranchmap', None)
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   435
        remote.__dict__.pop('ignorevisiblebranchmap', None)
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   436
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   437
# eye are still burning
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   438
def wrapvisiblebranchmap(orig, repo):
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   439
    ignore = getattr(repo, 'ignorevisiblebranchmap', None)
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   440
    if ignore is None:
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   441
        return orig(repo)
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   442
    elif ignore:
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   443
        return repo.branchmap()
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   444
    else:
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   445
        return None # break recursion
217
786eb34d93ea obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 215
diff changeset
   446
786eb34d93ea obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 215
diff changeset
   447
71
19e1930587a0 [obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 70
diff changeset
   448
### New commands
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   449
#############################
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   450
276
f26e9bc5f7fc obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents: 275
diff changeset
   451
cmdtable = {}
f26e9bc5f7fc obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents: 275
diff changeset
   452
command = cmdutil.command(cmdtable)
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   453
276
f26e9bc5f7fc obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents: 275
diff changeset
   454
@command('debugobsolete', [], _('SUBJECT OBJECT'))
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   455
def cmddebugobsolete(ui, repo, subject, object):
278
fa0b9b8a83c0 obsolete: add or fix debug commands help
Patrick Mezard <patrick@mezard.eu>
parents: 277
diff changeset
   456
    """add an obsolete relation between two nodes
74
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   457
278
fa0b9b8a83c0 obsolete: add or fix debug commands help
Patrick Mezard <patrick@mezard.eu>
parents: 277
diff changeset
   458
    The subject is expected to be a newer version of the object.
fa0b9b8a83c0 obsolete: add or fix debug commands help
Patrick Mezard <patrick@mezard.eu>
parents: 277
diff changeset
   459
    """
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   460
    lock = repo.lock()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   461
    try:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   462
        sub = repo[subject]
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   463
        obj = repo[object]
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   464
        repo.addobsolete(sub.node(), obj.node())
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   465
    finally:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   466
        lock.release()
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   467
    return 0
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   468
276
f26e9bc5f7fc obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents: 275
diff changeset
   469
@command('debugconvertobsolete', [], '')
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   470
def cmddebugconvertobsolete(ui, repo):
278
fa0b9b8a83c0 obsolete: add or fix debug commands help
Patrick Mezard <patrick@mezard.eu>
parents: 277
diff changeset
   471
    """import markers from an .hg/obsolete-relations file"""
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   472
    cnt = 0
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   473
    l = repo.lock()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   474
    try:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   475
        repo._importoldobsolete = True
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   476
        store = repo.obsoletestore
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   477
        try:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   478
            f = repo.opener('obsolete-relations')
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   479
            try:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   480
                for line in f:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   481
                    subhex, objhex = line.split()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   482
                    sub = bin(subhex)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   483
                    obj = bin(objhex)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   484
                    newmarker = {
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   485
                        'subjects': (sub==nullid) and [] or [sub],
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   486
                        'object': obj,
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   487
                        'date':  util.makedate(),
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   488
                        'user': ui.username(),
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   489
                        'reason': 'import from older format.',
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   490
                        }
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   491
                    store.new(newmarker)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   492
                    store._dirty = True
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   493
                    cnt += 1
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   494
            finally:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   495
                f.close()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   496
            util.unlink(repo.join('obsolete-relations'))
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   497
        except IOError:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   498
            ui.warn('nothing to do\n')
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   499
            pass
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   500
    finally:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   501
        del repo._importoldobsolete
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   502
        l.release()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   503
    ui.status('%i obsolete marker converted\n' % cnt)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   504
276
f26e9bc5f7fc obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents: 275
diff changeset
   505
@command('debugsuccessors', [], '')
273
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   506
def cmddebugsuccessors(ui, repo):
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   507
    """dump obsolete changesets and their successors
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   508
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   509
    Each line matches an existing marker, the first identifier is the
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   510
    obsolete changeset identifier, followed by it successors.
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   511
    """
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   512
    lock = repo.lock()
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   513
    try:
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   514
        allsuccessors = repo.obsoletestore.objects
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   515
        for old in sorted(allsuccessors):
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   516
            successors = [sorted(m['subjects']) for m in allsuccessors[old]]
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   517
            for i, group in enumerate(sorted(successors)):
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   518
                ui.write('%s' % short(old))
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   519
                for new in group:
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   520
                    ui.write(' %s' % short(new))
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   521
                ui.write('\n')
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   522
    finally:
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
   523
        lock.release()
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   524
79
9906560f585e [obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 75
diff changeset
   525
### Altering existing command
9906560f585e [obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 75
diff changeset
   526
#############################
9906560f585e [obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 75
diff changeset
   527
9906560f585e [obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 75
diff changeset
   528
def wrapmayobsoletewc(origfn, ui, repo, *args, **opts):
9906560f585e [obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 75
diff changeset
   529
    res = origfn(ui, repo, *args, **opts)
9906560f585e [obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 75
diff changeset
   530
    if repo['.'].obsolete():
9906560f585e [obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 75
diff changeset
   531
        ui.warn(_('Working directory parent is obsolete\n'))
9906560f585e [obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 75
diff changeset
   532
    return res
9906560f585e [obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 75
diff changeset
   533
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   534
def noextinctsvisibleheads(orig, repo):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   535
    repo._turn_extinct_secret()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   536
    return orig(repo)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   537
79
9906560f585e [obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 75
diff changeset
   538
def uisetup(ui):
9906560f585e [obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 75
diff changeset
   539
    extensions.wrapcommand(commands.table, "update", wrapmayobsoletewc)
9906560f585e [obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 75
diff changeset
   540
    extensions.wrapcommand(commands.table, "pull", wrapmayobsoletewc)
214
a140d1857931 obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 213
diff changeset
   541
    extensions.wrapfunction(discovery, 'findcommonoutgoing', wrapfindcommonoutgoing)
217
786eb34d93ea obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 215
diff changeset
   542
    extensions.wrapfunction(discovery, 'checkheads', wrapcheckheads)
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   543
    extensions.wrapfunction(phases, 'visibleheads', noextinctsvisibleheads)
218
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   544
    if util.safehasattr(phases, 'visiblebranchmap'):
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
   545
        extensions.wrapfunction(phases, 'visiblebranchmap', wrapvisiblebranchmap)
79
9906560f585e [obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 75
diff changeset
   546
70
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
   547
### serialisation
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
   548
#############################
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
   549
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
   550
def _obsserialise(obssubrels, flike):
74
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   551
    """serialise an obsolete relation mapping in a plain text one
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   552
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   553
    this is for subject -> [objects] mapping
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   554
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   555
    format is::
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   556
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   557
        <subject-full-hex> <object-full-hex>\n"""
70
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
   558
    for sub, objs in obssubrels.iteritems():
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
   559
        for obj in objs:
80
5d029a358252 [obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 79
diff changeset
   560
            if sub is None:
5d029a358252 [obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 79
diff changeset
   561
                sub = nullid
70
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
   562
            flike.write('%s %s\n' % (hex(sub), hex(obj)))
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
   563
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
   564
def _obsdeserialise(flike):
74
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   565
    """read a file like object serialised with _obsserialise
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   566
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   567
    this desierialize into a {subject -> objects} mapping"""
70
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
   568
    rels = {}
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
   569
    for line in flike:
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
   570
        subhex, objhex = line.split()
80
5d029a358252 [obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 79
diff changeset
   571
        subnode = bin(subhex)
5d029a358252 [obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 79
diff changeset
   572
        if subnode == nullid:
5d029a358252 [obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 79
diff changeset
   573
            subnode = None
5d029a358252 [obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 79
diff changeset
   574
        rels.setdefault( subnode, set()).add(bin(objhex))
70
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
   575
    return rels
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
   576
87
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 86
diff changeset
   577
### diagnostique tools
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 86
diff changeset
   578
#############################
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 86
diff changeset
   579
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 86
diff changeset
   580
def unstables(repo):
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 86
diff changeset
   581
    """Return all unstable changeset"""
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 86
diff changeset
   582
    return scmutil.revrange(repo, ['obsolete():: and (not obsolete())'])
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 86
diff changeset
   583
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 86
diff changeset
   584
def newerversion(repo, obs):
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 86
diff changeset
   585
    """Return the newer version of an obsolete changeset"""
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   586
    toproceed = set([(obs,)])
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   587
    # XXX known optimization available
87
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 86
diff changeset
   588
    newer = set()
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   589
    objectrels = repo.obsoletestore.objects
87
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 86
diff changeset
   590
    while toproceed:
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 86
diff changeset
   591
        current = toproceed.pop()
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   592
        assert len(current) <= 1, 'splitting not handled yet. %r' % current
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   593
        if current:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   594
            n, = current
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   595
            if n in objectrels:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   596
                markers = objectrels[n]
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   597
                for mark in markers:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   598
                    toproceed.add(tuple(mark['subjects']))
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   599
            else:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   600
                newer.add(tuple(current))
132
64d16f07d67f obsolete: alter newerversion return
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 131
diff changeset
   601
        else:
64d16f07d67f obsolete: alter newerversion return
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 131
diff changeset
   602
            newer.add(())
87
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 86
diff changeset
   603
    return sorted(newer)
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 86
diff changeset
   604
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   605
### obsolete relation storage
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   606
#############################
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   607
def add2set(d, key, mark):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   608
    """add <mark> to a `set` in <d>[<key>]"""
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   609
    d.setdefault(key, []).append(mark)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   610
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   611
def markerid(marker):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   612
    KEYS = ['subjects', "object", "date", "user", "reason"]
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   613
    for key in KEYS:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   614
        assert key in marker
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   615
    keys = sorted(marker.keys())
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   616
    a = util.sha1()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   617
    for key in keys:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   618
        if key == 'subjects':
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   619
            for sub in sorted(marker[key]):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   620
                a.update(sub)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   621
        elif key == 'id':
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   622
            pass
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   623
        else:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   624
            a.update(str(marker[key]))
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   625
    a.update('\0')
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   626
    return a.digest()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   627
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   628
class obsoletestore(object):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   629
    """Store obsolete relations
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   630
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   631
    Relation are stored in three mapping. All mapping have "obsolete markers"
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   632
    as values::
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   633
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   634
        {'id': "unique id of the obsolete marker"
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   635
         'subjects': "0-N newer version of changeset in "object" (as ordered list)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   636
         'object': "old and obsolete version"
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   637
         'date': "When was this marker created ?"
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   638
         'user': "Who did that ?"
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   639
         'reason': "Why was it done"
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   640
        }
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   641
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   642
    Three keys exists
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   643
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   644
    :self._markers: "id" -> marker
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   645
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   646
    :self.subjects: "subject" -> set(marker)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   647
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   648
    :self.objects: "object" -> set(marker)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   649
    """
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   650
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   651
    def __init__(self):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   652
        self._markers = {}
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   653
        self.subjects = {}
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   654
        self.objects = {}
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   655
        self._dirty = False # should be on repo
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   656
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   657
    def new(self, marker):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   658
        """Add a *new* marker to the store. computing it's ID"""
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   659
        mid = marker['id'] = markerid(marker)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   660
        self._insert(marker)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   661
        self._dirty = True
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   662
        return mid
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   663
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   664
    def _insert(self, marker):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   665
        if marker['id'] not in self._markers:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   666
            self._markers[marker['id']] = marker
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   667
            add2set(self.objects, marker['object'], marker)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   668
            for subj in marker['subjects']:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   669
                add2set(self.subjects, subj, marker)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   670
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   671
    def save(self, stream):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   672
        markers = []
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   673
        for mark in self._markers.itervalues():
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   674
            jmark = mark.copy()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   675
            jmark['id'] = hex(jmark['id'])
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   676
            jmark['subjects'] = [hex(n) for n in jmark['subjects']]
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   677
            jmark['object'] = hex(jmark['object'])
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   678
            markers.append(jmark)
226
0892b91947ef obsolete: export pretty printed json
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 224
diff changeset
   679
        json.dump(markers, stream, indent=4)
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   680
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   681
    def load(self, stream):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   682
        for mark in json.load(stream):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   683
            mark['id'] = bin(mark['id'])
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   684
            mark['subjects'] = [bin(n) for n in mark['subjects']]
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   685
            mark['object'] = bin(mark['object'])
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   686
            self._insert(mark)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   687
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   688
def writeobsolete(repo):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   689
    """wire obsolete data on disk"""
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   690
    f = repo.sopener('obsoletemarkers', 'w', atomictemp=True)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   691
    try:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   692
        repo.obsoletestore.save(f)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   693
        repo._dirty = False
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   694
    finally:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   695
        f.close()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   696
87
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 86
diff changeset
   697
86
7f763bada042 [obsolete] code section comment for repo subclassing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 85
diff changeset
   698
### repo subclassing
7f763bada042 [obsolete] code section comment for repo subclassing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 85
diff changeset
   699
#############################
7f763bada042 [obsolete] code section comment for repo subclassing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 85
diff changeset
   700
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   701
def reposetup(ui, repo):
47
b73b3e3c9560 Don't overwrite non local repo.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 46
diff changeset
   702
    if not repo.local():
b73b3e3c9560 Don't overwrite non local repo.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 46
diff changeset
   703
        return
b73b3e3c9560 Don't overwrite non local repo.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 46
diff changeset
   704
44
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   705
    opull = repo.pull
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   706
    opush = repo.push
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   707
    olock = repo.lock
202
83b7e2c62ac3 [obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 197
diff changeset
   708
    o_rollback = repo._rollback
210
168ea7d200a0 obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 205
diff changeset
   709
    o_updatebranchcache = repo.updatebranchcache
44
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   710
203
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   711
    # /!\ api change in  Hg 2.2 (97efd26eb9576f39590812ea9) /!\
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   712
    if util.safehasattr(repo, '_journalfiles'): # Hg 2.2
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   713
        o_journalfiles = repo._journalfiles
205
7ba30bd95a88 obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 204
diff changeset
   714
    o_writejournal = repo._writejournal
203
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   715
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   716
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   717
    class obsoletingrepo(repo.__class__):
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   718
53
0bcbf690dfca reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 52
diff changeset
   719
        ### Public method
0bcbf690dfca reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 52
diff changeset
   720
        def obsoletedby(self, node):
0bcbf690dfca reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 52
diff changeset
   721
            """return the set of node that make <node> obsolete (obj)"""
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   722
            others = set()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   723
            for marker in self.obsoletestore.objects.get(node, []):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   724
                others.update(marker['subjects'])
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   725
            return others
53
0bcbf690dfca reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 52
diff changeset
   726
0bcbf690dfca reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 52
diff changeset
   727
        def obsolete(self, node):
0bcbf690dfca reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 52
diff changeset
   728
            """return the set of node that <node> make obsolete (sub)"""
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   729
            return set(marker['object'] for marker in self.obsoletestore.subjects.get(node, []))
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   730
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   731
        @util.propertycache
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   732
        def obsoletestore(self):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   733
            if not getattr(self, '_importoldobsolete', False):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   734
                try:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   735
                    f = self.opener('obsolete-relations')
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   736
                    f.close()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   737
                    raise util.Abort('old format of obsolete marker detected!\n'
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   738
                                     'run `hg debugconvertobsolete` once.')
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   739
                except IOError:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   740
                    pass
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   741
            store = obsoletestore()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   742
            try:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   743
                f = self.sopener('obsoletemarkers')
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   744
                store.load(f)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   745
            except IOError:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   746
                pass
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   747
            return store
53
0bcbf690dfca reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 52
diff changeset
   748
109
a2e8057117d3 obsolete: smarter initialisation of obsolete stuff from disk.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 95
diff changeset
   749
        @util.propertycache
a2e8057117d3 obsolete: smarter initialisation of obsolete stuff from disk.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 95
diff changeset
   750
        def _obsoleteset(self):
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   751
            """the set of obsolete revision"""
109
a2e8057117d3 obsolete: smarter initialisation of obsolete stuff from disk.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 95
diff changeset
   752
            obs = set()
126
c083fb43daee obsolete: stop using rev as it rebuild the cache every time there is a fault
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 125
diff changeset
   753
            nm = self.changelog.nodemap
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   754
            for obj in self.obsoletestore.objects:
203
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   755
                try: # /!\api change in Hg 2.2 (e8d37b78acfb22ae2c1fb126c2)/!\
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   756
                    rev = nm.get(obj)
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   757
                except TypeError:  #XXX to remove while breaking Hg 2.1 support
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   758
                    rev = nm.get(obj, None)
126
c083fb43daee obsolete: stop using rev as it rebuild the cache every time there is a fault
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 125
diff changeset
   759
                if rev is not None:
c083fb43daee obsolete: stop using rev as it rebuild the cache every time there is a fault
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 125
diff changeset
   760
                    obs.add(rev)
109
a2e8057117d3 obsolete: smarter initialisation of obsolete stuff from disk.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 95
diff changeset
   761
            return obs
a2e8057117d3 obsolete: smarter initialisation of obsolete stuff from disk.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 95
diff changeset
   762
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   763
        @util.propertycache
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   764
        def _unstableset(self):
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   765
            """the set of non obsolete revision with obsolete parent"""
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   766
            return set(self.revs('(obsolete()::) - obsolete()'))
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   767
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   768
        @util.propertycache
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   769
        def _suspendedset(self):
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   770
            """the set of obsolete parent with non obsolete descendant"""
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   771
            return set(self.revs('obsolete() and obsolete()::unstable()'))
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   772
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   773
        @util.propertycache
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   774
        def _extinctset(self):
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   775
            """the set of obsolete parent without non obsolete descendant"""
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   776
            return set(self.revs('obsolete() - obsolete()::unstable()'))
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   777
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   778
        def _clearobsoletecache(self):
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   779
            if '_obsoleteset' in vars(self):
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   780
                del self._obsoleteset
210
168ea7d200a0 obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 205
diff changeset
   781
            self._clearunstablecache()
168ea7d200a0 obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 205
diff changeset
   782
168ea7d200a0 obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 205
diff changeset
   783
        def updatebranchcache(self):
168ea7d200a0 obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 205
diff changeset
   784
            o_updatebranchcache()
168ea7d200a0 obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 205
diff changeset
   785
            self._clearunstablecache()
168ea7d200a0 obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 205
diff changeset
   786
168ea7d200a0 obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 205
diff changeset
   787
        def _clearunstablecache(self):
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   788
            if '_unstableset' in vars(self):
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   789
                del self._unstableset
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   790
            if '_suspendedset' in vars(self):
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   791
                del self._suspendedset
254
3ff969da57ef obsolete: fix error in cache invalidation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 253
diff changeset
   792
            if '_extinctset' in vars(self):
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   793
                del self._extinctset
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   794
53
0bcbf690dfca reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 52
diff changeset
   795
        def addobsolete(self, sub, obj):
0bcbf690dfca reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 52
diff changeset
   796
            """Add a relation marking that node <sub> is a new version of <obj>"""
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   797
            assert sub != obj
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   798
            if not repo[obj].phase():
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   799
                if sub is None:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   800
                    self.ui.warn(
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   801
                        _("trying to kill immutable changeset %(obj)s\n")
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   802
                        % {'obj': short(obj)})
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   803
                if sub is not None:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   804
                    self.ui.warn(
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   805
                        _("%(sub)s try to obsolete immutable changeset %(obj)s\n")
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   806
                        % {'sub': short(sub), 'obj': short(obj)})
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   807
            lock = self.lock()
53
0bcbf690dfca reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 52
diff changeset
   808
            try:
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   809
                newmarker = {
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   810
                    'subjects': (sub==nullid) and [] or [sub],
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   811
                    'object': obj,
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   812
                    'date':  util.makedate(),
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   813
                    'user': ui.username(),
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   814
                    'reason': 'unknown',
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   815
                    }
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   816
                mid = self.obsoletestore.new(newmarker)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   817
                self._clearobsoletecache()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   818
                self._turn_extinct_secret()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   819
                return mid
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   820
            finally:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   821
                lock.release()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   822
298
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   823
        def addcollapsedobsolete(self, oldnodes, newnode):
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   824
            """Mark oldnodes as collapsed into newnode."""
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   825
            # Assume oldnodes are all descendants of a single rev
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   826
            rootrevs = self.revs('roots(%ln)', oldnodes)
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   827
            assert len(rootrevs) == 1, rootrevs
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   828
            rootnode = self[rootrevs[0]].node()
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   829
            for n in oldnodes:
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   830
                if n != rootnode:
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   831
                    self.addobsolete(n, rootnode)
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   832
                self.addobsolete(newnode, n)
f597421662f7 obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents: 297
diff changeset
   833
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   834
        def _turn_extinct_secret(self):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   835
            """ensure all extinct changeset are secret"""
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   836
            self._clearobsoletecache()
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   837
            # this is mainly for safety purpose
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   838
            # both pull and push
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   839
            expobs = [c.node() for c in repo.set('extinct() - secret()')]
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   840
            phases.retractboundary(repo, 2, expobs)
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   841
37
9493ffa68633 Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 32
diff changeset
   842
        ### Disk IO
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   843
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   844
        def lock(self, *args, **kwargs):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   845
            l = olock(*args, **kwargs)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   846
            if not getattr(l.releasefn, 'obspatched', False):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   847
                oreleasefn = l.releasefn
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   848
                def releasefn(*args, **kwargs):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   849
                    if self.obsoletestore._dirty:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   850
                        writeobsolete(self)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   851
                    oreleasefn(*args, **kwargs)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   852
                releasefn.obspatched = True
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   853
                l.releasefn = releasefn
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   854
            return l
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   855
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   856
        def _readobsrels(self):
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   857
            """Read obsolete relation on disk"""
37
9493ffa68633 Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 32
diff changeset
   858
            # XXX handle lock
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   859
            try:
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   860
                f = self.opener('obsolete-relations')
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   861
                try:
70
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
   862
                    return _obsdeserialise(f)
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   863
                finally:
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   864
                    f.close()
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   865
            except IOError:
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 53
diff changeset
   866
                return {}
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   867
50
19b22ad56b32 clone support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 47
diff changeset
   868
44
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   869
        ### pull // push support
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   870
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   871
        def pull(self, remote, *args, **kwargs):
74
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   872
            """wrapper around push that push obsolete relation"""
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   873
            l = repo.lock()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   874
            try:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   875
                result = opull(remote, *args, **kwargs)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   876
                if 'obsolete' in remote.listkeys('namespaces'):
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   877
                    tmp = StringIO()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   878
                    rels = remote.listkeys('obsolete')['markers']
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   879
                    tmp.write(base64.b64decode(rels))
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   880
                    tmp.seek(0)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   881
                    repo.obsoletestore.load(tmp)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   882
                    repo.obsoletestore._dirty = True # XXX meh
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   883
                    self._clearobsoletecache()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   884
                self._turn_extinct_secret()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   885
                return result
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   886
            finally:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   887
                l.release()
44
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   888
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   889
        def push(self, remote, *args, **opts):
74
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
   890
            """wrapper around pull that pull obsolete relation"""
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   891
            self._turn_extinct_secret()
44
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   892
            result = opush(remote, *args, **opts)
56
27f9c0d0a996 [obsolete] Update pushkey code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   893
            if 'obsolete' in remote.listkeys('namespaces'):
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 53
diff changeset
   894
                tmp = StringIO()
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   895
                self.obsoletestore.save(tmp)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   896
                remote.pushkey('obsolete', 'markers', '', tmp.getvalue())
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   897
            self._turn_extinct_secret()
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 53
diff changeset
   898
44
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   899
            return result
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   900
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
   901
52
62bdc2567099 Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   902
        ### rollback support
62bdc2567099 Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   903
203
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   904
        # /!\ api change in  Hg 2.2 (97efd26eb9576f39590812ea9) /!\
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   905
        if util.safehasattr(repo, '_journalfiles'): # Hg 2.2
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   906
            def _journalfiles(self):
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   907
                return o_journalfiles() + (self.sjoin('journal.obsoletemarkers'),) 
205
7ba30bd95a88 obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 204
diff changeset
   908
7ba30bd95a88 obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 204
diff changeset
   909
            def _writejournal(self, desc):
7ba30bd95a88 obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 204
diff changeset
   910
                """wrapped version of _writejournal that save obsolete data"""
7ba30bd95a88 obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 204
diff changeset
   911
                o_writejournal(desc)
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   912
                filename = 'obsoletemarkers'
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   913
                filepath = self.sjoin(filename)
205
7ba30bd95a88 obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 204
diff changeset
   914
                if os.path.exists(filepath):
7ba30bd95a88 obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 204
diff changeset
   915
                    journalname = 'journal.' + filename
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   916
                    journalpath = self.sjoin(journalname)
205
7ba30bd95a88 obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 204
diff changeset
   917
                    util.copyfile(filepath, journalpath)
7ba30bd95a88 obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 204
diff changeset
   918
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
   919
        else: # XXX removing this bloc will break Hg 2.1 support
205
7ba30bd95a88 obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 204
diff changeset
   920
            def _writejournal(self, desc):
203
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   921
                """wrapped version of _writejournal that save obsolete data"""
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   922
                entries = list(o_writejournal(desc))
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   923
                filename = 'obsoletemarkers'
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   924
                filepath = self.sjoin(filename)
203
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   925
                if  os.path.exists(filepath):
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   926
                    journalname = 'journal.' + filename
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   927
                    journalpath = self.sjoin(journalname)
203
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   928
                    util.copyfile(filepath, journalpath)
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   929
                    entries.append(journalpath)
9799d0aa53c8 [obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 202
diff changeset
   930
                return tuple(entries)
52
62bdc2567099 Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   931
205
7ba30bd95a88 obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 204
diff changeset
   932
        def _rollback(self, dryrun, force):
202
83b7e2c62ac3 [obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 197
diff changeset
   933
            """wrapped version of _rollback that restore obsolete data"""
205
7ba30bd95a88 obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 204
diff changeset
   934
            ret = o_rollback(dryrun, force)
202
83b7e2c62ac3 [obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 197
diff changeset
   935
            if not (ret or dryrun): #rollback did not failed
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   936
                src = self.sjoin('undo.obsoletemarkers')
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   937
                dst = self.sjoin('obsoletemarkers')
202
83b7e2c62ac3 [obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 197
diff changeset
   938
                if os.path.exists(src):
83b7e2c62ac3 [obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 197
diff changeset
   939
                    util.rename(src, dst)
205
7ba30bd95a88 obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 204
diff changeset
   940
                elif os.path.exists(dst):
7ba30bd95a88 obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 204
diff changeset
   941
                    # If no state was saved because the file did not existed before.
202
83b7e2c62ac3 [obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 197
diff changeset
   942
                    os.unlink(dst)
83b7e2c62ac3 [obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 197
diff changeset
   943
                # invalidate cache
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   944
                self.__dict__.pop('obsoletestore', None)
202
83b7e2c62ac3 [obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 197
diff changeset
   945
            return ret
52
62bdc2567099 Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   946
160
24346b78cd99 mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 150
diff changeset
   947
        @storecache('00changelog.i')
114
1a64195e2b09 nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 112
diff changeset
   948
        def changelog(self):
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
   949
            # << copy pasted from mercurial source
215
0eceb5a48485 obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 214
diff changeset
   950
            c = changelog.changelog(self.sopener)
0eceb5a48485 obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 214
diff changeset
   951
            if 'HG_PENDING' in os.environ:
0eceb5a48485 obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 214
diff changeset
   952
                p = os.environ['HG_PENDING']
0eceb5a48485 obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 214
diff changeset
   953
                if p.startswith(self.root):
0eceb5a48485 obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 214
diff changeset
   954
                    c.readpending('00changelog.i.a')
0eceb5a48485 obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 214
diff changeset
   955
            # >> end of the copy paste
0eceb5a48485 obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 214
diff changeset
   956
            old = c.__dict__.pop('hiddenrevs', ())
122
c75a73209f1e Locking while writing obsolete data.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 121
diff changeset
   957
            if old:
c75a73209f1e Locking while writing obsolete data.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 121
diff changeset
   958
                ui.warn("old wasn't empty ? %r" % old)
215
0eceb5a48485 obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 214
diff changeset
   959
            def _sethidden(c, value):
114
1a64195e2b09 nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 112
diff changeset
   960
                assert not value
1a64195e2b09 nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 112
diff changeset
   961
1a64195e2b09 nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 112
diff changeset
   962
215
0eceb5a48485 obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 214
diff changeset
   963
            class hchangelog(c.__class__):
114
1a64195e2b09 nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 112
diff changeset
   964
                @util.propertycache
215
0eceb5a48485 obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 214
diff changeset
   965
                def hiddenrevs(c):
114
1a64195e2b09 nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 112
diff changeset
   966
                    shown = ['not obsolete()', '.', 'bookmark()', 'tagged()',
1a64195e2b09 nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 112
diff changeset
   967
                             'public()']
1a64195e2b09 nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 112
diff changeset
   968
                    basicquery = 'obsolete() - (::(%s))' % (' or '.join(shown))
1a64195e2b09 nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 112
diff changeset
   969
                    # !!! self is repo not changelog
1a64195e2b09 nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 112
diff changeset
   970
                    result = set(scmutil.revrange(self, [basicquery]))
1a64195e2b09 nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 112
diff changeset
   971
                    return result
215
0eceb5a48485 obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 214
diff changeset
   972
            c.__class__ = hchangelog
0eceb5a48485 obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 214
diff changeset
   973
            return c
114
1a64195e2b09 nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 112
diff changeset
   974
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   975
    repo.__class__ = obsoletingrepo
135
1a08daef8a53 obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 132
diff changeset
   976
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   977
    if False:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   978
        expobs = [c.node() for c in repo.set('extinct() - secret()')]
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   979
        if expobs: # do not lock in nothing move. locking for peanut make hgview reload on any command
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   980
            lock = repo.lock()
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   981
            try:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   982
                expobs = [c.node() for c in repo.set('extinct() - secret()')]
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   983
                phases.retractboundary(repo, 2, expobs)
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   984
            finally:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   985
                lock.release()