hgext3rd/topic/__init__.py
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
Thu, 02 Mar 2017 18:07:46 +0100
changeset 2020 143c8e4dc22d
parent 2012 dc34d5317001
child 2288 b6ea9049693d
permissions -rw-r--r--
topic: merge the topic extension in the evolve repository There is a lot of synergy between the two concepts. Topic is expected to be able to smooth multiple of evolution sharp edge. Having them both in the same repository will make this collaboration easier.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
     1
# __init__.py - topic extension
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
     2
#
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
     3
# This software may be used and distributed according to the terms of the
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
     4
# GNU General Public License version 2 or any later version.
1846
0b5b757ca812 docs: fix format of extension docstring
Matt Mackall <mpm@selenic.com>
parents: 1845
diff changeset
     5
"""support for topic branches
0b5b757ca812 docs: fix format of extension docstring
Matt Mackall <mpm@selenic.com>
parents: 1845
diff changeset
     6
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
     7
Topic branches are lightweight branches which disappear when changes are
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
     8
finalized (move to the public phase).
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
     9
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    10
Compared to bookmark, topic is reference carried by each changesets of the
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    11
series instead of just the single head revision.  Topic are quite similar to
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    12
the way named branch work, except they eventualy fade away when the changeset
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    13
becomes part of the immutable history.  Changeset can below to both a topic and
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    14
a named branch, but as long as it is mutable, its topic identity will prevail.
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    15
As a result, default destination for 'update', 'merge', etc...  will take topic
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    16
into account. When a topic is active these operations will only consider other
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    17
changesets on that topic (and, in some occurence, bare changeset on same
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    18
branch).  When no topic is active, changeset with topic will be ignored and
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    19
only bare one on the same branch will be taken in account.
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    20
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    21
There is currently two commands to be used with that extension: 'topics' and
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    22
'stack'.
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
    23
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    24
The 'hg topics' command is used to set the current topic and list existing one.
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    25
'hg topics --verbose' will list various information related to each topic.
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    26
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    27
The 'stack' will show you in formation about the stack of commit belonging to
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    28
your current topic.
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    29
2012
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    30
Topic is offering you aliases reference to changeset in your current topic
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    31
stack as 't#'. For example, 't1' refers to the root of your stack, 't2' to the
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    32
second commits, etc. The 'hg stack' command show these number.
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    33
2012
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    34
Push behavior will change a bit with topic. When pushing to a publishing
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    35
repository the changesets will turn public and the topic data on them will fade
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    36
away. The logic regarding pushing new heads will behave has before, ignore any
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    37
topic related data. When pushing to a non-publishing repository (supporting
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    38
topic), the head checking will be done taking topic data into account.
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    39
Push will complain about multiple heads on a branch if you push multiple heads
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    40
with no topic information on them (or multiple public heads). But pushing a new
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    41
topic will not requires any specific flag. However, pushing multiple heads on a
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    42
topic will be met with the usual warning.
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    43
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    44
The 'evolve' extension takes 'topic' into account. 'hg evolve --all'
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    45
will evolve all changesets in the active topic. In addition, by default. 'hg
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    46
next' and 'hg prev' will stick to the current topic.
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    47
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    48
Be aware that this extension is still an experiment, commands and other features
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    49
are likely to be change/adjusted/dropped over time as we refine the concept.
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
    50
"""
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    51
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    52
from __future__ import absolute_import
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    53
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
    54
import re
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
    55
1848
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
    56
from mercurial.i18n import _
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    57
from mercurial import (
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    58
    branchmap,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    59
    cmdutil,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    60
    commands,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    61
    context,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    62
    error,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    63
    extensions,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    64
    localrepo,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    65
    lock,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    66
    merge,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    67
    namespaces,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    68
    node,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    69
    obsolete,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    70
    patch,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    71
    phases,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    72
    util,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    73
)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
    74
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    75
from . import (
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    76
    constants,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    77
    revset as topicrevset,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    78
    destination,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    79
    stack,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    80
    topicmap,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    81
    discovery,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    82
)
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents: 1842
diff changeset
    83
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
    84
cmdtable = {}
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
    85
command = cmdutil.command(cmdtable)
1976
ebdc2a6a9a25 topic: add color for the active topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1975
diff changeset
    86
colortable = {'topic.active': 'green',
1978
e42dd4523c0d topic: list the number of troubled changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1977
diff changeset
    87
              'topic.list.troubledcount': 'red',
1979
bee7a1ef8ba8 topic: list the number of head when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1978
diff changeset
    88
              'topic.list.headcount.multiple': 'yellow',
1985
03d6b685c16a topic: list the number of 'behind' changeset when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1979
diff changeset
    89
              'topic.list.behindcount': 'cyan',
03d6b685c16a topic: list the number of 'behind' changeset when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1979
diff changeset
    90
              'topic.list.behinderror': 'red',
1976
ebdc2a6a9a25 topic: add color for the active topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1975
diff changeset
    91
              'topic.stack.index': 'yellow',
1991
ba79d23594d6 stack: reusing the index number in base when applicable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1990
diff changeset
    92
              'topic.stack.index.base': 'none dim',
1992
28fbc627b704 stack: also dim bases
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1991
diff changeset
    93
              'topic.stack.desc.base': 'none dim',
1909
36112e361ee4 stack: display the base of the stack
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1908
diff changeset
    94
              'topic.stack.state.base': 'dim',
36112e361ee4 stack: display the base of the stack
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1908
diff changeset
    95
              'topic.stack.state.clean': 'green',
1963
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
    96
              'topic.stack.index.current': 'cyan',       # random pick
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
    97
              'topic.stack.state.current': 'cyan bold',  # random pick
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
    98
              'topic.stack.desc.current': 'cyan',        # random pick
1908
dbd6d51e63f1 stack: add some default color configuration
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
    99
              'topic.stack.state.unstable': 'red',
1997
ce86f7bb4b7b stack: add some behind information
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1992
diff changeset
   100
              'topic.stack.summary.behindcount': 'cyan',
ce86f7bb4b7b stack: add some behind information
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1992
diff changeset
   101
              'topic.stack.summary.behinderror': 'red',
1998
302be26a3fd8 stack: add warning about multiple heads
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1997
diff changeset
   102
              'topic.stack.summary.headcount.multiple': 'yellow',
1908
dbd6d51e63f1 stack: add some default color configuration
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
   103
             }
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   104
1972
04ce84b7b9d1 testedwith: update to 3.9
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1971
diff changeset
   105
testedwith = '3.9'
1884
8a53f99d9061 testedwith: declare compatibility with Mercurial 3.7
Augie Fackler <raf@durin42.com>
parents: 1877
diff changeset
   106
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   107
def _contexttopic(self):
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   108
    return self.extra().get(constants.extrakey, '')
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   109
context.basectx.topic = _contexttopic
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   110
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   111
topicrev = re.compile(r'^t\d+$')
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   112
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   113
def _namemap(repo, name):
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   114
    if topicrev.match(name):
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   115
        idx = int(name[1:])
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   116
        topic = repo.currenttopic
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   117
        if not topic:
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   118
            raise error.Abort(_('cannot resolve "%s": no active topic') % name)
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   119
        revs = list(stack.getstack(repo, topic))
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   120
        try:
1958
62d5d4206840 stack: also change the indexing of the t# reference
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1952
diff changeset
   121
            r = revs[idx - 1]
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   122
        except IndexError:
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   123
            msg = _('cannot resolve "%s": topic "%s" has only %d changesets')
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   124
            raise error.Abort(msg % (name, topic, len(revs)))
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   125
        return [repo[r].node()]
2008
e3ddd696394f flake8: fix E713 style
Sean Farley <sean@farley.io>
parents: 2007
diff changeset
   126
    if name not in repo.topics:
2000
c413e7c96265 init: guard _namemap with repo.topics (issue5351)
timeless@gmail.com
parents: 1999
diff changeset
   127
        return []
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   128
    return [ctx.node() for ctx in
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   129
            repo.set('not public() and extra(topic, %s)', name)]
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   130
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   131
def _nodemap(repo, node):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   132
    ctx = repo[node]
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   133
    t = ctx.topic()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   134
    if t and ctx.phase() > phases.public:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   135
        return [t]
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   136
    return []
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   137
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1867
diff changeset
   138
def uisetup(ui):
1941
7eb737b7a902 destination: rename 'setupdest' to 'modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1939
diff changeset
   139
    destination.modsetup(ui)
1943
cd56f4d8b5a3 revset: add a ui argument to 'modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1942
diff changeset
   140
    topicrevset.modsetup(ui)
1944
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1943
diff changeset
   141
    discovery.modsetup(ui)
1952
665d6322994e uisetup: add call to 'topicmap.modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1951
diff changeset
   142
    topicmap.modsetup(ui)
1948
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
   143
    setupimportexport(ui)
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1867
diff changeset
   144
1951
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   145
    extensions.afterloaded('rebase', _fixrebase)
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   146
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   147
    entry = extensions.wrapcommand(commands.table, 'commit', commitwrap)
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   148
    entry[1].append(('t', 'topic', '',
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   149
                     _("use specified topic"), _('TOPIC')))
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   150
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   151
    extensions.wrapfunction(cmdutil, 'buildcommittext', committextwrap)
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   152
    extensions.wrapfunction(merge, 'update', mergeupdatewrap)
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   153
    cmdutil.summaryhooks.add('topic', summaryhook)
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   154
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   155
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   156
def reposetup(ui, repo):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   157
    orig = repo.__class__
1886
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   158
    if not isinstance(repo, localrepo.localrepository):
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   159
        return # this can be a peer in the ssh case (puzzling)
2007
aa3b6cfdf493 flake8: fix E301 style
Sean Farley <sean@farley.io>
parents: 2000
diff changeset
   160
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   161
    class topicrepo(repo.__class__):
1903
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
   162
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
   163
        def _restrictcapabilities(self, caps):
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
   164
            caps = super(topicrepo, self)._restrictcapabilities(caps)
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
   165
            caps.add('topics')
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
   166
            return caps
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
   167
1858
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   168
        def commit(self, *args, **kwargs):
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   169
            backup = self.ui.backupconfig('ui', 'allowemptycommit')
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   170
            try:
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   171
                if repo.currenttopic != repo['.'].topic():
1858
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   172
                    # bypass the core "nothing changed" logic
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   173
                    self.ui.setconfig('ui', 'allowemptycommit', True)
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   174
                return orig.commit(self, *args, **kwargs)
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   175
            finally:
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   176
                self.ui.restoreconfig(backup)
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   177
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   178
        def commitctx(self, ctx, error=None):
1855
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
   179
            if isinstance(ctx, context.workingcommitctx):
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
   180
                current = self.currenttopic
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
   181
                if current:
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
   182
                    ctx.extra()[constants.extrakey] = current
1862
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
   183
            if (isinstance(ctx, context.memctx) and
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
   184
                ctx.extra().get('amend_source') and
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
   185
                ctx.topic() and
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
   186
                not self.currenttopic):
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
   187
                # we are amending and need to remove a topic
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
   188
                del ctx.extra()[constants.extrakey]
1949
79c08d17a3d7 topicmap: move the 'usetopicmap' context manager into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1948
diff changeset
   189
            with topicmap.usetopicmap(self):
1889
d9b929bcc3ad topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1888
diff changeset
   190
                return orig.commitctx(self, ctx, error=error)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   191
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   192
        @property
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   193
        def topics(self):
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   194
            if self._topics is not None:
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   195
                return self._topics
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   196
            topics = set(['', self.currenttopic])
1841
72a58a5bfb62 topic: use repo.set() where we need a changectx anyway
Augie Fackler <augie@google.com>
parents: 1839
diff changeset
   197
            for c in self.set('not public()'):
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   198
                topics.add(c.topic())
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   199
            topics.remove('')
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   200
            self._topics = topics
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   201
            return topics
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   202
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   203
        @property
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   204
        def currenttopic(self):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   205
            return self.vfs.tryread('topic')
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   206
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
   207
        def branchmap(self, topic=True):
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
   208
            if not topic:
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
   209
                super(topicrepo, self).branchmap()
1949
79c08d17a3d7 topicmap: move the 'usetopicmap' context manager into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1948
diff changeset
   210
            with topicmap.usetopicmap(self):
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
   211
                branchmap.updatecache(self)
1888
dfaf0de6f4d8 topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1887
diff changeset
   212
            return self._topiccaches[self.filtername]
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
   213
1889
d9b929bcc3ad topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1888
diff changeset
   214
        def destroyed(self, *args, **kwargs):
1949
79c08d17a3d7 topicmap: move the 'usetopicmap' context manager into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1948
diff changeset
   215
            with topicmap.usetopicmap(self):
1889
d9b929bcc3ad topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1888
diff changeset
   216
                return super(topicrepo, self).destroyed(*args, **kwargs)
d9b929bcc3ad topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1888
diff changeset
   217
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   218
        def invalidatevolatilesets(self):
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   219
            # XXX we might be able to move this to something invalidated less often
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   220
            super(topicrepo, self).invalidatevolatilesets()
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   221
            self._topics = None
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
   222
            if '_topiccaches' in vars(self.unfiltered()):
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
   223
                self.unfiltered()._topiccaches.clear()
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
   224
1886
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   225
        def peer(self):
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   226
            peer = super(topicrepo, self).peer()
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   227
            if getattr(peer, '_repo', None) is not None: # localpeer
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   228
                class topicpeer(peer.__class__):
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   229
                    def branchmap(self):
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   230
                        usetopic = not self._repo.publishing()
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   231
                        return self._repo.branchmap(topic=usetopic)
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   232
                peer.__class__ = topicpeer
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   233
            return peer
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   234
1857
a506ed8ab8da topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents: 1856
diff changeset
   235
    repo.__class__ = topicrepo
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   236
    repo._topics = None
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   237
    if util.safehasattr(repo, 'names'):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   238
        repo.names.addnamespace(namespaces.namespace(
1857
a506ed8ab8da topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents: 1856
diff changeset
   239
            'topics', 'topic', namemap=_namemap, nodemap=_nodemap,
a506ed8ab8da topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents: 1856
diff changeset
   240
            listnames=lambda repo: repo.topics))
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   241
1847
9fa5b8f4e98e topics: add command summary
Matt Mackall <mpm@selenic.com>
parents: 1846
diff changeset
   242
@command('topics [TOPIC]', [
1963
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
   243
        ('', 'clear', False, 'clear active topic if any'),
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
   244
        ('', 'change', '', 'revset of existing revisions to change topic'),
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
   245
        ('l', 'list', False, 'show the stack of changeset in the topic'),
1907
95874e8fc5f2 stack: add basic formatter and label support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1904
diff changeset
   246
    ] + commands.formatteropts)
95874e8fc5f2 stack: add basic formatter and label support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1904
diff changeset
   247
def topics(ui, repo, topic='', clear=False, change=None, list=False, **opts):
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
   248
    """View current topic, set current topic, or see all topics.
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
   249
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
   250
    The --verbose version of this command display various information on the state of each topic."""
1895
c8e4c6e03957 stack: add a very first version of stack display with 'hg topic --list'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1894
diff changeset
   251
    if list:
c8e4c6e03957 stack: add a very first version of stack display with 'hg topic --list'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1894
diff changeset
   252
        if clear or change:
c8e4c6e03957 stack: add a very first version of stack display with 'hg topic --list'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1894
diff changeset
   253
            raise error.Abort(_("cannot use --clear or --change with --list"))
1990
71410fa2c253 stack: extra argument validation logic outside of showstack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1989
diff changeset
   254
        if not topic:
71410fa2c253 stack: extra argument validation logic outside of showstack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1989
diff changeset
   255
            topic = repo.currenttopic
71410fa2c253 stack: extra argument validation logic outside of showstack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1989
diff changeset
   256
        if not topic:
71410fa2c253 stack: extra argument validation logic outside of showstack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1989
diff changeset
   257
            raise error.Abort(_('no active topic to list'))
1907
95874e8fc5f2 stack: add basic formatter and label support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1904
diff changeset
   258
        return stack.showstack(ui, repo, topic, opts)
1895
c8e4c6e03957 stack: add a very first version of stack display with 'hg topic --list'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1894
diff changeset
   259
1844
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
   260
    if change:
1851
67d53e8e0c1a topic: only require obsolete support for --change
Matt Mackall <mpm@selenic.com>
parents: 1850
diff changeset
   261
        if not obsolete.isenabled(repo, obsolete.createmarkersopt):
1894
f8ee36489d3c topic: get 'Abort' from error, not 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1890
diff changeset
   262
            raise error.Abort(_('must have obsolete enabled to use --change'))
1860
b7b9e5028c2a topics: consistently use empty string instead of None
Matt Mackall <mpm@selenic.com>
parents: 1859
diff changeset
   263
        if not topic and not clear:
1894
f8ee36489d3c topic: get 'Abort' from error, not 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1890
diff changeset
   264
            raise error.Abort('changing topic requires a topic name or --clear')
1844
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
   265
        if any(not c.mutable() for c in repo.set('%r and public()', change)):
1894
f8ee36489d3c topic: get 'Abort' from error, not 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1890
diff changeset
   266
            raise error.Abort("can't change topic of a public change")
1844
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
   267
        rewrote = 0
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
   268
        needevolve = False
1856
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
   269
        l = repo.lock()
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
   270
        txn = repo.transaction('rewrite-topics')
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
   271
        try:
1918
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   272
            for c in repo.set('%r', change):
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   273
                def filectxfn(repo, ctx, path):
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   274
                    try:
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   275
                        return c[path]
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   276
                    except error.ManifestLookupError:
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   277
                        return None
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   278
                fixedextra = dict(c.extra())
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   279
                ui.debug('old node id is %s\n' % node.hex(c.node()))
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   280
                ui.debug('origextra: %r\n' % fixedextra)
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   281
                newtopic = None if clear else topic
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   282
                oldtopic = fixedextra.get(constants.extrakey, None)
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   283
                if oldtopic == newtopic:
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   284
                    continue
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   285
                if clear:
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   286
                    del fixedextra[constants.extrakey]
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   287
                else:
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   288
                    fixedextra[constants.extrakey] = topic
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   289
                if 'amend_source' in fixedextra:
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   290
                    # TODO: right now the commitctx wrapper in
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   291
                    # topicrepo overwrites the topic in extra if
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   292
                    # amend_source is set to support 'hg commit
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   293
                    # --amend'. Support for amend should be adjusted
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   294
                    # to not be so invasive.
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   295
                    del fixedextra['amend_source']
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   296
                ui.debug('changing topic of %s from %s to %s\n' % (
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   297
                    c, oldtopic, newtopic))
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   298
                ui.debug('fixedextra: %r\n' % fixedextra)
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   299
                mc = context.memctx(
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   300
                    repo, (c.p1().node(), c.p2().node()), c.description(),
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   301
                    c.files(), filectxfn,
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   302
                    user=c.user(), date=c.date(), extra=fixedextra)
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   303
                newnode = repo.commitctx(mc)
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   304
                ui.debug('new node id is %s\n' % node.hex(newnode))
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   305
                needevolve = needevolve or (len(c.children()) > 0)
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   306
                obsolete.createmarkers(repo, [(c, (repo[newnode],))])
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   307
                rewrote += 1
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
   308
            txn.close()
1856
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
   309
        except:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
   310
            try:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
   311
                txn.abort()
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
   312
            finally:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
   313
                repo.invalidate()
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
   314
            raise
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
   315
        finally:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
   316
            lock.release(txn, l)
1844
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
   317
        ui.status('changed topic on %d changes\n' % rewrote)
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
   318
        if needevolve:
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
   319
            evolvetarget = 'topic(%s)' % topic if topic else 'not topic()'
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
   320
            ui.status('please run hg evolve --rev "%s" now\n' % evolvetarget)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   321
    if clear:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   322
        if repo.vfs.exists('topic'):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   323
            repo.vfs.unlink('topic')
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   324
        return
1860
b7b9e5028c2a topics: consistently use empty string instead of None
Matt Mackall <mpm@selenic.com>
parents: 1859
diff changeset
   325
    if topic:
1971
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
   326
        with repo.wlock():
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
   327
            with repo.vfs.open('topic', 'w') as f:
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
   328
                f.write(topic)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   329
        return
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   330
    _listtopics(ui, repo, opts)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   331
1973
e97458bf53be stack: introduce and explicite command to display the stack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1972
diff changeset
   332
@command('stack [TOPIC]', [] + commands.formatteropts)
e97458bf53be stack: introduce and explicite command to display the stack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1972
diff changeset
   333
def cmdstack(ui, repo, topic='', **opts):
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
   334
    """list all changesets in a topic and other information
1973
e97458bf53be stack: introduce and explicite command to display the stack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1972
diff changeset
   335
e97458bf53be stack: introduce and explicite command to display the stack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1972
diff changeset
   336
    List the current topic by default."""
1990
71410fa2c253 stack: extra argument validation logic outside of showstack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1989
diff changeset
   337
    if not topic:
71410fa2c253 stack: extra argument validation logic outside of showstack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1989
diff changeset
   338
        topic = repo.currenttopic
71410fa2c253 stack: extra argument validation logic outside of showstack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1989
diff changeset
   339
    if not topic:
71410fa2c253 stack: extra argument validation logic outside of showstack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1989
diff changeset
   340
        raise error.Abort(_('no active topic to list'))
1973
e97458bf53be stack: introduce and explicite command to display the stack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1972
diff changeset
   341
    return stack.showstack(ui, repo, topic, opts)
e97458bf53be stack: introduce and explicite command to display the stack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1972
diff changeset
   342
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   343
def _listtopics(ui, repo, opts):
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   344
    fm = ui.formatter('bookmarks', opts)
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   345
    activetopic = repo.currenttopic
1987
d427fd97c9d5 topic: properly justify the verbose data when listing topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1985
diff changeset
   346
    namemask = '%s'
d427fd97c9d5 topic: properly justify the verbose data when listing topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1985
diff changeset
   347
    if repo.topics and ui.verbose:
d427fd97c9d5 topic: properly justify the verbose data when listing topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1985
diff changeset
   348
        maxwidth = max(len(t) for t in repo.topics)
d427fd97c9d5 topic: properly justify the verbose data when listing topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1985
diff changeset
   349
        namemask = '%%-%is' % maxwidth
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   350
    for topic in sorted(repo.topics):
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   351
        fm.startitem()
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   352
        marker = ' '
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   353
        label = 'topic'
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   354
        active = (topic == activetopic)
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   355
        if active:
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   356
            marker = '*'
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   357
            label = 'topic.active'
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   358
        if not ui.quiet:
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   359
            # registering the active data is made explicitly later
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   360
            fm.plain(' %s ' % marker, label=label)
1987
d427fd97c9d5 topic: properly justify the verbose data when listing topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1985
diff changeset
   361
        fm.write('topic', namemask, topic, label=label)
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   362
        fm.data(active=active)
1977
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1976
diff changeset
   363
        if ui.verbose:
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1976
diff changeset
   364
            # XXX we should include the data even when not verbose
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1976
diff changeset
   365
            data = stack.stackdata(repo, topic)
1987
d427fd97c9d5 topic: properly justify the verbose data when listing topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1985
diff changeset
   366
            fm.plain(' (')
1988
9a5d797d25be topic: list the branches this topic belong to when verbose
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1987
diff changeset
   367
            fm.write('branches+', 'on branch: %s',
9a5d797d25be topic: list the branches this topic belong to when verbose
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1987
diff changeset
   368
                     '+'.join(data['branches']), # XXX use list directly after 4.0 is released
9a5d797d25be topic: list the branches this topic belong to when verbose
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1987
diff changeset
   369
                     label='topic.list.branches')
9a5d797d25be topic: list the branches this topic belong to when verbose
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1987
diff changeset
   370
            fm.plain(', ')
1977
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1976
diff changeset
   371
            fm.write('changesetcount', '%d changesets', data['changesetcount'],
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1976
diff changeset
   372
                     label='topic.list.changesetcount')
1978
e42dd4523c0d topic: list the number of troubled changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1977
diff changeset
   373
            if data['troubledcount']:
e42dd4523c0d topic: list the number of troubled changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1977
diff changeset
   374
                fm.plain(', ')
e42dd4523c0d topic: list the number of troubled changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1977
diff changeset
   375
                fm.write('troubledcount', '%d troubled',
e42dd4523c0d topic: list the number of troubled changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1977
diff changeset
   376
                         data['troubledcount'],
e42dd4523c0d topic: list the number of troubled changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1977
diff changeset
   377
                         label='topic.list.troubledcount')
1979
bee7a1ef8ba8 topic: list the number of head when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1978
diff changeset
   378
            if 1 < data['headcount']:
bee7a1ef8ba8 topic: list the number of head when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1978
diff changeset
   379
                fm.plain(', ')
bee7a1ef8ba8 topic: list the number of head when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1978
diff changeset
   380
                fm.write('headcount', '%d heads',
bee7a1ef8ba8 topic: list the number of head when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1978
diff changeset
   381
                         data['headcount'],
bee7a1ef8ba8 topic: list the number of head when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1978
diff changeset
   382
                         label='topic.list.headcount.multiple')
1985
03d6b685c16a topic: list the number of 'behind' changeset when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1979
diff changeset
   383
            if 0 < data['behindcount']:
03d6b685c16a topic: list the number of 'behind' changeset when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1979
diff changeset
   384
                fm.plain(', ')
03d6b685c16a topic: list the number of 'behind' changeset when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1979
diff changeset
   385
                fm.write('behindcount', '%d behind',
03d6b685c16a topic: list the number of 'behind' changeset when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1979
diff changeset
   386
                         data['behindcount'],
03d6b685c16a topic: list the number of 'behind' changeset when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1979
diff changeset
   387
                         label='topic.list.behindcount')
03d6b685c16a topic: list the number of 'behind' changeset when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1979
diff changeset
   388
            elif -1 == data['behindcount']:
03d6b685c16a topic: list the number of 'behind' changeset when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1979
diff changeset
   389
                fm.plain(', ')
03d6b685c16a topic: list the number of 'behind' changeset when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1979
diff changeset
   390
                fm.write('behinderror', '%s',
03d6b685c16a topic: list the number of 'behind' changeset when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1979
diff changeset
   391
                         _('ambiguous destination'),
03d6b685c16a topic: list the number of 'behind' changeset when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1979
diff changeset
   392
                         label='topic.list.behinderror')
1977
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1976
diff changeset
   393
            fm.plain(')')
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   394
        fm.plain('\n')
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   395
    fm.end()
1974
20fb4195bfc4 topic: extract the code listing all topics
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1973
diff changeset
   396
1848
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
   397
def summaryhook(ui, repo):
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
   398
    t = repo.currenttopic
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
   399
    if not t:
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
   400
        return
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
   401
    # i18n: column positioning for "hg summary"
1989
cf9414f2b5cd summary: properly label the topic name in summary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1988
diff changeset
   402
    ui.write(_("topic:  %s\n") % ui.label(t, 'topic.active'))
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   403
1850
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
   404
def commitwrap(orig, ui, repo, *args, **opts):
1971
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
   405
    with repo.wlock():
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
   406
        if opts.get('topic'):
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
   407
            t = opts['topic']
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
   408
            with repo.vfs.open('topic', 'w') as f:
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
   409
                f.write(t)
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
   410
        return orig(ui, repo, *args, **opts)
1850
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
   411
1852
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
   412
def committextwrap(orig, repo, ctx, subs, extramsg):
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
   413
    ret = orig(repo, ctx, subs, extramsg)
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
   414
    t = repo.currenttopic
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
   415
    if t:
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
   416
        ret = ret.replace("\nHG: branch",
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
   417
                          "\nHG: topic '%s'\nHG: branch" % t)
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
   418
    return ret
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
   419
1877
69077c65919d topic: handle merge.update function signature change
Augie Fackler <raf@durin42.com>
parents: 1874
diff changeset
   420
def mergeupdatewrap(orig, repo, node, branchmerge, force, *args, **kwargs):
1966
e67c526c0a25 update: calculate 'partial' as core does
Sean Farley <sean@farley.io>
parents: 1963
diff changeset
   421
    matcher = kwargs.get('matcher')
e67c526c0a25 update: calculate 'partial' as core does
Sean Farley <sean@farley.io>
parents: 1963
diff changeset
   422
    partial = not (matcher is None or matcher.always())
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   423
    wlock = repo.wlock()
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   424
    try:
1877
69077c65919d topic: handle merge.update function signature change
Augie Fackler <raf@durin42.com>
parents: 1874
diff changeset
   425
        ret = orig(repo, node, branchmerge, force, *args, **kwargs)
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   426
        if not partial and not branchmerge:
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   427
            ot = repo.currenttopic
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   428
            t = ''
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   429
            pctx = repo[node]
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   430
            if pctx.phase() > phases.public:
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   431
                t = pctx.topic()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   432
            with repo.vfs.open('topic', 'w') as f:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   433
                f.write(t)
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   434
            if t and t != ot:
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   435
                repo.ui.status(_("switching to topic %s\n") % t)
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   436
        return ret
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   437
    finally:
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   438
        wlock.release()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   439
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   440
def _fixrebase(loaded):
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   441
    if not loaded:
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   442
        return
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   443
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   444
    def savetopic(ctx, extra):
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   445
        if ctx.topic():
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   446
            extra[constants.extrakey] = ctx.topic()
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   447
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   448
    def newmakeextrafn(orig, copiers):
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   449
        return orig(copiers + [savetopic])
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   450
1969
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
   451
    try:
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
   452
        rebase = extensions.find("rebase")
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
   453
        extensions.wrapfunction(rebase, '_makeextrafn', newmakeextrafn)
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
   454
    except KeyError:
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
   455
        pass
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   456
1946
72246b13bd72 patch: document the section about import/export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1945
diff changeset
   457
## preserve topic during import/export
72246b13bd72 patch: document the section about import/export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1945
diff changeset
   458
1866
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
   459
def _exporttopic(seq, ctx):
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
   460
    topic = ctx.topic()
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
   461
    if topic:
1917
ea4675c7a028 init: whitespace fixups
Sean Farley <sean@farley.io>
parents: 1916
diff changeset
   462
        return 'EXP-Topic %s' % topic
1866
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
   463
    return None
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
   464
1867
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
   465
def _importtopic(repo, patchdata, extra, opts):
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
   466
    if 'topic' in patchdata:
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
   467
        extra['topic'] = patchdata['topic']
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
   468
1948
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
   469
def setupimportexport(ui):
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
   470
    """run at ui setup time to install import/export logic"""
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
   471
    cmdutil.extraexport.append('topic')
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
   472
    cmdutil.extraexportmap['topic'] = _exporttopic
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
   473
    cmdutil.extrapreimport.append('topic')
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
   474
    cmdutil.extrapreimportmap['topic'] = _importtopic
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
   475
    patch.patchheadermap.append(('EXP-Topic', 'topic'))