hgext3rd/topic/__init__.py
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Sun, 10 Sep 2017 22:41:54 +0900
changeset 2922 66357d4d03b2
parent 2915 b3abdb3d819e
child 2923 8c2d3c474fc6
permissions -rw-r--r--
topic: centralize compatibility logic between hg versions into compat module This patch can delay loading obsutil and obsolete modules until they are actually used at "hg topics" or so, if demandimport of Mercurial is enabled.
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
2625
8f2901f4749e topics: some minute fixes to the documentation which shows up in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2624
diff changeset
    13
becomes part of the immutable history. Changeset can belong to both a topic and
2011
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
2625
8f2901f4749e topics: some minute fixes to the documentation which shows up in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2624
diff changeset
    24
The 'hg topics' command is used to set the current topic, change and list
8f2901f4749e topics: some minute fixes to the documentation which shows up in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2624
diff changeset
    25
existing one. 'hg topics --verbose' will list various information related to
8f2901f4749e topics: some minute fixes to the documentation which shows up in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2624
diff changeset
    26
each topic.
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    27
2625
8f2901f4749e topics: some minute fixes to the documentation which shows up in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2624
diff changeset
    28
The 'stack' will show you information about the stack of commit belonging to
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    29
your current topic.
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    30
2012
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    31
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
    32
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
    33
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
    34
2012
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    35
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
    36
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
    37
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
    38
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
    39
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
    40
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
    41
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
    42
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
    43
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
    44
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    45
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
    46
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
    47
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
    48
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    49
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
    50
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
    51
"""
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    52
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    53
from __future__ import absolute_import
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    54
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
    55
import re
2731
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
    56
import time
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
    57
1848
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
    58
from mercurial.i18n import _
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    59
from mercurial import (
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
    60
    bookmarks,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    61
    cmdutil,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    62
    commands,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    63
    context,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    64
    error,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    65
    extensions,
2648
d8b47d961c77 topic-change: update the working copy along when changing topic of '.'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2647
diff changeset
    66
    hg,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    67
    localrepo,
2890
1e3d97486861 topics: import lock as lockmods
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2889
diff changeset
    68
    lock as lockmod,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    69
    merge,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    70
    namespaces,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    71
    node,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    72
    obsolete,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    73
    patch,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    74
    phases,
2464
2b53a2a21bbb deprecation: fix cmdutil.command deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2428
diff changeset
    75
    registrar,
2889
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
    76
    scmutil,
2731
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
    77
    templatefilters,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    78
    util,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    79
)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
    80
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    81
from . import (
2922
66357d4d03b2 topic: centralize compatibility logic between hg versions into compat module
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
    82
    compat,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    83
    constants,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    84
    revset as topicrevset,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    85
    destination,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    86
    stack,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    87
    topicmap,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    88
    discovery,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
    89
)
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents: 1842
diff changeset
    90
2464
2b53a2a21bbb deprecation: fix cmdutil.command deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2428
diff changeset
    91
if util.safehasattr(registrar, 'command'):
2b53a2a21bbb deprecation: fix cmdutil.command deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2428
diff changeset
    92
    commandfunc = registrar.command
2b53a2a21bbb deprecation: fix cmdutil.command deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2428
diff changeset
    93
else: # compat with hg < 4.3
2b53a2a21bbb deprecation: fix cmdutil.command deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2428
diff changeset
    94
    commandfunc = cmdutil.command
2b53a2a21bbb deprecation: fix cmdutil.command deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2428
diff changeset
    95
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
    96
cmdtable = {}
2464
2b53a2a21bbb deprecation: fix cmdutil.command deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2428
diff changeset
    97
command = commandfunc(cmdtable)
1976
ebdc2a6a9a25 topic: add color for the active topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1975
diff changeset
    98
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
    99
              '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
   100
              '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
   101
              '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
   102
              '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
   103
              '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
   104
              '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
   105
              'topic.stack.desc.base': 'none dim',
2750
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2744
diff changeset
   106
              'topic.stack.shortnode.base': 'none dim',
1909
36112e361ee4 stack: display the base of the stack
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1908
diff changeset
   107
              '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
   108
              'topic.stack.state.clean': 'green',
1963
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
   109
              'topic.stack.index.current': 'cyan',       # random pick
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
   110
              'topic.stack.state.current': 'cyan bold',  # random pick
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
   111
              'topic.stack.desc.current': 'cyan',        # random pick
2750
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2744
diff changeset
   112
              'topic.stack.shortnode.current': 'cyan',   # random pick
1908
dbd6d51e63f1 stack: add some default color configuration
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
   113
              '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
   114
              'topic.stack.summary.behindcount': 'cyan',
ce86f7bb4b7b stack: add some behind information
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1992
diff changeset
   115
              '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
   116
              'topic.stack.summary.headcount.multiple': 'yellow',
2340
e6d3b83b306b topic: configure some default color for topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2339
diff changeset
   117
              # default color to help log output and thg
e6d3b83b306b topic: configure some default color for topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2339
diff changeset
   118
              # (first pick I could think off, update as needed
e6d3b83b306b topic: configure some default color for topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2339
diff changeset
   119
              'log.topic': 'green_background',
e6d3b83b306b topic: configure some default color for topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2339
diff changeset
   120
              'topic.active': 'green',
1908
dbd6d51e63f1 stack: add some default color configuration
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
   121
             }
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   122
2831
eda8eb561134 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2816 2821
diff changeset
   123
__version__ = '0.3.0.dev'
2705
a7b7471b4bed topic: update extensions metadata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2691
diff changeset
   124
testedwith = '4.0.2 4.1.3 4.2.1'
a7b7471b4bed topic: update extensions metadata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2691
diff changeset
   125
minimumhgversion = '4.0'
a7b7471b4bed topic: update extensions metadata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2691
diff changeset
   126
buglink = 'https://bz.mercurial-scm.org/'
1884
8a53f99d9061 testedwith: declare compatibility with Mercurial 3.7
Augie Fackler <raf@durin42.com>
parents: 1877
diff changeset
   127
2656
4a148ca3e80d topic: update the changectx method to respect phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2655
diff changeset
   128
def _contexttopic(self, force=False):
4a148ca3e80d topic: update the changectx method to respect phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2655
diff changeset
   129
    if not (force or self.mutable()):
4a148ca3e80d topic: update the changectx method to respect phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2655
diff changeset
   130
        return ''
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   131
    return self.extra().get(constants.extrakey, '')
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   132
context.basectx.topic = _contexttopic
2744
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   133
def _contexttopicidx(self):
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   134
    topic = self.topic()
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   135
    if not topic:
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   136
        # XXX we might want to include t0 here,
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   137
        # however t0 is related to  'currenttopic' which has no place here.
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   138
        return None
2915
b3abdb3d819e stack: replace 'getstack' with direct call to 'stack'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2912
diff changeset
   139
    revlist = stack.stack(self._repo, topic=topic)
2744
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   140
    try:
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   141
        return revlist.index(self.rev())
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   142
    except IndexError:
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   143
        # Lets move to the last ctx of the current topic
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   144
        return None
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   145
context.basectx.topicidx = _contexttopicidx
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   146
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   147
topicrev = re.compile(r'^t\d+$')
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   148
branchrev = re.compile(r'^b\d+$')
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   149
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   150
def _namemap(repo, name):
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   151
    revs = None
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   152
    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
   153
        idx = int(name[1:])
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   154
        ttype = 'topic'
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   155
        tname = topic = repo.currenttopic
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   156
        if not tname:
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   157
            raise error.Abort(_('cannot resolve "%s": no active topic') % name)
2915
b3abdb3d819e stack: replace 'getstack' with direct call to 'stack'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2912
diff changeset
   158
        revs = list(stack.stack(repo, topic=topic))
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   159
    elif branchrev.match(name):
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   160
        ttype = 'branch'
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   161
        idx = int(name[1:])
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   162
        tname = branch = repo[None].branch()
2915
b3abdb3d819e stack: replace 'getstack' with direct call to 'stack'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2912
diff changeset
   163
        revs = list(stack.stack(repo, branch=branch))
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   164
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   165
    if revs is not None:
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   166
        try:
2712
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2711
diff changeset
   167
            r = revs[idx]
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   168
        except IndexError:
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   169
            msg = _('cannot resolve "%s": %s "%s" has only %d changesets')
2712
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2711
diff changeset
   170
            raise error.Abort(msg % (name, ttype, tname, len(revs) - 1))
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2711
diff changeset
   171
        # b0 or t0 can be None
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2711
diff changeset
   172
        if r == -1 and idx == 0:
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2711
diff changeset
   173
            msg = _('the %s "%s" has no %s')
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2711
diff changeset
   174
            raise error.Abort(msg % (ttype, tname, name))
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   175
        return [repo[r].node()]
2008
e3ddd696394f flake8: fix E713 style
Sean Farley <sean@farley.io>
parents: 2007
diff changeset
   176
    if name not in repo.topics:
2000
c413e7c96265 init: guard _namemap with repo.topics (issue5351)
timeless@gmail.com
parents: 1999
diff changeset
   177
        return []
2657
58719183d383 topic: improve the revset used to return name->nodes mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2656
diff changeset
   178
    node = repo.changelog.node
58719183d383 topic: improve the revset used to return name->nodes mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2656
diff changeset
   179
    return [node(rev) for rev in repo.revs('topic(%s)', name)]
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   180
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   181
def _nodemap(repo, node):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   182
    ctx = repo[node]
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   183
    t = ctx.topic()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   184
    if t and ctx.phase() > phases.public:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   185
        return [t]
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   186
    return []
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   187
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1867
diff changeset
   188
def uisetup(ui):
1941
7eb737b7a902 destination: rename 'setupdest' to 'modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1939
diff changeset
   189
    destination.modsetup(ui)
1943
cd56f4d8b5a3 revset: add a ui argument to 'modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1942
diff changeset
   190
    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
   191
    discovery.modsetup(ui)
1952
665d6322994e uisetup: add call to 'topicmap.modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1951
diff changeset
   192
    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
   193
    setupimportexport(ui)
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1867
diff changeset
   194
1951
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   195
    extensions.afterloaded('rebase', _fixrebase)
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   196
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   197
    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
   198
    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
   199
                     _("use specified topic"), _('TOPIC')))
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   200
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   201
    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
   202
    extensions.wrapfunction(merge, 'update', mergeupdatewrap)
2711
8c938e9af113 topics: wrap the update function to check if either t0 or b0 is passed as rev
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2709
diff changeset
   203
    # We need to check whether t0 or b0 is passed to override the default update
8c938e9af113 topics: wrap the update function to check if either t0 or b0 is passed as rev
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2709
diff changeset
   204
    # behaviour of changing topic and I can't find a better way
8c938e9af113 topics: wrap the update function to check if either t0 or b0 is passed as rev
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2709
diff changeset
   205
    # to do that as scmutil.revsingle returns the rev number and hence we can't
8c938e9af113 topics: wrap the update function to check if either t0 or b0 is passed as rev
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2709
diff changeset
   206
    # plug into logic for this into mergemod.update().
8c938e9af113 topics: wrap the update function to check if either t0 or b0 is passed as rev
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2709
diff changeset
   207
    extensions.wrapcommand(commands.table, 'update', checkt0)
2667
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   208
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   209
    try:
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   210
        evolve = extensions.find('evolve')
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2750
diff changeset
   211
        extensions.wrapfunction(evolve.rewriteutil, "presplitupdate",
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2750
diff changeset
   212
                                presplitupdatetopic)
2667
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   213
    except (KeyError, AttributeError):
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   214
        pass
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   215
1951
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   216
    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
   217
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   218
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   219
def reposetup(ui, repo):
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
   220
    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
   221
        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
   222
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   223
    repo = repo.unfiltered()
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   224
2339
f641cccbd119 topic: automatically configure thg to display topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2288
diff changeset
   225
    if repo.ui.config('experimental', 'thg.displaynames', None) is None:
f641cccbd119 topic: automatically configure thg to display topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2288
diff changeset
   226
        repo.ui.setconfig('experimental', 'thg.displaynames', 'topics',
f641cccbd119 topic: automatically configure thg to display topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2288
diff changeset
   227
                          source='topic-extension')
f641cccbd119 topic: automatically configure thg to display topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2288
diff changeset
   228
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   229
    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
   230
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
   231
        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
   232
            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
   233
            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
   234
            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
   235
1858
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   236
        def commit(self, *args, **kwargs):
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   237
            backup = self.ui.backupconfig('ui', 'allowemptycommit')
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   238
            try:
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   239
                if repo.currenttopic != repo['.'].topic():
1858
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   240
                    # bypass the core "nothing changed" logic
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   241
                    self.ui.setconfig('ui', 'allowemptycommit', True)
2288
b6ea9049693d topic: directly use "super" call
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2012
diff changeset
   242
                return super(topicrepo, self).commit(*args, **kwargs)
1858
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   243
            finally:
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   244
                self.ui.restoreconfig(backup)
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   245
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   246
        def commitctx(self, ctx, error=None):
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   247
            topicfilter = topicmap.topicfilter(self.filtername)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   248
            if topicfilter != self.filtername:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   249
                other = repo.filtered(topicmap.topicfilter(repo.filtername))
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   250
                other.commitctx(ctx, error=error)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   251
1855
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
   252
            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
   253
                current = self.currenttopic
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
   254
                if current:
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
   255
                    ctx.extra()[constants.extrakey] = current
1862
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
   256
            if (isinstance(ctx, context.memctx) and
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
   257
                ctx.extra().get('amend_source') and
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
   258
                ctx.topic() and
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
   259
                not self.currenttopic):
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
   260
                # 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
   261
                del ctx.extra()[constants.extrakey]
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   262
            return super(topicrepo, self).commitctx(ctx, error=error)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   263
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   264
        @property
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   265
        def topics(self):
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   266
            if self._topics is not None:
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   267
                return self._topics
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   268
            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
   269
            for c in self.set('not public()'):
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   270
                topics.add(c.topic())
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   271
            topics.remove('')
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   272
            self._topics = topics
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   273
            return topics
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   274
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   275
        @property
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   276
        def currenttopic(self):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   277
            return self.vfs.tryread('topic')
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   278
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   279
        # overwritten at the instance level by topicmap.py
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   280
        _autobranchmaptopic = True
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
   281
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   282
        def branchmap(self, topic=None):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   283
            if topic is None:
2655
417490bdf28a topic: avoid crash when topic is loaded but not enabled for a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2653
diff changeset
   284
                topic = getattr(repo, '_autobranchmaptopic', False)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   285
            topicfilter = topicmap.topicfilter(self.filtername)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   286
            if not topic or topicfilter == self.filtername:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   287
                return super(topicrepo, self).branchmap()
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   288
            return self.filtered(topicfilter).branchmap()
1889
d9b929bcc3ad topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1888
diff changeset
   289
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   290
        def invalidatevolatilesets(self):
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   291
            # 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
   292
            super(topicrepo, self).invalidatevolatilesets()
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   293
            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
   294
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
   295
        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
   296
            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
   297
            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
   298
                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
   299
                    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
   300
                        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
   301
                        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
   302
                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
   303
            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
   304
1857
a506ed8ab8da topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents: 1856
diff changeset
   305
    repo.__class__ = topicrepo
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   306
    repo._topics = None
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   307
    if util.safehasattr(repo, 'names'):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   308
        repo.names.addnamespace(namespaces.namespace(
1857
a506ed8ab8da topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents: 1856
diff changeset
   309
            'topics', 'topic', namemap=_namemap, nodemap=_nodemap,
a506ed8ab8da topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents: 1856
diff changeset
   310
            listnames=lambda repo: repo.topics))
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   311
2805
a789b9d5b60c topic: make command names valid as expected, even if ui.strict=true
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2795
diff changeset
   312
@command('topics', [
1963
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
   313
        ('', 'clear', False, 'clear active topic if any'),
2898
3dfc88c06378 topic: support --rev argument and properly process then as user input
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2897
diff changeset
   314
        ('r', 'rev', [], 'revset of existing revisions', _('REV')),
1963
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
   315
        ('l', 'list', False, 'show the stack of changeset in the topic'),
2866
736ab58641f0 topics: add a missing trailing comma on list of flag
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2850
diff changeset
   316
        ('', 'age', False, 'show when you last touched the topics'),
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   317
        ('', 'current', None, 'display the current topic only'),
2805
a789b9d5b60c topic: make command names valid as expected, even if ui.strict=true
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2795
diff changeset
   318
    ] + commands.formatteropts,
a789b9d5b60c topic: make command names valid as expected, even if ui.strict=true
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2795
diff changeset
   319
    _('hg topics [TOPIC]'))
2889
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
   320
def topics(ui, repo, topic=None, clear=False, rev=None, list=False, **opts):
2717
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   321
    """View current topic, set current topic, change topic for a set of revisions, or see all topics.
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   322
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   323
    Clear topic on existing topiced revisions:
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   324
        `hg topic --rev <related revset> --clear`
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   325
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   326
    Change topic on some revisions:
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   327
        `hg topic <newtopicname> --rev <related revset>`
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   328
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   329
    Clear current topic:
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   330
        `hg topic --clear`
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   331
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   332
    Set current topic:
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   333
        `hg topic <topicname>`
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   334
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   335
    List of topics:
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   336
        `hg topics`
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   337
2731
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   338
    List of topics with their last touched time sorted according to it:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   339
        `hg topic --age`
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   340
2717
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   341
    The active topic (if any) will be prepended with a "*".
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
   342
2869
b629874ccaac topics: allow use a --current when setting a topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2868
diff changeset
   343
    The `--current` flag helps to take active topic into account. For
b629874ccaac topics: allow use a --current when setting a topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2868
diff changeset
   344
    example, if you want to set the topic on all the draft changesets to the
b629874ccaac topics: allow use a --current when setting a topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2868
diff changeset
   345
    active topic, you can do:
b629874ccaac topics: allow use a --current when setting a topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2868
diff changeset
   346
        `hg topic -r "draft()" --current`
b629874ccaac topics: allow use a --current when setting a topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2868
diff changeset
   347
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
   348
    The --verbose version of this command display various information on the state of each topic."""
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   349
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   350
    current = opts.get('current')
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   351
    if current and topic:
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   352
        raise error.Abort(_("cannot use --current when setting a topic"))
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   353
    if current and clear:
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   354
        raise error.Abort(_("cannot use --current and --clear"))
2868
e46b68547017 topic: make --clear + topicname invalid
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2867
diff changeset
   355
    if clear and topic:
e46b68547017 topic: make --clear + topicname invalid
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2867
diff changeset
   356
        raise error.Abort(_("cannot use --clear when setting a topic"))
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   357
2898
3dfc88c06378 topic: support --rev argument and properly process then as user input
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2897
diff changeset
   358
    touchedrevs = set()
3dfc88c06378 topic: support --rev argument and properly process then as user input
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2897
diff changeset
   359
    if rev:
3dfc88c06378 topic: support --rev argument and properly process then as user input
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2897
diff changeset
   360
        touchedrevs = scmutil.revrange(repo, rev)
3dfc88c06378 topic: support --rev argument and properly process then as user input
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2897
diff changeset
   361
2889
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
   362
    if topic:
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
   363
        topic = topic.strip()
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
   364
        if not topic:
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
   365
            raise error.Abort(_("topic name cannot consist entirely of whitespaces"))
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
   366
        # Have some restrictions on the topic name just like bookmark name
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
   367
        scmutil.checknewlabel(repo, topic, 'topic')
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
   368
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
   369
    if list:
2643
a9ca94defc29 topics: rename '--change' flag to '--rev' flag
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2642
diff changeset
   370
        if clear or rev:
a9ca94defc29 topics: rename '--change' flag to '--rev' flag
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2642
diff changeset
   371
            raise error.Abort(_("cannot use --clear or --rev 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
   372
        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
   373
            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
   374
        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
   375
            raise error.Abort(_('no active topic to list'))
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   376
        return stack.showstack(ui, repo, topic=topic, opts=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
   377
2898
3dfc88c06378 topic: support --rev argument and properly process then as user input
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2897
diff changeset
   378
    if touchedrevs:
1851
67d53e8e0c1a topic: only require obsolete support for --change
Matt Mackall <mpm@selenic.com>
parents: 1850
diff changeset
   379
        if not obsolete.isenabled(repo, obsolete.createmarkersopt):
2643
a9ca94defc29 topics: rename '--change' flag to '--rev' flag
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2642
diff changeset
   380
            raise error.Abort(_('must have obsolete enabled to change topics'))
2645
2e3f63f4a519 topic: further simplify the clear logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2644
diff changeset
   381
        if clear:
2e3f63f4a519 topic: further simplify the clear logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2644
diff changeset
   382
            topic = None
2869
b629874ccaac topics: allow use a --current when setting a topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2868
diff changeset
   383
        elif opts.get('current'):
b629874ccaac topics: allow use a --current when setting a topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2868
diff changeset
   384
            topic = repo.currenttopic
2645
2e3f63f4a519 topic: further simplify the clear logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2644
diff changeset
   385
        elif not topic:
1894
f8ee36489d3c topic: get 'Abort' from error, not 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1890
diff changeset
   386
            raise error.Abort('changing topic requires a topic name or --clear')
2898
3dfc88c06378 topic: support --rev argument and properly process then as user input
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2897
diff changeset
   387
        if repo.revs('%ld and public()', touchedrevs):
1894
f8ee36489d3c topic: get 'Abort' from error, not 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1890
diff changeset
   388
            raise error.Abort("can't change topic of a public change")
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   389
        wl = l = txn = None
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   390
        try:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   391
            wl = repo.wlock()
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   392
            l = repo.lock()
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   393
            txn = repo.transaction('rewrite-topics')
2898
3dfc88c06378 topic: support --rev argument and properly process then as user input
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2897
diff changeset
   394
            rewrote = _changetopics(ui, repo, touchedrevs, topic)
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   395
            txn.close()
2897
bd04a614b866 topic: move a status message in the right scope
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2890
diff changeset
   396
            ui.status('changed topic on %d changes\n' % rewrote)
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   397
        finally:
2890
1e3d97486861 topics: import lock as lockmods
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2889
diff changeset
   398
            lockmod.release(txn, l, wl)
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   399
            repo.invalidate()
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   400
        return
2664
ed6fb5f20b24 topics: return early so that other if conditions don't get execute (issue5600)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2662
diff changeset
   401
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   402
    if clear:
2662
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   403
        return _changecurrenttopic(repo, None)
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   404
1860
b7b9e5028c2a topics: consistently use empty string instead of None
Matt Mackall <mpm@selenic.com>
parents: 1859
diff changeset
   405
    if topic:
2662
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   406
        return _changecurrenttopic(repo, topic)
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   407
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   408
    # `hg topic --current`
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   409
    ret = 0
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   410
    if current and not repo.currenttopic:
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   411
        ui.write_err(_('no active topic\n'))
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   412
        ret = 1
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   413
    elif current:
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   414
        fm = ui.formatter('topic', opts)
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   415
        namemask = '%s\n'
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   416
        label = 'topic.active'
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   417
        fm.startitem()
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   418
        fm.write('topic', namemask, repo.currenttopic, label=label)
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   419
        fm.end()
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   420
    else:
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   421
        _listtopics(ui, repo, opts)
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   422
    return ret
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   423
2805
a789b9d5b60c topic: make command names valid as expected, even if ui.strict=true
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2795
diff changeset
   424
@command('stack', [
a789b9d5b60c topic: make command names valid as expected, even if ui.strict=true
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2795
diff changeset
   425
    ] + commands.formatteropts,
a789b9d5b60c topic: make command names valid as expected, even if ui.strict=true
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2795
diff changeset
   426
    _('hg stack [TOPIC]'))
1973
e97458bf53be stack: introduce and explicite command to display the stack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1972
diff changeset
   427
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
   428
    """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
   429
2750
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2744
diff changeset
   430
    List the current topic by default.
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2744
diff changeset
   431
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2744
diff changeset
   432
    The --verbose version shows short nodes for the commits also.
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2744
diff changeset
   433
    """
1990
71410fa2c253 stack: extra argument validation logic outside of showstack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1989
diff changeset
   434
    if not topic:
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   435
        topic = None
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   436
    branch = None
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   437
    if topic is None and repo.currenttopic:
1990
71410fa2c253 stack: extra argument validation logic outside of showstack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1989
diff changeset
   438
        topic = repo.currenttopic
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   439
    if topic is None:
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   440
        branch = repo[None].branch()
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   441
    return stack.showstack(ui, repo, branch=branch, topic=topic, opts=opts)
1973
e97458bf53be stack: introduce and explicite command to display the stack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1972
diff changeset
   442
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   443
@command('debugcb|debugconvertbookmark', [
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   444
        ('b', 'bookmark', '', _('bookmark to convert to topic')),
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   445
        ('', 'all', None, _('convert all bookmarks to topics')),
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   446
    ],
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   447
    _('[-b BOOKMARK] [--all]'))
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   448
def debugconvertbookmark(ui, repo, **opts):
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   449
    """Converts a bookmark to a topic with the same name.
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   450
    """
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   451
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   452
    bookmark = opts.get('bookmark')
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   453
    convertall = opts.get('all')
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   454
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   455
    if convertall and bookmark:
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   456
        raise error.Abort(_("cannot use '--all' and '-b' together"))
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   457
    if not (convertall or bookmark):
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   458
        raise error.Abort(_("you must specify either '--all' or '-b'"))
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   459
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   460
    bmstore = repo._bookmarks
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   461
2900
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   462
    nodetobook = {}
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   463
    for book, revnode in bmstore.iteritems():
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   464
        if nodetobook.get(revnode):
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   465
            nodetobook[revnode].append(book)
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   466
        else:
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   467
            nodetobook[revnode] = [book]
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   468
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   469
    # a list of nodes which we have skipped so that we don't print the skip
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   470
    # warning repeatedly
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   471
    skipped = []
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   472
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   473
    actions = {}
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   474
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   475
    lock = wlock = tr = None
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   476
    try:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   477
        wlock = repo.wlock()
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   478
        lock = repo.lock()
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   479
        if bookmark:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   480
            try:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   481
                node = bmstore[bookmark]
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   482
            except KeyError:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   483
                raise error.Abort(_("no such bookmark exists: '%s'") % bookmark)
2900
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   484
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   485
            revnum = repo[node].rev()
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   486
            if len(nodetobook[node]) > 1:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   487
                ui.status(_("skipping revision '%d' as it has multiple bookmarks "
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   488
                          "on it\n") % revnum)
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   489
                return
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   490
            targetrevs = _findconvertbmarktopic(repo, bookmark)
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   491
            if targetrevs:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   492
                actions[(bookmark, revnum)] = targetrevs
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   493
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   494
        elif convertall:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   495
            for bmark, revnode in sorted(bmstore.iteritems()):
2900
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   496
                revnum = repo[revnode].rev()
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   497
                if revnum in skipped:
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   498
                    continue
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   499
                if len(nodetobook[revnode]) > 1:
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   500
                    ui.status(_("skipping '%d' as it has multiple bookmarks on"
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   501
                              " it\n") % revnum)
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   502
                    skipped.append(revnum)
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   503
                    continue
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   504
                if bmark == '@':
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   505
                    continue
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   506
                targetrevs = _findconvertbmarktopic(repo, bmark)
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   507
                if targetrevs:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   508
                    actions[(bmark, revnum)] = targetrevs
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   509
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   510
        if actions:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   511
            try:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   512
                tr = repo.transaction('debugconvertbookmark')
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   513
                for ((bmark, revnum), targetrevs) in sorted(actions.iteritems()):
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   514
                    _applyconvertbmarktopic(ui, repo, targetrevs, revnum, bmark, tr)
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   515
                tr.close()
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   516
            finally:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   517
                tr.release()
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   518
    finally:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   519
        lockmod.release(lock, wlock)
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   520
2906
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
   521
# inspired from mercurial.repair.stripbmrevset
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
   522
CONVERTBOOKREVSET = """
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
   523
not public() and (
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
   524
    ancestors(bookmark(%s))
2909
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   525
    and not ancestors(
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   526
        (
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   527
            (head() and not bookmark(%s))
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   528
            or (bookmark() - bookmark(%s))
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   529
        ) - (
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   530
            descendants(bookmark(%s))
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   531
            - bookmark(%s)
2906
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
   532
        )
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
   533
    )
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
   534
)
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
   535
"""
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
   536
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   537
def _findconvertbmarktopic(repo, bmark):
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   538
    """find revisions unambigiously defined by a bookmark
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   539
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   540
    find all changesets under the bookmark and under that bookmark only.
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   541
    """
2909
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   542
    return repo.revs(CONVERTBOOKREVSET, bmark, bmark, bmark, bmark, bmark)
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   543
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   544
def _applyconvertbmarktopic(ui, repo, revs, old, bmark, tr):
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   545
    """apply bookmark convertion to topic
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   546
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   547
    Sets a topic as same as bname to all the changesets under the bookmark
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   548
    and delete the bookmark, if topic is set to any changeset
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   549
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   550
    old is the revision on which bookmark bmark is and tr is transaction object.
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   551
    """
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   552
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   553
    rewrote = _changetopics(ui, repo, revs, bmark)
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   554
    # We didn't changed topic to any changesets because the revset
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   555
    # returned an empty set of revisions, so let's skip deleting the
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   556
    # bookmark corresponding to which we didn't put a topic on any
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   557
    # changeset
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   558
    if rewrote == 0:
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   559
        return
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   560
    ui.status(_('changed topic to "%s" on %d revisions\n') % (bmark,
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   561
              rewrote))
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   562
    ui.debug('removing bookmark "%s" from "%d"' % (bmark, old))
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   563
    bookmarks.delete(repo, tr, [bmark])
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   564
2662
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   565
def _changecurrenttopic(repo, newtopic):
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   566
    """changes the current topic."""
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   567
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   568
    if newtopic:
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   569
        with repo.wlock():
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   570
            with repo.vfs.open('topic', 'w') as f:
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   571
                f.write(newtopic)
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   572
    else:
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   573
        if repo.vfs.exists('topic'):
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   574
            repo.vfs.unlink('topic')
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   575
2898
3dfc88c06378 topic: support --rev argument and properly process then as user input
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2897
diff changeset
   576
def _changetopics(ui, repo, revs, newtopic):
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   577
    """ Changes topic to newtopic of all the revisions in the revset and return
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   578
    the count of revisions whose topic has been changed.
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   579
    """
2642
92e882a82aaf topics: factor out the logic to change topic in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2625
diff changeset
   580
    rewrote = 0
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   581
    p1 = None
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   582
    p2 = None
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   583
    successors = {}
2898
3dfc88c06378 topic: support --rev argument and properly process then as user input
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2897
diff changeset
   584
    for r in revs:
3dfc88c06378 topic: support --rev argument and properly process then as user input
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2897
diff changeset
   585
        c = repo[r]
3dfc88c06378 topic: support --rev argument and properly process then as user input
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2897
diff changeset
   586
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   587
        def filectxfn(repo, ctx, path):
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   588
            try:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   589
                return c[path]
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   590
            except error.ManifestLookupError:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   591
                return None
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   592
        fixedextra = dict(c.extra())
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   593
        ui.debug('old node id is %s\n' % node.hex(c.node()))
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   594
        ui.debug('origextra: %r\n' % fixedextra)
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   595
        oldtopic = fixedextra.get(constants.extrakey, None)
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   596
        if oldtopic == newtopic:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   597
            continue
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   598
        if newtopic is None:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   599
            del fixedextra[constants.extrakey]
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   600
        else:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   601
            fixedextra[constants.extrakey] = newtopic
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   602
        fixedextra[constants.changekey] = c.hex()
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   603
        if 'amend_source' in fixedextra:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   604
            # TODO: right now the commitctx wrapper in
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   605
            # topicrepo overwrites the topic in extra if
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   606
            # amend_source is set to support 'hg commit
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   607
            # --amend'. Support for amend should be adjusted
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   608
            # to not be so invasive.
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   609
            del fixedextra['amend_source']
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   610
        ui.debug('changing topic of %s from %s to %s\n' % (
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   611
            c, oldtopic, newtopic))
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   612
        ui.debug('fixedextra: %r\n' % fixedextra)
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   613
        # While changing topic of set of linear commits, make sure that
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   614
        # we base our commits on new parent rather than old parent which
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   615
        # was obsoleted while changing the topic
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   616
        p1 = c.p1().node()
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   617
        p2 = c.p2().node()
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   618
        if p1 in successors:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   619
            p1 = successors[p1]
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   620
        if p2 in successors:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   621
            p2 = successors[p2]
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   622
        mc = context.memctx(
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   623
            repo, (p1, p2), c.description(),
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   624
            c.files(), filectxfn,
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   625
            user=c.user(), date=c.date(), extra=fixedextra)
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   626
        newnode = repo.commitctx(mc)
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   627
        successors[c.node()] = newnode
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   628
        ui.debug('new node id is %s\n' % node.hex(newnode))
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   629
        obsolete.createmarkers(repo, [(c, (repo[newnode],))])
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   630
        rewrote += 1
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   631
    # move the working copy too
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   632
    wctx = repo[None]
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   633
    # in-progress merge is a bit too complex for now.
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   634
    if len(wctx.parents()) == 1:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   635
        newid = successors.get(wctx.p1().node())
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   636
        if newid is not None:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   637
            hg.update(repo, newid, quietempty=True)
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   638
    return rewrote
2642
92e882a82aaf topics: factor out the logic to change topic in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2625
diff changeset
   639
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   640
def _listtopics(ui, repo, opts):
2677
8cdee1b9ee92 topics: pass 'topics' to ui.formatter instead of 'bookmarks'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2669
diff changeset
   641
    fm = ui.formatter('topics', opts)
2731
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   642
    showlast = opts.get('age')
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   643
    if showlast:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   644
        # we have a new function as plugging logic into existing function is
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   645
        # pretty much difficult
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   646
        return _showlasttouched(repo, fm, opts)
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   647
    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
   648
    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
   649
    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
   650
        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
   651
        namemask = '%%-%is' % maxwidth
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   652
    for topic in sorted(repo.topics):
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   653
        fm.startitem()
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   654
        marker = ' '
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   655
        label = 'topic'
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   656
        active = (topic == activetopic)
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   657
        if active:
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   658
            marker = '*'
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   659
            label = 'topic.active'
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   660
        if not ui.quiet:
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   661
            # 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
   662
            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
   663
        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
   664
        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
   665
        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
   666
            # XXX we should include the data even when not verbose
2668
1d2c66dc4ee3 topic: explicitly pass topic as a keyword argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2667
diff changeset
   667
            data = stack.stackdata(repo, topic=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
   668
            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
   669
            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
   670
                     '+'.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
   671
                     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
   672
            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
   673
            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
   674
                     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
   675
            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
   676
                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
   677
                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
   678
                         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
   679
                         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
   680
            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
   681
                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
   682
                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
   683
                         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
   684
                         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
   685
            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
   686
                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
   687
                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
   688
                         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
   689
                         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
   690
            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
   691
                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
   692
                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
   693
                         _('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
   694
                         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
   695
            fm.plain(')')
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   696
        fm.plain('\n')
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
   697
    fm.end()
1974
20fb4195bfc4 topic: extract the code listing all topics
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1973
diff changeset
   698
2731
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   699
def _showlasttouched(repo, fm, opts):
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   700
    topics = repo.topics
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   701
    timedict = _getlasttouched(repo, topics)
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   702
    times = timedict.keys()
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   703
    times.sort()
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   704
    if topics:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   705
        maxwidth = max(len(t) for t in topics)
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   706
        namemask = '%%-%is' % maxwidth
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   707
    activetopic = repo.currenttopic
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   708
    for timevalue in times:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   709
        curtopics = timedict[timevalue][1]
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   710
        for topic in curtopics:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   711
            fm.startitem()
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   712
            marker = ' '
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   713
            label = 'topic'
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   714
            active = (topic == activetopic)
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   715
            if active:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   716
                marker = '*'
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   717
                label = 'topic.active'
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   718
            fm.plain(' %s ' % marker, label=label)
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   719
            fm.write('topic', namemask, topic, label=label)
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   720
            fm.data(active=active)
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   721
            fm.plain(' (')
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   722
            if timevalue == -1:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   723
                timestr = 'not yet touched'
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   724
            else:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   725
                timestr = templatefilters.age(timedict[timevalue][0])
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   726
            fm.write('lasttouched', '%s', timestr, label='topic.list.time')
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   727
            fm.plain(')')
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   728
            fm.plain('\n')
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   729
    fm.end()
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   730
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   731
def _getlasttouched(repo, topics):
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   732
    """
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   733
    Calculates the last time a topic was used. Returns a dictionary of seconds
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   734
    passed from current time for a topic as keys and topic name as values.
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   735
    """
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   736
    topicstime = {}
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   737
    curtime = time.time()
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   738
    for t in topics:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   739
        maxtime = (0, 0)
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   740
        trevs = repo.revs("topic(%s)", t)
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   741
        # Need to check for the time of all changesets in the topic, whether
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   742
        # they are obsolete of non-heads
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   743
        # XXX: can we just rely on the max rev number for this
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   744
        for revs in trevs:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   745
            rt = repo[revs].date()
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   746
            if rt[0] > maxtime[0]:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   747
                # Can store the rev to gather more info
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   748
                # latesthead = revs
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   749
                maxtime = rt
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   750
            # looking on the markers also to get more information and accurate
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   751
            # last touch time.
2922
66357d4d03b2 topic: centralize compatibility logic between hg versions into compat module
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
   752
            obsmarkers = compat.getmarkers(repo, [repo[revs].node()])
2731
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   753
            for marker in obsmarkers:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   754
                rt = marker.date()
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   755
                if rt[0] > maxtime[0]:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   756
                    maxtime = rt
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   757
        # is the topic still yet untouched
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   758
        if not trevs:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   759
            secspassed = -1
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   760
        else:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   761
            secspassed = (curtime - maxtime[0])
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   762
        try:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   763
            topicstime[secspassed][1].append(t)
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   764
        except KeyError:
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   765
            topicstime[secspassed] = (maxtime, [t])
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   766
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   767
    return topicstime
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
   768
1848
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
   769
def summaryhook(ui, repo):
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
   770
    t = repo.currenttopic
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
   771
    if not t:
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
   772
        return
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
   773
    # 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
   774
    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
   775
1850
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
   776
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
   777
    with repo.wlock():
2733
adfbb984ebbb topics: check for topic on commit before a user enters message
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2731
diff changeset
   778
        enforcetopic = ui.configbool('experimental', 'enforce-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
   779
        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
   780
            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
   781
            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
   782
                f.write(t)
2733
adfbb984ebbb topics: check for topic on commit before a user enters message
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2731
diff changeset
   783
        elif not repo.currenttopic and enforcetopic:
adfbb984ebbb topics: check for topic on commit before a user enters message
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2731
diff changeset
   784
            msg = _("no active topic")
adfbb984ebbb topics: check for topic on commit before a user enters message
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2731
diff changeset
   785
            hint = _("set a current topic or use '--config " +
adfbb984ebbb topics: check for topic on commit before a user enters message
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2731
diff changeset
   786
                     "experimental.enforce-topic=no' to commit without a topic")
adfbb984ebbb topics: check for topic on commit before a user enters message
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2731
diff changeset
   787
            raise error.Abort(msg, hint=hint)
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
   788
        return orig(ui, repo, *args, **opts)
1850
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
   789
1852
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
   790
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
   791
    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
   792
    t = repo.currenttopic
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
   793
    if t:
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
   794
        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
   795
                          "\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
   796
    return ret
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
   797
1877
69077c65919d topic: handle merge.update function signature change
Augie Fackler <raf@durin42.com>
parents: 1874
diff changeset
   798
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
   799
    matcher = kwargs.get('matcher')
e67c526c0a25 update: calculate 'partial' as core does
Sean Farley <sean@farley.io>
parents: 1963
diff changeset
   800
    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
   801
    wlock = repo.wlock()
2679
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   802
    isrebase = False
2711
8c938e9af113 topics: wrap the update function to check if either t0 or b0 is passed as rev
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2709
diff changeset
   803
    ist0 = False
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   804
    try:
1877
69077c65919d topic: handle merge.update function signature change
Augie Fackler <raf@durin42.com>
parents: 1874
diff changeset
   805
        ret = orig(repo, node, branchmerge, force, *args, **kwargs)
2679
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   806
        # The mergeupdatewrap function makes the destination's topic as the
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   807
        # current topic. This is right for merge but wrong for rebase. We check
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   808
        # if rebase is running and update the currenttopic to topic of new
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   809
        # rebased commit. We have explicitly stored in config if rebase is
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   810
        # running.
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   811
        if repo.ui.hasconfig('experimental', 'topicrebase'):
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   812
            isrebase = True
2740
51afc979d88d topic: rename the internal topic option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2733
diff changeset
   813
        if repo.ui.configbool('_internal', 'keep-topic'):
2711
8c938e9af113 topics: wrap the update function to check if either t0 or b0 is passed as rev
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2709
diff changeset
   814
            ist0 = True
8c938e9af113 topics: wrap the update function to check if either t0 or b0 is passed as rev
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2709
diff changeset
   815
        if ((not partial and not branchmerge) or isrebase) and not ist0:
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   816
            ot = repo.currenttopic
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   817
            t = ''
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   818
            pctx = repo[node]
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   819
            if pctx.phase() > phases.public:
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   820
                t = pctx.topic()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   821
            with repo.vfs.open('topic', 'w') as f:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   822
                f.write(t)
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   823
            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
   824
                repo.ui.status(_("switching to topic %s\n") % t)
2711
8c938e9af113 topics: wrap the update function to check if either t0 or b0 is passed as rev
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2709
diff changeset
   825
        elif ist0:
8c938e9af113 topics: wrap the update function to check if either t0 or b0 is passed as rev
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2709
diff changeset
   826
            repo.ui.status(_("preserving the current topic '%s'\n") %
8c938e9af113 topics: wrap the update function to check if either t0 or b0 is passed as rev
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2709
diff changeset
   827
                           repo.currenttopic)
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   828
        return ret
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   829
    finally:
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
   830
        wlock.release()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   831
2793
fb317d218af0 topic: wrap 'update' in a more flexible way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   832
def checkt0(orig, ui, repo, node=None, rev=None, *args, **kwargs):
2711
8c938e9af113 topics: wrap the update function to check if either t0 or b0 is passed as rev
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2709
diff changeset
   833
8c938e9af113 topics: wrap the update function to check if either t0 or b0 is passed as rev
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2709
diff changeset
   834
    thezeros = set(['t0', 'b0'])
2795
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2793
diff changeset
   835
    backup = repo.ui.backupconfig('_internal', 'keep-topic')
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2793
diff changeset
   836
    try:
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2793
diff changeset
   837
        if node in thezeros or rev in thezeros:
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2793
diff changeset
   838
            repo.ui.setconfig('_internal', 'keep-topic', 'yes',
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2793
diff changeset
   839
                              source='topic-extension')
2793
fb317d218af0 topic: wrap 'update' in a more flexible way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   840
        return orig(ui, repo, node, rev, *args, **kwargs)
2795
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2793
diff changeset
   841
    finally:
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2793
diff changeset
   842
        repo.ui.restoreconfig(backup)
2711
8c938e9af113 topics: wrap the update function to check if either t0 or b0 is passed as rev
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2709
diff changeset
   843
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   844
def _fixrebase(loaded):
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   845
    if not loaded:
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   846
        return
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   847
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   848
    def savetopic(ctx, extra):
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   849
        if ctx.topic():
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   850
            extra[constants.extrakey] = ctx.topic()
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   851
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   852
    def newmakeextrafn(orig, copiers):
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   853
        return orig(copiers + [savetopic])
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   854
2679
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   855
    def setrebaseconfig(orig, ui, repo, **opts):
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   856
        repo.ui.setconfig('experimental', 'topicrebase', 'yes',
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   857
                          source='topic-extension')
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   858
        return orig(ui, repo, **opts)
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   859
1969
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
   860
    try:
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
   861
        rebase = extensions.find("rebase")
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
   862
        extensions.wrapfunction(rebase, '_makeextrafn', newmakeextrafn)
2679
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   863
        # This exists to store in the config that rebase is running so that we can
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   864
        # update the topic according to rebase. This is a hack and should be removed
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   865
        # when we have better options.
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
   866
        extensions.wrapcommand(rebase.cmdtable, 'rebase', setrebaseconfig)
1969
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
   867
    except KeyError:
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
   868
        pass
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
   869
1946
72246b13bd72 patch: document the section about import/export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1945
diff changeset
   870
## 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
   871
1866
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
   872
def _exporttopic(seq, ctx):
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
   873
    topic = ctx.topic()
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
   874
    if topic:
1917
ea4675c7a028 init: whitespace fixups
Sean Farley <sean@farley.io>
parents: 1916
diff changeset
   875
        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
   876
    return None
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
   877
1867
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
   878
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
   879
    if 'topic' in patchdata:
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
   880
        extra['topic'] = patchdata['topic']
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
   881
1948
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
   882
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
   883
    """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
   884
    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
   885
    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
   886
    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
   887
    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
   888
    patch.patchheadermap.append(('EXP-Topic', 'topic'))
2667
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   889
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   890
## preserve topic during split
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   891
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   892
def presplitupdatetopic(original, repo, ui, prev, ctx):
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   893
    # Save topic of revision
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   894
    topic = None
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   895
    if util.safehasattr(ctx, 'topic'):
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   896
        topic = ctx.topic()
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   897
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   898
    # Update the working directory
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   899
    original(repo, ui, prev, ctx)
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   900
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   901
    # Restore the topic if need
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   902
    if topic:
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   903
        _changecurrenttopic(repo, topic)