hgext/states.py
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
Mon, 12 Sep 2011 23:47:06 +0200
changeset 63 f47a5f990eb2
parent 62 bd33e749dfcc
child 64 6a7dc5ca05b8
permissions -rw-r--r--
[states] add rebase support.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     1
# states.py - introduce the state concept for mercurial changeset
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     2
#
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     3
# Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     4
#                Logilab SA        <contact@logilab.fr>
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     5
#                Augie Fackler     <durin42@gmail.com>
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     6
#
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     7
# This software may be used and distributed according to the terms of the
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     8
# GNU General Public License version 2 or any later version.
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     9
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    10
'''introduce the state concept for mercurial changeset
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    11
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    12
(see http://mercurial.selenic.com/wiki/StatesPlan)
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    13
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    14
General concept
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    15
===============
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    16
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    17
This extension adds the state concept. A changeset are now in a specific state
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    18
that control they mutability and they exchange.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    19
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    20
States properties
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    21
.................
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    22
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    23
The states extension currently alter two property for changeset
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    24
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    25
:mutability:  history rewritten tool should refuse to work on immutable changeset
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    26
:sharing:     shared changeset are exchanged during pull and push. other are not
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    27
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    28
Here is a small summary of the current property of state existing state::
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    29
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    30
    ||           || mutable || shared ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    31
    || published ||         ||   x    ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    32
    || ready     ||    x    ||   x    ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    33
    || draft     ||    x    ||        ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    34
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    35
States consistency and ordering
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    36
...............................
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    37
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    38
States of changesets have to be consistent with each other. A changeset can only have ancestors of it's state (or a compatible states)
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    39
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    40
Example:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    41
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    42
    A ``published`` changeset can't have a ``draft`` parent.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    43
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    44
a state is compatible with itself and all "smaller" states. Order is as follow::
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    45
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    46
    published < ready < draft
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    47
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    48
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    49
.. note:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    50
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    51
    This section if probably far too conceptual for people. The result is just
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    52
    that: A ``published`` changeset can only have ``published`` ancestors. A
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    53
    ``ready`` changeset can only have ``published`` or ``ready`` ancestors.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    54
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    55
    Moreover There is a need for a nice word to refer to "a state smaller than another"
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    56
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    57
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    58
States details
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    59
==============
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    60
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    61
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    62
published
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    63
    Changesets in the ``published`` state are the core of the history.  They are
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    64
    changesets that you published to the world. People can expect them to always
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    65
    exist. They are changesets as you know them. **By default all changesets
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    66
    are published**
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    67
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    68
    - They are exchanged with other repositories (included in pull//push).
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    69
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    70
    - They are not mutable, extensions rewriting history should refuse to
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    71
      rewrite them.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    72
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    73
ready
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    74
    Changesets in the ``ready`` state have not yet been accepted in the
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    75
    immutable history. You can share them with others for review, testing or
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    76
    improvement. Any ``ready`` changeset can either be included in the
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    77
    published history (and become immutable) or be rewritten and never make it
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    78
    to the published history.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    79
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    80
    - They are exchanged with other repositories (included in pull//push).
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    81
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    82
    - They are mutable, extensions rewriting history accept to work on them.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    83
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    84
draft
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    85
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    86
    Changesets in the ``draft`` state are heavy work in progress you are not
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    87
    yet willing to share with others.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    88
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    89
    - They are not exchanged with other repositories. pull//push do not see them.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    90
    - They are mutable, extensions rewriting history accept to work on them.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    91
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    92
--
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    93
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    94
.. note:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    95
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    96
    The Dead states mentionned in on the wiki page are missing. There is two main reason for it:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    97
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    98
    1. The ``dead`` state has a different behaviour that requires more work to be
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
    99
       implemented.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   100
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   101
    2. I believe that the use cases of ``dead changeset`` are better covered by
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   102
       the ``obsolete`` extension.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   103
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   104
--
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   105
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   106
.. note:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   107
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   108
    I'm tempted to add a state with the same property that ``ready`` for review
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   109
    workflow.::
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   110
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   111
        ||           || mutable || shared ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   112
        || published ||         ||   x    ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   113
        || ready     ||    x    ||   x    ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   114
        || inprogress||    x    ||   x    ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   115
        || draft     ||    x    ||        ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   116
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   117
    The ``ready`` state would be for changeset that wait review of someone that
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   118
    can "publish" them.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   119
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   120
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   121
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   122
Current Feature and usage
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   123
=========================
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   124
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   125
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   126
Enabling states
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   127
...............
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   128
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   129
The extension adds a :hg:`hg states` command to display and choose which states
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   130
are used by a repository, see :hg:`hg states` for details.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   131
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   132
By default all changesets in the repository are ``published``. Other states
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   133
must be explicitly activated. Changeset in a remote repository that doesn't
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   134
support states are all seen as ``published``.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   135
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   136
.. note:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   137
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   138
    When a state is not activated, changesets in this state are handled as
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   139
    changesets of the previous state it (``draft`` are handled as ``ready``,
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   140
    ``ready`` are handled as ``published``).
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   141
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   142
TODO:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   143
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   144
- have a configuration in hgrc::
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   145
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   146
    [states]
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   147
    ready=(off|on)(-inherit)?
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   148
    <state>=(off|on)(-inherit)?
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   149
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   150
 :off:     state disabled for new repo
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   151
 :on:      state enabled  for new repo
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   152
 :inherit: if present, inherit states of source on :hg:`clone`.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   153
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   154
-  have a switch to select if changesets do change state on state activation.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   155
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   156
- display the number of changesets that change state when activating a state.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   157
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   158
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   159
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   160
State transition
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   161
................
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   162
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   163
Changeset you create locally will be in the ``draft`` state. (or any previous
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   164
state if draft isn't enabled)
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   165
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   166
There is some situation where the state of a changeset will change
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   167
automatically. Automatic movement always go in the same direction.: ``draft ->
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   168
``ready`` -> ``published``
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   169
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   170
1. When you pull or push boundary move. Common changeset that are ``published`` in
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   171
one of the two repository are set to ``published``. Same goes for ``ready`` etc
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   172
(states are evaluated from in increasing order XXX I bet no one understand this
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   173
parenthesis. Pull operation alter the local repository. push alter both local
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   174
and remote repository.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   175
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   176
.. note:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   177
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   178
    As Repository without any specific state have all their changeset
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   179
    ``published``, Pushing to such repo will ``publish`` all common changeset.
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   180
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   181
2. Tagged changeset get automatically Published. The tagging changeset is
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   182
tagged too... This doesn't apply to local tag.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   183
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   184
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   185
You can also manually change changeset state with a dedicated command for each
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   186
state. See :hg:`published`, :hg:`ready` and :hg:`draft` for details.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   187
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   188
XXX maybe we can details the general behaviour here
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   189
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   190
:hg <state> revs:                 move boundary of state so it includes revs
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   191
                                  ( revs included in ::<state>heads())
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   192
:hg --exact <state> revs:         move boundary so that revs are exactly in state
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   193
                                  <state> ( all([rev.state == <state> for rev in
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   194
                                  revs]))
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   195
:hg --exact --force <state> revs: move boundary event if it create inconsistency
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   196
                                  (with tag for example)
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   197
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   198
TODO:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   199
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   200
- implement --exact
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   201
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   202
- implement consistency check
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   203
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   204
- implement --force
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   205
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   206
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   207
Existing command change
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   208
.......................
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   209
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   210
As said in the previous section:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   211
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   212
:commit:    Create draft changeset (or the first enabled previous changeset).
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   213
:tag:       Move tagged and tagging changeset in the ``published`` state.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   214
:incoming:  Exclude ``draft`` changeset of remote repository.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   215
:outgoing:  Exclude ``draft`` changeset of local repository.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   216
:pull:      As :hg:`in`  + change state of local changeset according to remote side.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   217
:push:      As :hg:`out` + sync state of common changeset on both side
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   218
:rollback:  rollback restore states heads as before the last transaction (see bookmark)
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   219
61
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
   220
State Transition control
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
   221
.........................
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
   222
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
   223
There is currently no way to control who can alter boundary (The most notable
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
   224
usecase is about the published one).
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
   225
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
   226
This is probably needed quickly
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
   227
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
   228
XXX TODO: Proper behaviour when heads file are chmoded whould be a first step.
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
   229
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   230
Template
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   231
........
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   232
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   233
A new template keyword ``{state}`` has been added.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   234
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   235
Revset
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   236
......
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   237
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   238
    We add new ``readyheads()`` and ``publishedheads()`` revset directives. This
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   239
    returns the heads of each state **as if all of them were activated**.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   240
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   241
    XXX TODO - I would like to
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   242
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   243
    - move the current ``<state>heads()`` directives to
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   244
      _``<state>heads()``
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   245
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   246
    - add ``<state>heads()`` directives to that return the currently in used heads
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   247
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   248
    - add ``<state>()`` directives that match all node in a state.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   249
63
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   250
Other extensions
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   251
................
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   252
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   253
:Rebase:     can't rewrite unpublished changeset.
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   254
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   255
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   256
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   257
Implementation
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   258
==============
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   259
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   260
State definition
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   261
................
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   262
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   263
Conceptually:
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   264
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   265
The set of node in the states are defined by the set of the state heads. This allow
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   266
easy storage, exchange and consistency.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   267
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   268
.. note: A cache of the complete set of node that belong to a states will
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   269
         probably be need for performance.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   270
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   271
Code wise:
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   272
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   273
There is a ``state`` class that hold the state property and several useful
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   274
logic (name, revset entry etc).
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   275
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   276
All defined states are accessible thought the STATES tuple at the ROOT of the
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   277
module. Or the STATESMAP dictionary that allow to fetch a state from it's
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   278
name.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   279
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   280
You can get and edit the list head node that define a state with two methods on
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   281
repo.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   282
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   283
:stateheads(<state>):        Returns the list of heads node that define a states
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   284
:setstate(<state>, [nodes]): Move states boundary forward to include the given
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   285
                             nodes in the given states.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   286
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   287
Those methods handle ``node`` and not rev as it seems more resilient to me that
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   288
rev in a mutable world. Maybe it' would make more sens to have ``node`` store
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   289
on disk but revision in the code.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   290
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   291
Storage
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   292
.......
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   293
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   294
States related data are stored in the ``.hg/states/`` directory.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   295
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   296
The ``.hg/states/Enabled`` file list the states enabled in this
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   297
repository. This data is *not* stored in the .hg/hgrc because the .hg/hgrc
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   298
might be ignored for trust reason. As missing und with states can be pretty
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   299
annoying. (publishing unfinalized changeset, pulling draft one etc) we don't
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   300
want trust issue to interfer with enabled states information.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   301
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   302
``.hg/states/<state>-heads`` file list the nodes that define a states.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   303
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   304
_NOSHARE filtering
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   305
..................
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   306
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   307
Any changeset in a state with a _NOSHARE property will be exclude from pull,
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   308
push, clone, incoming, outgoing and bundle. It is done through three mechanism:
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   309
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   310
1. Wrapping the findcommonincoming and findcommonoutgoing code with (not very
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   311
   efficient) logic that recompute the exchanged heads.
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   312
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   313
2. Altering ``heads`` wireprotocol command to return sharead heads.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   314
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   315
3. Disabling hardlink cloning when there is _NOSHARE changeset available.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   316
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   317
Internal plumbery
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   318
-----------------
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   319
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   320
sum up of what we do:
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   321
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   322
* state are object
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   323
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   324
* repo.__class__ is extended
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   325
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   326
* discovery is wrapped up
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   327
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   328
* wire protocol is patched
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   329
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   330
* transaction and rollback mechanism are wrapped up.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   331
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   332
* XXX we write new version of the boundard whenever something happen. We need a
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   333
  smarter and faster way to do this.
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   334
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
   335
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   336
'''
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   337
import os
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   338
from functools import partial
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   339
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   340
from mercurial.i18n import _
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   341
from mercurial import cmdutil
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   342
from mercurial import scmutil
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   343
from mercurial import context
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   344
from mercurial import revset
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   345
from mercurial import templatekw
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   346
from mercurial import util
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   347
from mercurial import node
9
1f84a74df837 introduce a third state
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7
diff changeset
   348
from mercurial.node import nullid, hex, short
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   349
from mercurial import discovery
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   350
from mercurial import extensions
7
cc592295900f Add write protocol support for private.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5
diff changeset
   351
from mercurial import wireproto
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   352
from mercurial import pushkey
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   353
from mercurial import error
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   354
from mercurial.lock import release
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   355
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   356
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   357
# states property constante
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   358
_NOSHARE=2
9
1f84a74df837 introduce a third state
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7
diff changeset
   359
_MUTABLE=1
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   360
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   361
class state(object):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   362
    """State of changeset
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   363
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   364
    An utility object that handle several behaviour and containts useful code
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   365
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   366
    A state is defined by:
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   367
        - It's name
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   368
        - It's property (defined right above)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   369
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   370
        - It's next state.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   371
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   372
    XXX maybe we could stick description of the state semantic here.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   373
    """
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   374
19
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
   375
    def __init__(self, name, properties=0, next=None):
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   376
        self.name = name
19
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
   377
        self.properties = properties
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   378
        assert next is None or self < next
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   379
        self.next = next
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   380
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   381
    def __repr__(self):
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   382
        return 'state(%s)' % self.name
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   383
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   384
    def __str__(self):
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   385
        return self.name
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   386
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   387
    @util.propertycache
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   388
    def trackheads(self):
11
47ba990eff0e update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 10
diff changeset
   389
        """Do we need to track heads of changeset in this state ?
47ba990eff0e update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 10
diff changeset
   390
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   391
        We don't need to track heads for the last state as this is repo heads"""
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   392
        return self.next is not None
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   393
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   394
    def __cmp__(self, other):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   395
        """Use property to compare states.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   396
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   397
        This is a naiv approach that assume the  the next state are strictly
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   398
        more property than the one before
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   399
        # assert min(self, other).properties = self.properties & other.properties
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   400
        """
19
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
   401
        return cmp(self.properties, other.properties)
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   402
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   403
    @util.propertycache
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   404
    def _revsetheads(self):
11
47ba990eff0e update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 10
diff changeset
   405
        """function to be used by revset to finds heads of this states"""
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   406
        assert self.trackheads
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   407
        def revsetheads(repo, subset, x):
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   408
            args = revset.getargs(x, 0, 0, 'publicheads takes no arguments')
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   409
            heads = []
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   410
            for h in repo._statesheads[self]:
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   411
                try:
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   412
                    heads.append(repo.changelog.rev(h))
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   413
                except error.LookupError:
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   414
                    pass
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   415
            heads.sort()
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   416
            return heads
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   417
        return revsetheads
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   418
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   419
    @util.propertycache
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   420
    def headssymbol(self):
11
47ba990eff0e update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 10
diff changeset
   421
        """name of the revset symbols"""
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   422
        if self.trackheads:
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   423
            return "%sheads" % self.name
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   424
        else:
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   425
            return 'heads'
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   426
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   427
# Actual state definition
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   428
12
6312fc525a54 rename state related attributes
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 11
diff changeset
   429
ST2 = state('draft', _NOSHARE | _MUTABLE)
6312fc525a54 rename state related attributes
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 11
diff changeset
   430
ST1 = state('ready', _MUTABLE, next=ST2)
6312fc525a54 rename state related attributes
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 11
diff changeset
   431
ST0 = state('published', next=ST1)
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   432
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   433
# all available state
12
6312fc525a54 rename state related attributes
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 11
diff changeset
   434
STATES = (ST0, ST1, ST2)
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   435
# all available state by name
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   436
STATESMAP =dict([(st.name, st) for st in STATES])
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   437
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   438
@util.cachefunc
19
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
   439
def laststatewithout(prop):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   440
    """Find the states with the most property but <prop>
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   441
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   442
    (This function is necessary because the whole state stuff are abstracted)"""
19
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
   443
    for state in STATES:
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
   444
        if not state.properties & prop:
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
   445
            candidate = state
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
   446
        else:
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
   447
            return candidate
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
   448
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   449
# util function
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   450
#############################
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   451
def noderange(repo, revsets):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   452
    """The same as revrange but return node"""
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   453
    return map(repo.changelog.node,
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   454
               scmutil.revrange(repo, revsets))
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   455
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   456
# Patch changectx
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   457
#############################
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   458
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   459
def state(ctx):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   460
    """return the state objet associated to the context"""
27
31906bc290ff Working directory is draft.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 26
diff changeset
   461
    if ctx.node()is None:
31906bc290ff Working directory is draft.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 26
diff changeset
   462
        return STATES[-1]
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   463
    return ctx._repo.nodestate(ctx.node())
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   464
context.changectx.state = state
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   465
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   466
# improve template
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   467
#############################
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   468
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   469
def showstate(ctx, **args):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   470
    """Show the name of the state associated with the context"""
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   471
    return ctx.state()
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   472
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   473
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   474
# New commands
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   475
#############################
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   476
26
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   477
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   478
def cmdstates(ui, repo, *states, **opt):
33
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
   479
    """view and modify activated states.
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
   480
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
   481
    With no argument, list activated state.
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
   482
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
   483
    With argument, activate the state in argument.
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
   484
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
   485
    With argument plus the --off switch, deactivate the state in argument.
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
   486
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
   487
    note: published state are alway activated."""
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
   488
26
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   489
    if not states:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   490
        for st in sorted(repo._enabledstates):
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   491
            ui.write('%s\n' % st)
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   492
    else:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   493
        off = opt.get('off', False)
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   494
        for state_name in states:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   495
            for st in STATES:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   496
                if st.name == state_name:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   497
                    break
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   498
            else:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   499
                ui.write_err(_('no state named %s\n') % state_name)
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   500
                return 1
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   501
            if off and st in repo._enabledstates:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   502
                repo._enabledstates.remove(st)
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   503
            else:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   504
                repo._enabledstates.add(st)
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   505
        repo._writeenabledstates()
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   506
    return 0
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   507
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
   508
cmdtable = {'states': (cmdstates, [ ('', 'off', False, _('desactivate the state') )], '<state>')}
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   509
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   510
# automatic generation of command that set state
18
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
   511
def makecmd(state):
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
   512
    def cmdmoveheads(ui, repo, *changesets):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   513
        """set revisions in %s state
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   514
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   515
        This command also alter state of ancestors if necessary.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   516
        """ % state
18
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
   517
        revs = scmutil.revrange(repo, changesets)
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
   518
        repo.setstate(state, [repo.changelog.node(rev) for rev in revs])
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
   519
        return 0
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
   520
    return cmdmoveheads
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   521
18
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
   522
for state in STATES:
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
   523
    if state.trackheads:
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
   524
        cmdmoveheads = makecmd(state)
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
   525
        cmdtable[state.name] = (cmdmoveheads, [], '<revset>')
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   526
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   527
# Pushkey mechanism for mutable
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   528
#########################################
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   529
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   530
def pushstatesheads(repo, key, old, new):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   531
    """receive a new state for a revision via pushkey
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   532
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   533
    It only move revision from a state to a <= one
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   534
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   535
    Return True if the <key> revision exist in the repository
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   536
    Return False otherwise. (and doesn't alter any state)"""
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   537
    st = STATESMAP[new]
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   538
    w = repo.wlock()
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   539
    try:
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   540
        newhead = node.bin(key)
57
62f2fe22bd42 Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 55
diff changeset
   541
        try:
62f2fe22bd42 Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 55
diff changeset
   542
            repo[newhead]
62f2fe22bd42 Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 55
diff changeset
   543
        except error.RepoLookupError:
62f2fe22bd42 Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 55
diff changeset
   544
            return False
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   545
        repo.setstate(st, [newhead])
57
62f2fe22bd42 Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 55
diff changeset
   546
        return True
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   547
    finally:
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   548
        w.release()
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   549
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   550
def liststatesheads(repo):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   551
    """List the boundary of all states.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   552
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   553
    {"node-hex" -> "comma separated list of state",}
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   554
    """
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   555
    keys = {}
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   556
    for state in [st for st in STATES if st.trackheads]:
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   557
        for head in repo.stateheads(state):
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   558
            head = node.hex(head)
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   559
            if head in keys:
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   560
                keys[head] += ',' + state.name
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   561
            else:
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   562
                keys[head] = state.name
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   563
    return keys
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   564
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   565
pushkey.register('states-heads', pushstatesheads, liststatesheads)
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   566
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   567
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   568
# Wrap discovery
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   569
####################
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   570
def filterprivateout(orig, repo, *args,**kwargs):
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   571
    """wrapper for findcommonoutgoing that remove _NOSHARE"""
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   572
    common, heads = orig(repo, *args, **kwargs)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   573
    if getattr(repo, '_reducehead', None) is not None:
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   574
        return common, repo._reducehead(heads)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   575
def filterprivatein(orig, repo, remote, *args, **kwargs):
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   576
    """wrapper for findcommonincoming that remove _NOSHARE"""
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   577
    common, anyinc, heads = orig(repo, remote, *args, **kwargs)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   578
    if getattr(remote, '_reducehead', None) is not None:
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   579
        heads = remote._reducehead(heads)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   580
    return common, anyinc, heads
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   581
62
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   582
# states boundary IO
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   583
#####################
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   584
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   585
def _readheadsfile(repo, filename):
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   586
    """read head from the given file
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   587
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   588
    XXX move me elsewhere"""
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   589
    heads = [nullid]
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   590
    try:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   591
        f = repo.opener(filename)
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   592
        try:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   593
            heads = sorted([node.bin(n) for n in f.read().split() if n])
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   594
        finally:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   595
            f.close()
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   596
    except IOError:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   597
        pass
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   598
    return heads
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   599
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   600
def _readstatesheads(repo, undo=False):
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   601
    """read all state heads
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   602
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   603
    XXX move me elsewhere"""
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   604
    statesheads = {}
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   605
    for state in STATES:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   606
        if state.trackheads:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   607
            filemask = 'states/%s-heads'
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   608
            filename = filemask % state.name
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   609
            statesheads[state] = _readheadsfile(repo, filename)
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   610
    return statesheads
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   611
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   612
def _writeheadsfile(repo, filename, heads):
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   613
    """write given <heads> in the file with at <filename>
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   614
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   615
    XXX move me elsewhere"""
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   616
    f = repo.opener(filename, 'w', atomictemp=True)
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   617
    try:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   618
        for h in heads:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   619
            f.write(hex(h) + '\n')
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   620
        f.rename()
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   621
    finally:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   622
        f.close()
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   623
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   624
def _writestateshead(repo):
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   625
    """write all heads
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   626
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   627
    XXX move me elsewhere"""
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   628
    # XXX transaction!
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   629
    for state in STATES:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   630
        if state.trackheads:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   631
            filename = 'states/%s-heads' % state.name
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   632
            _writeheadsfile(repo, filename, repo._statesheads[state])
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   633
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   634
# WireProtocols
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   635
####################
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   636
def wireheads(repo, proto):
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   637
    """Altered head command that doesn't include _NOSHARE
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   638
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   639
    This is a write protocol command"""
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   640
    st = laststatewithout(_NOSHARE)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   641
    h = repo.stateheads(st)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   642
    return wireproto.encodelist(h) + "\n"
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   643
63
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   644
# Other extension support
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   645
#########################
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   646
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   647
def wraprebasebuildstate(orig, repo, *args, **kwargs):
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   648
   result = orig(repo, *args, **kwargs)
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   649
   if result is not None:
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   650
        revs = result[2]
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   651
        base = repo.changelog.node(min(result[2]))
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   652
        state = repo.nodestate(base)
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   653
        if not state.properties & _MUTABLE:
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   654
            raise util.Abort(_('can not rebase published changeset %s')
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   655
                             % node.short(base),
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   656
                             hint=_('see `hg help --extension states` for details'))
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   657
   return result
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   658
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   659
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   660
def uisetup(ui):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   661
    """
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   662
    * patch stuff for the _NOSHARE property
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   663
    * add template keyword
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   664
    """
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   665
    # patch discovery
2
166694e62daf hide private changeset to inc and pull.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 1
diff changeset
   666
    extensions.wrapfunction(discovery, 'findcommonoutgoing', filterprivateout)
166694e62daf hide private changeset to inc and pull.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 1
diff changeset
   667
    extensions.wrapfunction(discovery, 'findcommonincoming', filterprivatein)
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   668
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   669
    # patch wireprotocol
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   670
    wireproto.commands['heads'] = (wireheads, '')
7
cc592295900f Add write protocol support for private.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5
diff changeset
   671
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   672
    # add template keyword
17
6aa349f47e7c add templatekeyword in a proper location
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 16
diff changeset
   673
    templatekw.keywords['state'] = showstate
6aa349f47e7c add templatekeyword in a proper location
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 16
diff changeset
   674
14
f5e1055a3f68 reorder extsetup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13
diff changeset
   675
def extsetup(ui):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   676
    """Extension setup
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   677
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   678
    * add revset entry"""
14
f5e1055a3f68 reorder extsetup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13
diff changeset
   679
    for state in STATES:
f5e1055a3f68 reorder extsetup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13
diff changeset
   680
        if state.trackheads:
f5e1055a3f68 reorder extsetup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13
diff changeset
   681
            revset.symbols[state.headssymbol] = state._revsetheads
63
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   682
    try:
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   683
        rebase = extensions.find('rebase')
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   684
        if rebase:
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   685
            extensions.wrapfunction(rebase, 'buildstate', wraprebasebuildstate)
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   686
    except KeyError:
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
   687
        pass # rebase not found
14
f5e1055a3f68 reorder extsetup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13
diff changeset
   688
62
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   689
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   690
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   691
def reposetup(ui, repo):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   692
    """Repository setup
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   693
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   694
    * extend repo class with states logic"""
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   695
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   696
    if not repo.local():
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   697
        return
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   698
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   699
    ocancopy =repo.cancopy
22
93dd72d028a1 Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 21
diff changeset
   700
    opull = repo.pull
93dd72d028a1 Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 21
diff changeset
   701
    opush = repo.push
93dd72d028a1 Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 21
diff changeset
   702
    o_tag = repo._tag
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   703
    orollback = repo.rollback
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   704
    o_writejournal = repo._writejournal
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   705
    class statefulrepo(repo.__class__):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   706
        """An extension of repo class that handle state logic
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   707
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   708
        - nodestate
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   709
        - stateheads
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   710
        """
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   711
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   712
        def nodestate(self, node):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   713
            """return the state object associated to the given node"""
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   714
            rev = self.changelog.rev(node)
30
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
   715
29
52c227772dad fix nodestate computation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 28
diff changeset
   716
            for state in STATES:
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   717
                # avoid for untracked heads
13
e95e8cf7988f Get ride of dedicated heads property.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 12
diff changeset
   718
                if state.next is not None:
30
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
   719
                    ancestors = map(self.changelog.rev, self.stateheads(state))
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
   720
                    ancestors.extend(self.changelog.ancestors(*ancestors))
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
   721
                    if rev in ancestors:
29
52c227772dad fix nodestate computation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 28
diff changeset
   722
                        break
13
e95e8cf7988f Get ride of dedicated heads property.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 12
diff changeset
   723
            return state
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   724
12
6312fc525a54 rename state related attributes
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 11
diff changeset
   725
9
1f84a74df837 introduce a third state
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7
diff changeset
   726
13
e95e8cf7988f Get ride of dedicated heads property.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 12
diff changeset
   727
        def stateheads(self, state):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   728
            """Return the set of head that define the state"""
20
9983f240ac63 Smarter states heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19
diff changeset
   729
            # look for a relevant state
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   730
            while state.trackheads and state.next not in self._enabledstates:
20
9983f240ac63 Smarter states heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19
diff changeset
   731
                state = state.next
9983f240ac63 Smarter states heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19
diff changeset
   732
            # last state have no cached head.
13
e95e8cf7988f Get ride of dedicated heads property.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 12
diff changeset
   733
            if state.trackheads:
20
9983f240ac63 Smarter states heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19
diff changeset
   734
                return self._statesheads[state]
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   735
            return self.heads()
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   736
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   737
        @util.propertycache
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   738
        def _statesheads(self):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   739
            """{ state-object -> set(defining head)} mapping"""
62
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   740
            return _readstatesheads(self)
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   741
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   742
        def setstate(self, state, nodes):
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   743
            """change state of targets changeset and it's ancestors.
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   744
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   745
            Simplify the list of head."""
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   746
            assert not isinstance(nodes, basestring), repr(nodes)
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   747
            heads = self._statesheads[state]
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   748
            olds = heads[:]
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   749
            heads.extend(nodes)
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   750
            heads[:] = set(heads)
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   751
            heads.sort()
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   752
            if olds != heads:
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   753
                heads[:] = noderange(repo, ["heads(::%s())" % state.headssymbol])
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   754
                heads.sort()
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   755
            if olds != heads:
62
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
   756
                _writestateshead(self)
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   757
            if state.next is not None and state.next.trackheads:
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
   758
                self.setstate(state.next, nodes) # cascading
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   759
2
166694e62daf hide private changeset to inc and pull.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 1
diff changeset
   760
        def _reducehead(self, candidates):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   761
            """recompute a set of heads so it doesn't include _NOSHARE changeset
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   762
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   763
            This is basically a complicated method that compute
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   764
            heads(::candidates - _NOSHARE)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   765
            """
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   766
            selected = set()
19
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
   767
            st = laststatewithout(_NOSHARE)
30
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
   768
            candidates = set(map(self.changelog.rev, candidates))
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
   769
            heads = set(map(self.changelog.rev, self.stateheads(st)))
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
   770
            shareable = set(self.changelog.ancestors(*heads))
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
   771
            shareable.update(heads)
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
   772
            selected = candidates & shareable
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
   773
            unselected = candidates - shareable
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
   774
            for rev in unselected:
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
   775
                for revh in heads:
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   776
                    if self.changelog.descendant(revh, rev):
30
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
   777
                        selected.add(revh)
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
   778
            return sorted(map(self.changelog.node, selected))
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   779
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   780
        ### enable // disable logic
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   781
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   782
        @util.propertycache
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   783
        def _enabledstates(self):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   784
            """The set of state enabled in this repository"""
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   785
            return self._readenabledstates()
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   786
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   787
        def _readenabledstates(self):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   788
            """read enabled state from disk"""
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   789
            states = set()
28
0918e3b54f0b published is always enabled.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 27
diff changeset
   790
            states.add(ST0)
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   791
            mapping = dict([(st.name, st) for st in STATES])
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   792
            try:
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   793
                f = self.opener('states/Enabled')
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   794
                for line in f:
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   795
                    st =  mapping.get(line.strip())
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   796
                    if st is not None:
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   797
                        states.add(st)
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   798
            finally:
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   799
                return states
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   800
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   801
        def _writeenabledstates(self):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   802
            """read enabled state to disk"""
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   803
            f = self.opener('states/Enabled', 'w', atomictemp=True)
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   804
            try:
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   805
                for st in self._enabledstates:
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   806
                    f.write(st.name + '\n')
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   807
                f.rename()
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   808
            finally:
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   809
                f.close()
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   810
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   811
        ### local clone support
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   812
5
9445ce78a935 fix clone
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 2
diff changeset
   813
        def cancopy(self):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   814
            """deny copy if there is _NOSHARE changeset"""
19
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
   815
            st = laststatewithout(_NOSHARE)
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   816
            return ocancopy() and (self.stateheads(st) == self.heads())
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   817
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   818
        ### pull // push support
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
   819
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   820
        def pull(self, remote, *args, **kwargs):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   821
            """altered pull that also update states heads on local repo"""
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   822
            result = opull(remote, *args, **kwargs)
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   823
            remoteheads = self._pullstatesheads(remote)
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   824
            for st, heads in remoteheads.iteritems():
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   825
                self.setstate(st, heads)
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   826
            return result
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   827
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   828
        def push(self, remote, *args, **opts):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   829
            """altered push that also update states heads on local and remote"""
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   830
            result = opush(remote, *args, **opts)
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   831
            remoteheads = self._pullstatesheads(remote)
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   832
            for st, heads in remoteheads.iteritems():
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   833
                self.setstate(st, heads)
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   834
                if heads != self.stateheads(st):
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   835
                    self._pushstatesheads(remote, st,  heads)
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   836
            return result
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   837
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   838
        def _pushstatesheads(self, remote, state, remoteheads):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   839
            """push head of a given state for remote
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   840
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   841
            This handle pushing boundary that does exist on remote host
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   842
            This is done a very naive way"""
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   843
            local = set(self.stateheads(state))
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   844
            missing = local - set(remoteheads)
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   845
            while missing:
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   846
                h = missing.pop()
57
62f2fe22bd42 Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 55
diff changeset
   847
                ok = remote.pushkey('states-heads', node.hex(h), '', state.name)
62f2fe22bd42 Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 55
diff changeset
   848
                if not ok:
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
   849
                    missing.update(p.node() for p in repo[h].parents())
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   850
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   851
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   852
        def _pullstatesheads(self, remote):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   853
            """pull all remote states boundary locally
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   854
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   855
            This can only make the boundary move on a newer changeset"""
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   856
            remoteheads = {}
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   857
            self.ui.debug('checking for states-heads on remote server')
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   858
            if 'states-heads' not in remote.listkeys('namespaces'):
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   859
                self.ui.debug('states-heads not enabled on the remote server, '
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   860
                              'marking everything as published')
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   861
                remoteheads[ST0] = remote.heads()
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
   862
            else:
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   863
                self.ui.debug('server has states-heads enabled, merging lists')
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   864
                for hex, statenames in  remote.listkeys('states-heads').iteritems():
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   865
                    for stn in statenames.split(','):
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   866
                        remoteheads.setdefault(STATESMAP[stn], []).append(node.bin(hex))
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
   867
            return remoteheads
5
9445ce78a935 fix clone
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 2
diff changeset
   868
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   869
        ### Tag support
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   870
22
93dd72d028a1 Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 21
diff changeset
   871
        def _tag(self, names, node, *args, **kwargs):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   872
            """Altered version of _tag that make tag (and tagging) published"""
22
93dd72d028a1 Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 21
diff changeset
   873
            tagnode = o_tag(names, node, *args, **kwargs)
31
1fef89f56588 tag: do not publish for local tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 30
diff changeset
   874
            if tagnode is not None: # do nothing for local one
1fef89f56588 tag: do not publish for local tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 30
diff changeset
   875
                self.setstate(ST0, [node, tagnode])
22
93dd72d028a1 Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 21
diff changeset
   876
            return tagnode
93dd72d028a1 Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 21
diff changeset
   877
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   878
        ### rollback support
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   879
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   880
        def _writejournal(self, desc):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   881
            """extended _writejournal that also save states"""
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   882
            entries = list(o_writejournal(desc))
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   883
            for state in STATES:
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   884
                if state.trackheads:
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   885
                    filename = 'states/%s-heads' % state.name
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   886
                    filepath = self.join(filename)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   887
                    if  os.path.exists(filepath):
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   888
                        journalname = 'states/journal.%s-heads' % state.name
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   889
                        journalpath = self.join(journalname)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   890
                        util.copyfile(filepath, journalpath)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   891
                        entries.append(journalpath)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   892
            return tuple(entries)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   893
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   894
        def rollback(self, dryrun=False):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
   895
            """extended rollback that also restore states"""
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   896
            wlock = lock = None
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   897
            try:
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   898
                wlock = self.wlock()
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   899
                lock = self.lock()
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   900
                ret = orollback(dryrun)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   901
                if not (ret or dryrun): #rollback did not failed
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   902
                    for state in STATES:
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   903
                        if state.trackheads:
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   904
                            src  = self.join('states/undo.%s-heads') % state.name
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   905
                            dest = self.join('states/%s-heads') % state.name
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   906
                            if os.path.exists(src):
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   907
                                util.rename(src, dest)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   908
                            elif os.path.exists(dest): #unlink in any case
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   909
                                os.unlink(dest)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   910
                    self.__dict__.pop('_statesheads', None)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   911
                return ret
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   912
            finally:
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   913
                release(lock, wlock)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
   914
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   915
    repo.__class__ = statefulrepo
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
   916