hgext3rd/topic/__init__.py
author Martin von Zweigbergk <martinvonz@google.com>
Thu, 11 Jul 2019 21:48:02 -0700
changeset 4748 d04be27dcce9
parent 4742 db3e7f6b5ceb
child 4752 8a73a8df63b6
permissions -rw-r--r--
py3: avoid "%r" for byte string, which produces b'' on py3 Replaced by "'%s'", which I think is clearer anyway.
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
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3195
diff changeset
    12
the way named branch work, except they eventually 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
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3195
diff changeset
    17
changesets on that topic (and, in some occurrence, bare changeset on same
2011
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
4069
a93b74f745a6 topic: update other occurrence of 't0' is 's0' in the code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4066
diff changeset
    32
stack as 's#'. For example, 's1' refers to the root of your stack, 's2' to the
4065
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
    33
second commits, etc. The 'hg stack' command show these number. 's0' can be used
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
    34
to refer to the parent of the topic root. Updating using `hg up s0` will keep
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
    35
the topic active.
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    36
2012
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    37
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
    38
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
    39
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
    40
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
    41
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
    42
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
    43
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
    44
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
    45
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
    46
dc34d5317001 doc: add more details about the head checking
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2011
diff changeset
    47
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
    48
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
    49
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
    50
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
    51
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
    52
are likely to be change/adjusted/dropped over time as we refine the concept.
3022
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
    53
3026
e9935c2c4672 topic: rename the 'topic-mode' help subtopic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3025
diff changeset
    54
topic-mode
e9935c2c4672 topic: rename the 'topic-mode' help subtopic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3025
diff changeset
    55
==========
3022
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
    56
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
    57
The topic extension can be configured to ensure the user do not forget to add
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
    58
a topic when committing a new topic::
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
    59
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
    60
    [experimental]
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
    61
    # behavior when commit is made without an active topic
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
    62
    topic-mode = ignore # do nothing special (default)
3023
cc740c545776 topicmode: add new warning topicmode
Boris Feld <boris.feld@octobus.net>
parents: 3022
diff changeset
    63
    topic-mode = warning # print a warning
3024
89855920fb0f topicmode: 'enforce' topic mode, no longer warn about untopiced merge
Boris Feld <boris.feld@octobus.net>
parents: 3023
diff changeset
    64
    topic-mode = enforce # abort the commit (except for merge)
3025
e814c553ef32 topic: add a 'enforce-all' mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3024
diff changeset
    65
    topic-mode = enforce-all # abort the commit (even for merge)
3030
581a6b9d2c8c test: add support for random-all topic mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3028
diff changeset
    66
    topic-mode = random # use a randomized generated topic (except for merge)
581a6b9d2c8c test: add support for random-all topic mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3028
diff changeset
    67
    topic-mode = random-all # use a randomized generated topic (even for merge)
3157
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
    68
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
    69
Single head enforcing
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
    70
=====================
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
    71
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
    72
The extensions come with an option to enforce that there is only one heads for
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
    73
each name in the repository at any time.
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
    74
3764
f0f9139016d8 topic: use preformatted block for config snippets documentation
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3725
diff changeset
    75
::
f0f9139016d8 topic: use preformatted block for config snippets documentation
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3725
diff changeset
    76
3157
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
    77
    [experimental]
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
    78
    enforce-single-head = yes
3158
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
    79
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
    80
Publishing behavior
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
    81
===================
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
    82
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
    83
Topic vanish when changeset move to the public phases. Moving to the public
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3195
diff changeset
    84
phase usually happens on push, but it is possible to update that behavior. The
3158
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
    85
server needs to have specific config for this.
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
    86
3765
4aabc5c8b2af topic: dedent items about publishing behavior in docstring
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3764
diff changeset
    87
* everything pushed become public (the default)::
3764
f0f9139016d8 topic: use preformatted block for config snippets documentation
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3725
diff changeset
    88
3765
4aabc5c8b2af topic: dedent items about publishing behavior in docstring
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3764
diff changeset
    89
    [phase]
4aabc5c8b2af topic: dedent items about publishing behavior in docstring
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3764
diff changeset
    90
    publish = yes
3764
f0f9139016d8 topic: use preformatted block for config snippets documentation
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3725
diff changeset
    91
3765
4aabc5c8b2af topic: dedent items about publishing behavior in docstring
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3764
diff changeset
    92
* nothing push turned public::
3158
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
    93
3765
4aabc5c8b2af topic: dedent items about publishing behavior in docstring
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3764
diff changeset
    94
    [phase]
4aabc5c8b2af topic: dedent items about publishing behavior in docstring
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3764
diff changeset
    95
    publish = no
3764
f0f9139016d8 topic: use preformatted block for config snippets documentation
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3725
diff changeset
    96
3765
4aabc5c8b2af topic: dedent items about publishing behavior in docstring
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3764
diff changeset
    97
* topic branches are not published, changeset without topic are::
3158
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
    98
3765
4aabc5c8b2af topic: dedent items about publishing behavior in docstring
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3764
diff changeset
    99
    [phase]
4aabc5c8b2af topic: dedent items about publishing behavior in docstring
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3764
diff changeset
   100
    publish = no
4aabc5c8b2af topic: dedent items about publishing behavior in docstring
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3764
diff changeset
   101
    [experimental]
4aabc5c8b2af topic: dedent items about publishing behavior in docstring
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3764
diff changeset
   102
    topic.publish-bare-branch = yes
3159
90515d0bfb08 push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3158
diff changeset
   103
90515d0bfb08 push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3158
diff changeset
   104
In addition, the topic extension adds a ``--publish`` flag on :hg:`push`. When
90515d0bfb08 push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3158
diff changeset
   105
used, the pushed revisions are published if the push succeeds. It also applies
90515d0bfb08 push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3158
diff changeset
   106
to common revisions selected by the push.
4647
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   107
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   108
One can prevent any publishing to happens in a repository using::
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   109
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   110
    [experimental]
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   111
    topic.allow-publish = no
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   112
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   113
"""
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
   114
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   115
from __future__ import absolute_import
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   116
3082
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   117
import functools
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   118
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
   119
import time
2986
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
   120
import weakref
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   121
1848
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
   122
from mercurial.i18n import _
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   123
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
   124
    bookmarks,
2928
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
   125
    changelog,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   126
    cmdutil,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   127
    commands,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   128
    context,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   129
    error,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   130
    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
   131
    hg,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   132
    localrepo,
2890
1e3d97486861 topics: import lock as lockmods
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2889
diff changeset
   133
    lock as lockmod,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   134
    merge,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   135
    namespaces,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   136
    node,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   137
    obsolete,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   138
    patch,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   139
    phases,
2464
2b53a2a21bbb deprecation: fix cmdutil.command deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2428
diff changeset
   140
    registrar,
2889
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
   141
    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
   142
    templatefilters,
4078
da6ce6d446b9 topic: rework topic templatekw declaration to be 4.5 compatible again
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4073
diff changeset
   143
    templatekw,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   144
    util,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   145
)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   146
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   147
from . import (
4531
1d1f8f56daac topic: introduce a `hastopicext(repo)` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4524
diff changeset
   148
    common,
2922
66357d4d03b2 topic: centralize compatibility logic between hg versions into compat module
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
   149
    compat,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   150
    constants,
3532
68e99d2c6267 prev: fix the breakage of `hg previous` from obsolete cset
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3447
diff changeset
   151
    destination,
68e99d2c6267 prev: fix the breakage of `hg previous` from obsolete cset
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3447
diff changeset
   152
    discovery,
3157
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
   153
    flow,
3532
68e99d2c6267 prev: fix the breakage of `hg previous` from obsolete cset
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3447
diff changeset
   154
    randomname,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   155
    revset as topicrevset,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   156
    stack,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   157
    topicmap,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
   158
)
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents: 1842
diff changeset
   159
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   160
cmdtable = {}
3971
9f8b99b3d9b5 topic: drop compat layer for `command`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3945
diff changeset
   161
command = registrar.command(cmdtable)
1976
ebdc2a6a9a25 topic: add color for the active topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1975
diff changeset
   162
colortable = {'topic.active': 'green',
4581
48521a49a07e stack: rename troubledcount to unstablecount
Anton Shestakov <av6@dwimlabs.net>
parents: 4574
diff changeset
   163
              'topic.list.unstablecount': '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
   164
              '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
   165
              '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
   166
              'topic.list.behinderror': 'red',
4658
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   167
              'stack.index': 'yellow',
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   168
              'stack.index.base': 'none dim',
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   169
              'stack.desc.base': 'none dim',
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   170
              'stack.shortnode.base': 'none dim',
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   171
              'stack.state.base': 'dim',
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   172
              'stack.state.clean': 'green',
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   173
              'stack.index.current': 'cyan',       # random pick
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   174
              'stack.state.current': 'cyan bold',  # random pick
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   175
              'stack.desc.current': 'cyan',        # random pick
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   176
              'stack.shortnode.current': 'cyan',   # random pick
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   177
              'stack.state.orphan': 'red',
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   178
              'stack.state.content-divergent': 'red',
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   179
              'stack.state.phase-divergent': 'red',
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   180
              'stack.summary.behindcount': 'cyan',
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   181
              'stack.summary.behinderror': 'red',
89c1b739fabe stack: remove 'topic.' prefix from colors/labels
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   182
              '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
   183
              # 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
   184
              # (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
   185
              'log.topic': 'green_background',
e6d3b83b306b topic: configure some default color for topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2339
diff changeset
   186
              'topic.active': 'green',
1908
dbd6d51e63f1 stack: add some default color configuration
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
   187
             }
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   188
4713
fbe7f35a6926 py3: make metadata values be byte strings as Mercurial expects
Martin von Zweigbergk <martinvonz@google.com>
parents: 4704
diff changeset
   189
__version__ = b'0.16.0.dev'
3057
cb8ae3cb0bbc branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3040 3048
diff changeset
   190
4713
fbe7f35a6926 py3: make metadata values be byte strings as Mercurial expects
Martin von Zweigbergk <martinvonz@google.com>
parents: 4704
diff changeset
   191
testedwith = b'4.5.2 4.6.2 4.7 4.8 4.9 5.0'
fbe7f35a6926 py3: make metadata values be byte strings as Mercurial expects
Martin von Zweigbergk <martinvonz@google.com>
parents: 4704
diff changeset
   192
minimumhgversion = b'4.5'
fbe7f35a6926 py3: make metadata values be byte strings as Mercurial expects
Martin von Zweigbergk <martinvonz@google.com>
parents: 4704
diff changeset
   193
buglink = b'https://bz.mercurial-scm.org/'
1884
8a53f99d9061 testedwith: declare compatibility with Mercurial 3.7
Augie Fackler <raf@durin42.com>
parents: 1877
diff changeset
   194
3082
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   195
if util.safehasattr(registrar, 'configitem'):
3295
64aedeb30625 topic: fix compatibility with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3293
diff changeset
   196
64aedeb30625 topic: fix compatibility with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3293
diff changeset
   197
    from mercurial import configitems
64aedeb30625 topic: fix compatibility with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3293
diff changeset
   198
3082
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   199
    configtable = {}
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   200
    configitem = registrar.configitem(configtable)
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   201
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   202
    configitem('experimental', 'enforce-topic',
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   203
               default=False,
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   204
    )
3157
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
   205
    configitem('experimental', 'enforce-single-head',
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
   206
               default=False,
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
   207
    )
3082
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   208
    configitem('experimental', 'topic-mode',
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   209
               default=None,
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   210
    )
3158
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   211
    configitem('experimental', 'topic.publish-bare-branch',
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   212
               default=False,
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   213
    )
4647
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   214
    configitem('experimental', 'topic.allow-publish',
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   215
               default=configitems.dynamicdefault,
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   216
    )
3082
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   217
    configitem('_internal', 'keep-topic',
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   218
               default=False,
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   219
    )
3235
8a772f0c54d9 topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
   220
    configitem('experimental', 'topic-mode.server',
3295
64aedeb30625 topic: fix compatibility with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3293
diff changeset
   221
               default=configitems.dynamicdefault,
3235
8a772f0c54d9 topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
   222
    )
3082
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   223
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   224
    def extsetup(ui):
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3195
diff changeset
   225
        # register config that strictly belong to other code (thg, core, etc)
3082
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   226
        #
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3195
diff changeset
   227
        # To ensure all config items we used are registered, we register them if
3082
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   228
        # nobody else did so far.
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   229
        from mercurial import configitems
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   230
        extraitem = functools.partial(configitems._register, ui._knownconfig)
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   231
        if ('experimental' not in ui._knownconfig
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   232
                or not ui._knownconfig['experimental'].get('thg.displaynames')):
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   233
            extraitem('experimental', 'thg.displaynames',
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   234
                      default=None,
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   235
            )
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   236
        if ('devel' not in ui._knownconfig
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   237
                or not ui._knownconfig['devel'].get('random')):
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   238
            extraitem('devel', 'randomseed',
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   239
                      default=None,
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   240
            )
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   241
4078
da6ce6d446b9 topic: rework topic templatekw declaration to be 4.5 compatible again
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4073
diff changeset
   242
# we need to do old style declaration for <= 4.5
3945
47dd383a9955 compat: use new style template keyword declaration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3942
diff changeset
   243
templatekeyword = registrar.templatekeyword()
4078
da6ce6d446b9 topic: rework topic templatekw declaration to be 4.5 compatible again
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4073
diff changeset
   244
post45template = 'requires=' in templatekeyword.__doc__
3945
47dd383a9955 compat: use new style template keyword declaration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3942
diff changeset
   245
2656
4a148ca3e80d topic: update the changectx method to respect phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2655
diff changeset
   246
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
   247
    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
   248
        return ''
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   249
    return self.extra().get(constants.extrakey, '')
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   250
context.basectx.topic = _contexttopic
3235
8a772f0c54d9 topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
   251
2744
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   252
def _contexttopicidx(self):
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   253
    topic = self.topic()
4190
883e75e0a810 topicidx: stop assigning index number to obsolete changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4178
diff changeset
   254
    if not topic or self.obsolete():
4069
a93b74f745a6 topic: update other occurrence of 't0' is 's0' in the code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4066
diff changeset
   255
        # XXX we might want to include s0 here,
a93b74f745a6 topic: update other occurrence of 't0' is 's0' in the code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4066
diff changeset
   256
        # however s0 is related to  'currenttopic' which has no place here.
2744
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   257
        return None
2915
b3abdb3d819e stack: replace 'getstack' with direct call to 'stack'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2912
diff changeset
   258
    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
   259
    try:
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   260
        return revlist.index(self.rev())
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   261
    except IndexError:
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   262
        # 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
   263
        return None
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
   264
context.basectx.topicidx = _contexttopicidx
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   265
4065
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
   266
stackrev = re.compile(r'^s\d+$')
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   267
topicrev = re.compile(r'^t\d+$')
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   268
4531
1d1f8f56daac topic: introduce a `hastopicext(repo)` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4524
diff changeset
   269
hastopicext = common.hastopicext
1d1f8f56daac topic: introduce a `hastopicext(repo)` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4524
diff changeset
   270
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   271
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
   272
    revs = None
4065
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
   273
    if stackrev.match(name):
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
   274
        idx = int(name[1:])
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
   275
        tname = topic = repo.currenttopic
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
   276
        if topic:
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
   277
            ttype = 'topic'
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
   278
            revs = list(stack.stack(repo, topic=topic))
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
   279
        else:
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
   280
            ttype = 'branch'
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
   281
            tname = branch = repo[None].branch()
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
   282
            revs = list(stack.stack(repo, branch=branch))
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
   283
    elif topicrev.match(name):
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
   284
        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
   285
        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
   286
        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
   287
        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
   288
            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
   289
        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
   290
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   291
    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
   292
        try:
2712
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2711
diff changeset
   293
            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
   294
        except IndexError:
4066
1aa5f851d2c0 stack: clarify s# error message in case of branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4065
diff changeset
   295
            if ttype == 'topic':
1aa5f851d2c0 stack: clarify s# error message in case of branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4065
diff changeset
   296
                msg = _('cannot resolve "%s": %s "%s" has only %d changesets')
1aa5f851d2c0 stack: clarify s# error message in case of branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4065
diff changeset
   297
            elif ttype == 'branch':
1aa5f851d2c0 stack: clarify s# error message in case of branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4065
diff changeset
   298
                msg = _('cannot resolve "%s": %s "%s" has only %d non-public changesets')
2712
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2711
diff changeset
   299
            raise error.Abort(msg % (name, ttype, tname, len(revs) - 1))
4628
c4097632a1a3 topic: drop support for accessing csets in branch stack using bxx (issue6119)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 4581
diff changeset
   300
        # t0 or s0 can be None
2712
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2711
diff changeset
   301
        if r == -1 and idx == 0:
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2711
diff changeset
   302
            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
   303
            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
   304
        return [repo[r].node()]
2008
e3ddd696394f flake8: fix E713 style
Sean Farley <sean@farley.io>
parents: 2007
diff changeset
   305
    if name not in repo.topics:
2000
c413e7c96265 init: guard _namemap with repo.topics (issue5351)
timeless@gmail.com
parents: 1999
diff changeset
   306
        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
   307
    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
   308
    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
   309
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   310
def _nodemap(repo, node):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   311
    ctx = repo[node]
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   312
    t = ctx.topic()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   313
    if t and ctx.phase() > phases.public:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   314
        return [t]
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   315
    return []
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   316
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1867
diff changeset
   317
def uisetup(ui):
1941
7eb737b7a902 destination: rename 'setupdest' to 'modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1939
diff changeset
   318
    destination.modsetup(ui)
1944
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1943
diff changeset
   319
    discovery.modsetup(ui)
1952
665d6322994e uisetup: add call to 'topicmap.modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1951
diff changeset
   320
    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
   321
    setupimportexport(ui)
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1867
diff changeset
   322
1951
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   323
    extensions.afterloaded('rebase', _fixrebase)
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   324
3159
90515d0bfb08 push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3158
diff changeset
   325
    flow.installpushflag(ui)
90515d0bfb08 push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3158
diff changeset
   326
1951
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   327
    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
   328
    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
   329
                     _("use specified topic"), _('TOPIC')))
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   330
2983
c0de0010ec30 topic: add a --topic option to "outgoing" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2982
diff changeset
   331
    entry = extensions.wrapcommand(commands.table, 'push', pushoutgoingwrap)
c0de0010ec30 topic: add a --topic option to "outgoing" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2982
diff changeset
   332
    entry[1].append(('t', 'topic', '',
c0de0010ec30 topic: add a --topic option to "outgoing" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2982
diff changeset
   333
                     _("topic to push"), _('TOPIC')))
c0de0010ec30 topic: add a --topic option to "outgoing" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2982
diff changeset
   334
c0de0010ec30 topic: add a --topic option to "outgoing" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2982
diff changeset
   335
    entry = extensions.wrapcommand(commands.table, 'outgoing',
c0de0010ec30 topic: add a --topic option to "outgoing" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2982
diff changeset
   336
                                   pushoutgoingwrap)
2982
fef934b7ed86 topic: add a --topic option to "push" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2939
diff changeset
   337
    entry[1].append(('t', 'topic', '',
fef934b7ed86 topic: add a --topic option to "push" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2939
diff changeset
   338
                     _("topic to push"), _('TOPIC')))
fef934b7ed86 topic: add a --topic option to "push" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2939
diff changeset
   339
1951
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   340
    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
   341
    extensions.wrapfunction(merge, 'update', mergeupdatewrap)
4069
a93b74f745a6 topic: update other occurrence of 't0' is 's0' in the code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4066
diff changeset
   342
    # We need to check whether t0 or b0 or s0 is passed to override the default update
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
   343
    # 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
   344
    # 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
   345
    # 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
   346
    extensions.wrapcommand(commands.table, 'update', checkt0)
2667
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   347
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   348
    try:
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   349
        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
   350
        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
   351
                                presplitupdatetopic)
2667
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   352
    except (KeyError, AttributeError):
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   353
        pass
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
   354
1951
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   355
    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
   356
4078
da6ce6d446b9 topic: rework topic templatekw declaration to be 4.5 compatible again
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4073
diff changeset
   357
    if not post45template:
da6ce6d446b9 topic: rework topic templatekw declaration to be 4.5 compatible again
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4073
diff changeset
   358
        templatekw.keywords['topic'] = topickw
4170
50b8b06be26d topic: fix '{topicidx}' keyword registration for mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4152
diff changeset
   359
        templatekw.keywords['topicidx'] = topicidxkw
3281
703e8398ac57 topic: move function wrapping from reposetup to uisetup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3235
diff changeset
   360
    # Wrap workingctx extra to return the topic name
703e8398ac57 topic: move function wrapping from reposetup to uisetup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3235
diff changeset
   361
    extensions.wrapfunction(context.workingctx, '__init__', wrapinit)
703e8398ac57 topic: move function wrapping from reposetup to uisetup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3235
diff changeset
   362
    # Wrap changelog.add to drop empty topic
703e8398ac57 topic: move function wrapping from reposetup to uisetup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3235
diff changeset
   363
    extensions.wrapfunction(changelog.changelog, 'add', wrapadd)
1951
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   364
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   365
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
   366
    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
   367
        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
   368
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   369
    repo = repo.unfiltered()
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   370
3082
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
   371
    if repo.ui.config('experimental', 'thg.displaynames') is None:
2339
f641cccbd119 topic: automatically configure thg to display topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2288
diff changeset
   372
        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
   373
                          source='topic-extension')
f641cccbd119 topic: automatically configure thg to display topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2288
diff changeset
   374
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   375
    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
   376
4531
1d1f8f56daac topic: introduce a `hastopicext(repo)` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4524
diff changeset
   377
        # attribute for other code to distinct between repo with topic and repo without
1d1f8f56daac topic: introduce a `hastopicext(repo)` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4524
diff changeset
   378
        hastopicext = True
1d1f8f56daac topic: introduce a `hastopicext(repo)` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4524
diff changeset
   379
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
   380
        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
   381
            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
   382
            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
   383
            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
   384
1858
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   385
        def commit(self, *args, **kwargs):
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   386
            backup = self.ui.backupconfig('ui', 'allowemptycommit')
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   387
            try:
3880
28dadd024299 topic: use self instead of repo in topicrepo methods
Anton Shestakov <av6@dwimlabs.net>
parents: 3834
diff changeset
   388
                if self.currenttopic != self['.'].topic():
1858
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   389
                    # bypass the core "nothing changed" logic
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   390
                    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
   391
                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
   392
            finally:
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   393
                self.ui.restoreconfig(backup)
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
   394
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   395
        def commitctx(self, ctx, error=None):
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   396
            topicfilter = topicmap.topicfilter(self.filtername)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   397
            if topicfilter != self.filtername:
3880
28dadd024299 topic: use self instead of repo in topicrepo methods
Anton Shestakov <av6@dwimlabs.net>
parents: 3834
diff changeset
   398
                other = self.filtered(topicmap.topicfilter(self.filtername))
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   399
                other.commitctx(ctx, error=error)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   400
1855
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
   401
            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
   402
                current = self.currenttopic
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
   403
                if current:
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
   404
                    ctx.extra()[constants.extrakey] = current
4235
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4231
diff changeset
   405
            if (isinstance(ctx, context.memctx)
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4231
diff changeset
   406
                and ctx.extra().get('amend_source')
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4231
diff changeset
   407
                and ctx.topic()
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4231
diff changeset
   408
                and not self.currenttopic):
1862
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
   409
                # 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
   410
                del ctx.extra()[constants.extrakey]
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   411
            return super(topicrepo, self).commitctx(ctx, error=error)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   412
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   413
        @property
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   414
        def topics(self):
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   415
            if self._topics is not None:
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   416
                return self._topics
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   417
            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
   418
            for c in self.set('not public()'):
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
   419
                topics.add(c.topic())
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   420
            topics.remove('')
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   421
            self._topics = topics
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   422
            return topics
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   423
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   424
        @property
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   425
        def currenttopic(self):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   426
            return self.vfs.tryread('topic')
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   427
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   428
        # overwritten at the instance level by topicmap.py
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   429
        _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
   430
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   431
        def branchmap(self, topic=None):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   432
            if topic is None:
3880
28dadd024299 topic: use self instead of repo in topicrepo methods
Anton Shestakov <av6@dwimlabs.net>
parents: 3834
diff changeset
   433
                topic = getattr(self, '_autobranchmaptopic', False)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   434
            topicfilter = topicmap.topicfilter(self.filtername)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   435
            if not topic or topicfilter == self.filtername:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   436
                return super(topicrepo, self).branchmap()
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
   437
            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
   438
4704
5f90eb8fd63c evolve: fix confusion in branch heads checking logic when topic in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4669
diff changeset
   439
        def branchheads(self, branch=None, start=None, closed=False):
5f90eb8fd63c evolve: fix confusion in branch heads checking logic when topic in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4669
diff changeset
   440
            if branch is None:
5f90eb8fd63c evolve: fix confusion in branch heads checking logic when topic in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4669
diff changeset
   441
                branch = self[None].branch()
5f90eb8fd63c evolve: fix confusion in branch heads checking logic when topic in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4669
diff changeset
   442
            if self.currenttopic:
5f90eb8fd63c evolve: fix confusion in branch heads checking logic when topic in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4669
diff changeset
   443
                branch = "%s:%s" % (branch, self.currenttopic)
5f90eb8fd63c evolve: fix confusion in branch heads checking logic when topic in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4669
diff changeset
   444
            return super(topicrepo, self).branchheads(branch=branch,
5f90eb8fd63c evolve: fix confusion in branch heads checking logic when topic in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4669
diff changeset
   445
                                                      start=start,
5f90eb8fd63c evolve: fix confusion in branch heads checking logic when topic in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4669
diff changeset
   446
                                                      closed=closed)
5f90eb8fd63c evolve: fix confusion in branch heads checking logic when topic in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4669
diff changeset
   447
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   448
        def invalidatevolatilesets(self):
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   449
            # 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
   450
            super(topicrepo, self).invalidatevolatilesets()
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   451
            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
   452
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
   453
        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
   454
            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
   455
            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
   456
                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
   457
                    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
   458
                        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
   459
                        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
   460
                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
   461
            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
   462
2989
53246d237373 topic: skip topic movement message during strip
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2986
diff changeset
   463
        def transaction(self, desc, *a, **k):
2987
d59d6413bb68 topics/transaction: return immediately if we are in the middle of a transaction
Aurélien Campéas
parents: 2986
diff changeset
   464
            ctr = self.currenttransaction()
2989
53246d237373 topic: skip topic movement message during strip
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2986
diff changeset
   465
            tr = super(topicrepo, self).transaction(desc, *a, **k)
2999
d94a4e150633 topic: fix topic message for mercurial 4.2 and below
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2995
diff changeset
   466
            if desc in ('strip', 'repair') or ctr is not None:
2987
d59d6413bb68 topics/transaction: return immediately if we are in the middle of a transaction
Aurélien Campéas
parents: 2986
diff changeset
   467
                return tr
2986
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
   468
3158
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   469
            reporef = weakref.ref(self)
3880
28dadd024299 topic: use self instead of repo in topicrepo methods
Anton Shestakov <av6@dwimlabs.net>
parents: 3834
diff changeset
   470
            if self.ui.configbool('experimental', 'enforce-single-head'):
4123
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   471
                if util.safehasattr(tr, 'validator'): # hg <= 4.7
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   472
                    origvalidator = tr.validator
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   473
                else:
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   474
                    origvalidator = tr._validator
3157
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
   475
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
   476
                def validator(tr2):
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
   477
                    repo = reporef()
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
   478
                    flow.enforcesinglehead(repo, tr2)
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
   479
                    origvalidator(tr2)
4123
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   480
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   481
                if util.safehasattr(tr, 'validator'): # hg <= 4.7
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   482
                    tr.validator = validator
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   483
                else:
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   484
                    tr._validator = validator
3157
f286eefbd20d topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3150
diff changeset
   485
3880
28dadd024299 topic: use self instead of repo in topicrepo methods
Anton Shestakov <av6@dwimlabs.net>
parents: 3834
diff changeset
   486
            topicmodeserver = self.ui.config('experimental',
3235
8a772f0c54d9 topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
   487
                                             'topic-mode.server', 'ignore')
8a772f0c54d9 topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
   488
            ispush = (desc.startswith('push') or desc.startswith('serve'))
8a772f0c54d9 topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
   489
            if (topicmodeserver != 'ignore' and ispush):
4123
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   490
                if util.safehasattr(tr, 'validator'): # hg <= 4.7
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   491
                    origvalidator = tr.validator
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   492
                else:
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   493
                    origvalidator = tr._validator
3235
8a772f0c54d9 topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
   494
8a772f0c54d9 topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
   495
                def validator(tr2):
8a772f0c54d9 topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
   496
                    repo = reporef()
8a772f0c54d9 topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
   497
                    flow.rejectuntopicedchangeset(repo, tr2)
8a772f0c54d9 topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
   498
                    return origvalidator(tr2)
4123
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   499
                if util.safehasattr(tr, 'validator'): # hg <= 4.7
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   500
                    tr.validator = validator
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   501
                else:
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4117
diff changeset
   502
                    tr._validator = validator
3235
8a772f0c54d9 topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
   503
3880
28dadd024299 topic: use self instead of repo in topicrepo methods
Anton Shestakov <av6@dwimlabs.net>
parents: 3834
diff changeset
   504
            elif (self.ui.configbool('experimental', 'topic.publish-bare-branch')
3158
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   505
                    and (desc.startswith('push')
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   506
                         or desc.startswith('serve'))
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   507
                    ):
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   508
                origclose = tr.close
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   509
                trref = weakref.ref(tr)
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   510
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   511
                def close():
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   512
                    repo = reporef()
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   513
                    tr2 = trref()
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   514
                    flow.publishbarebranch(repo, tr2)
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   515
                    origclose()
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   516
                tr.close = close
4647
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   517
            allow_publish = self.ui.configbool('experimental',
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   518
                                               'topic.allow-publish',
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   519
                                               True)
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   520
            if not allow_publish:
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   521
                if util.safehasattr(tr, 'validator'): # hg <= 4.7
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   522
                    origvalidator = tr.validator
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   523
                else:
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   524
                    origvalidator = tr._validator
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   525
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   526
                def validator(tr2):
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   527
                    repo = reporef()
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   528
                    flow.reject_publish(repo, tr2)
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   529
                    return origvalidator(tr2)
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   530
                if util.safehasattr(tr, 'validator'): # hg <= 4.7
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   531
                    tr.validator = validator
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   532
                else:
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
   533
                    tr._validator = validator
3158
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
   534
2988
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
   535
            # real transaction start
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
   536
            ct = self.currenttopic
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
   537
            if not ct:
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
   538
                return tr
3043
033e00be9ce4 topics: use stack rather than stackdata when one only wants the changeset count
Aurélien Campéas
parents: 3012
diff changeset
   539
            ctwasempty = stack.stack(self, topic=ct).changesetcount == 0
2988
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
   540
2986
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
   541
            reporef = weakref.ref(self)
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
   542
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
   543
            def currenttopicempty(tr):
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3195
diff changeset
   544
                # check active topic emptiness
2986
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
   545
                repo = reporef()
3043
033e00be9ce4 topics: use stack rather than stackdata when one only wants the changeset count
Aurélien Campéas
parents: 3012
diff changeset
   546
                csetcount = stack.stack(repo, topic=ct).changesetcount
2988
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
   547
                empty = csetcount == 0
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
   548
                if empty and not ctwasempty:
4748
d04be27dcce9 py3: avoid "%r" for byte string, which produces b'' on py3
Martin von Zweigbergk <martinvonz@google.com>
parents: 4742
diff changeset
   549
                    ui.status("active topic '%s' is now empty\n" % ct)
4124
23658110ab26 topic: add a compatibility to access transaction's names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4123
diff changeset
   550
                    trnames = getattr(tr, 'names', getattr(tr, '_names', ()))
23658110ab26 topic: add a compatibility to access transaction's names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4123
diff changeset
   551
                    if ('phase' in trnames
3922
9839463088ac compat: disable empty topic warning on `hg phases` for hg <=4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3902
diff changeset
   552
                            or any(n.startswith('push-response')
4124
23658110ab26 topic: add a compatibility to access transaction's names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4123
diff changeset
   553
                                   for n in trnames)):
3770
eb928f5728c4 topic: suggest to clear a topic that becomes empty
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3769
diff changeset
   554
                        ui.status(_("(use 'hg topic --clear' to clear it if needed)\n"))
3769
1bc4b0807c37 topic: display a hint pointing at help when a topic becomes non-empty
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3768
diff changeset
   555
                hint = _("(see 'hg help topics' for more information)\n")
2988
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
   556
                if ctwasempty and not empty:
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
   557
                    if csetcount == 1:
4748
d04be27dcce9 py3: avoid "%r" for byte string, which produces b'' on py3
Martin von Zweigbergk <martinvonz@google.com>
parents: 4742
diff changeset
   558
                        msg = _("active topic '%s' grew its first changeset\n%s")
3769
1bc4b0807c37 topic: display a hint pointing at help when a topic becomes non-empty
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3768
diff changeset
   559
                        ui.status(msg % (ct, hint))
2988
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
   560
                    else:
4748
d04be27dcce9 py3: avoid "%r" for byte string, which produces b'' on py3
Martin von Zweigbergk <martinvonz@google.com>
parents: 4742
diff changeset
   561
                        msg = _("active topic '%s' grew its %s first changesets\n%s")
3769
1bc4b0807c37 topic: display a hint pointing at help when a topic becomes non-empty
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3768
diff changeset
   562
                        ui.status(msg % (ct, csetcount, hint))
2986
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
   563
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
   564
            tr.addpostclose('signalcurrenttopicempty', currenttopicempty)
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
   565
            return tr
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
   566
1857
a506ed8ab8da topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents: 1856
diff changeset
   567
    repo.__class__ = topicrepo
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
   568
    repo._topics = None
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   569
    if util.safehasattr(repo, 'names'):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   570
        repo.names.addnamespace(namespaces.namespace(
1857
a506ed8ab8da topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents: 1856
diff changeset
   571
            'topics', 'topic', namemap=_namemap, nodemap=_nodemap,
a506ed8ab8da topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents: 1856
diff changeset
   572
            listnames=lambda repo: repo.topics))
2928
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
   573
4078
da6ce6d446b9 topic: rework topic templatekw declaration to be 4.5 compatible again
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4073
diff changeset
   574
if post45template:
4719
358f548f8d6d py3: use bytes for template keyword registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4715
diff changeset
   575
    @templatekeyword(b'topic', requires={b'ctx'})
4078
da6ce6d446b9 topic: rework topic templatekw declaration to be 4.5 compatible again
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4073
diff changeset
   576
    def topickw(context, mapping):
da6ce6d446b9 topic: rework topic templatekw declaration to be 4.5 compatible again
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4073
diff changeset
   577
        """:topic: String. The topic of the changeset"""
da6ce6d446b9 topic: rework topic templatekw declaration to be 4.5 compatible again
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4073
diff changeset
   578
        ctx = context.resource(mapping, 'ctx')
da6ce6d446b9 topic: rework topic templatekw declaration to be 4.5 compatible again
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4073
diff changeset
   579
        return ctx.topic()
4152
fb22c7a6ca8b topic: add topicidx template keyword
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4126
diff changeset
   580
4719
358f548f8d6d py3: use bytes for template keyword registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4715
diff changeset
   581
    @templatekeyword(b'topicidx', requires={b'ctx'})
4152
fb22c7a6ca8b topic: add topicidx template keyword
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4126
diff changeset
   582
    def topicidxkw(context, mapping):
fb22c7a6ca8b topic: add topicidx template keyword
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4126
diff changeset
   583
        """:topicidx: Integer. Index of the changeset as a stack alias"""
fb22c7a6ca8b topic: add topicidx template keyword
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4126
diff changeset
   584
        ctx = context.resource(mapping, 'ctx')
fb22c7a6ca8b topic: add topicidx template keyword
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4126
diff changeset
   585
        return ctx.topicidx()
4078
da6ce6d446b9 topic: rework topic templatekw declaration to be 4.5 compatible again
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4073
diff changeset
   586
else:
da6ce6d446b9 topic: rework topic templatekw declaration to be 4.5 compatible again
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4073
diff changeset
   587
    def topickw(**args):
da6ce6d446b9 topic: rework topic templatekw declaration to be 4.5 compatible again
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4073
diff changeset
   588
        """:topic: String. The topic of the changeset"""
da6ce6d446b9 topic: rework topic templatekw declaration to be 4.5 compatible again
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4073
diff changeset
   589
        return args['ctx'].topic()
3384
2b06f144b6e0 topics: add a new templatekeyword `topic`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3372
diff changeset
   590
4152
fb22c7a6ca8b topic: add topicidx template keyword
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4126
diff changeset
   591
    def topicidxkw(**args):
fb22c7a6ca8b topic: add topicidx template keyword
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4126
diff changeset
   592
        """:topicidx: Integer. Index of the changeset as a stack alias"""
fb22c7a6ca8b topic: add topicidx template keyword
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4126
diff changeset
   593
        return args['ctx'].topicidx()
fb22c7a6ca8b topic: add topicidx template keyword
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4126
diff changeset
   594
2928
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
   595
def wrapinit(orig, self, repo, *args, **kwargs):
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
   596
    orig(self, repo, *args, **kwargs)
4532
659b6f548fc1 topic: only wrap workingctx.__init__ for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4531
diff changeset
   597
    if not hastopicext(repo):
659b6f548fc1 topic: only wrap workingctx.__init__ for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4531
diff changeset
   598
        return
4125
865c33c16508 topic: respect preexisting 'topic' value on workingcommitctx
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4124
diff changeset
   599
    if constants.extrakey not in self._extra:
865c33c16508 topic: respect preexisting 'topic' value on workingcommitctx
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4124
diff changeset
   600
        if getattr(repo, 'currenttopic', ''):
865c33c16508 topic: respect preexisting 'topic' value on workingcommitctx
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4124
diff changeset
   601
            self._extra[constants.extrakey] = repo.currenttopic
865c33c16508 topic: respect preexisting 'topic' value on workingcommitctx
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4124
diff changeset
   602
        else:
865c33c16508 topic: respect preexisting 'topic' value on workingcommitctx
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4124
diff changeset
   603
            # Empty key will be dropped from extra by another hack at the changegroup level
865c33c16508 topic: respect preexisting 'topic' value on workingcommitctx
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4124
diff changeset
   604
            self._extra[constants.extrakey] = ''
2928
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
   605
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
   606
def wrapadd(orig, cl, manifest, files, desc, transaction, p1, p2, user,
4646
7b986968700b compat: adjust `wrapadd` for upstream
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4628
diff changeset
   607
            date=None, extra=None, p1copies=None, p2copies=None,
7b986968700b compat: adjust `wrapadd` for upstream
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4628
diff changeset
   608
            filesadded=None, filesremoved=None):
2928
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
   609
    if constants.extrakey in extra and not extra[constants.extrakey]:
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
   610
        extra = extra.copy()
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
   611
        del extra[constants.extrakey]
4522
001eb0f11bcd topic: add compatibility for writing copy metadata in changelog.add()
Anton Shestakov <av6@dwimlabs.net>
parents: 4519
diff changeset
   612
    # hg <= 4.9 (0e41f40b01cc)
001eb0f11bcd topic: add compatibility for writing copy metadata in changelog.add()
Anton Shestakov <av6@dwimlabs.net>
parents: 4519
diff changeset
   613
    kwargs = {}
001eb0f11bcd topic: add compatibility for writing copy metadata in changelog.add()
Anton Shestakov <av6@dwimlabs.net>
parents: 4519
diff changeset
   614
    if p1copies is not None:
001eb0f11bcd topic: add compatibility for writing copy metadata in changelog.add()
Anton Shestakov <av6@dwimlabs.net>
parents: 4519
diff changeset
   615
        kwargs['p1copies'] = p1copies
001eb0f11bcd topic: add compatibility for writing copy metadata in changelog.add()
Anton Shestakov <av6@dwimlabs.net>
parents: 4519
diff changeset
   616
    if p2copies is not None:
001eb0f11bcd topic: add compatibility for writing copy metadata in changelog.add()
Anton Shestakov <av6@dwimlabs.net>
parents: 4519
diff changeset
   617
        kwargs['p2copies'] = p2copies
4646
7b986968700b compat: adjust `wrapadd` for upstream
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4628
diff changeset
   618
    # hg <= 5.0 (f385ba70e4af)
7b986968700b compat: adjust `wrapadd` for upstream
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4628
diff changeset
   619
    if filesadded is not None:
7b986968700b compat: adjust `wrapadd` for upstream
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4628
diff changeset
   620
        kwargs['filesadded'] = filesadded
7b986968700b compat: adjust `wrapadd` for upstream
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4628
diff changeset
   621
    if filesremoved is not None:
7b986968700b compat: adjust `wrapadd` for upstream
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4628
diff changeset
   622
        kwargs['filesremoved'] = filesremoved
2928
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
   623
    return orig(cl, manifest, files, desc, transaction, p1, p2, user,
4522
001eb0f11bcd topic: add compatibility for writing copy metadata in changelog.add()
Anton Shestakov <av6@dwimlabs.net>
parents: 4519
diff changeset
   624
                date=date, extra=extra, **kwargs)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   625
2924
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
   626
# revset predicates are automatically registered at loading via this symbol
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
   627
revsetpredicate = topicrevset.revsetpredicate
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
   628
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4713
diff changeset
   629
@command(b'topics', [
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4713
diff changeset
   630
        (b'', b'clear', False, b'clear active topic if any'),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4713
diff changeset
   631
        (b'r', b'rev', [], b'revset of existing revisions', _(b'REV')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4713
diff changeset
   632
        (b'l', b'list', False, b'show the stack of changeset in the topic'),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4713
diff changeset
   633
        (b'', b'age', False, b'show when you last touched the topics'),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4713
diff changeset
   634
        (b'', b'current', None, b'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
   635
    ] + commands.formatteropts,
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4713
diff changeset
   636
    _(b'hg topics [TOPIC]'))
2991
f4956eb3a456 topics: improve the function signature by accepting arguments as **opts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2990
diff changeset
   637
def topics(ui, repo, topic=None, **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
   638
    """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
   639
2923
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
   640
    Clear topic on existing topiced revisions::
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
   641
2994
1e8ac0fcd6b7 topics: spell out topics completely in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2993
diff changeset
   642
      hg topics --rev <related revset> --clear
2923
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
   643
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
   644
    Change topic on some revisions::
2717
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   645
2994
1e8ac0fcd6b7 topics: spell out topics completely in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2993
diff changeset
   646
      hg topics <newtopicname> --rev <related revset>
2717
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   647
2923
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
   648
    Clear current topic::
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
   649
2994
1e8ac0fcd6b7 topics: spell out topics completely in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2993
diff changeset
   650
      hg topics --clear
2717
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   651
2923
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
   652
    Set current topic::
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
   653
2994
1e8ac0fcd6b7 topics: spell out topics completely in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2993
diff changeset
   654
      hg topics <topicname>
2923
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
   655
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
   656
    List of topics::
2717
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   657
2923
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
   658
      hg topics
2717
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   659
2993
725b660d9886 topics: show the user who last touched the topic in --age
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2992
diff changeset
   660
    List of topics sorted according to their last touched time displaying last
725b660d9886 topics: show the user who last touched the topic in --age
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2992
diff changeset
   661
    touched time and the user who last touched the topic::
2923
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
   662
2994
1e8ac0fcd6b7 topics: spell out topics completely in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2993
diff changeset
   663
      hg topics --age
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
   664
2717
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   665
    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
   666
2869
b629874ccaac topics: allow use a --current when setting a topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2868
diff changeset
   667
    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
   668
    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
   669
    active topic, you can do:
2994
1e8ac0fcd6b7 topics: spell out topics completely in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2993
diff changeset
   670
        `hg topics -r "draft()" --current`
2869
b629874ccaac topics: allow use a --current when setting a topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2868
diff changeset
   671
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
   672
    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
   673
2991
f4956eb3a456 topics: improve the function signature by accepting arguments as **opts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2990
diff changeset
   674
    clear = opts.get('clear')
f4956eb3a456 topics: improve the function signature by accepting arguments as **opts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2990
diff changeset
   675
    list = opts.get('list')
f4956eb3a456 topics: improve the function signature by accepting arguments as **opts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2990
diff changeset
   676
    rev = opts.get('rev')
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   677
    current = opts.get('current')
2995
dbc896a7a1c3 topics: make sure user don't pass both the age option and a topic name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2994
diff changeset
   678
    age = opts.get('age')
2991
f4956eb3a456 topics: improve the function signature by accepting arguments as **opts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2990
diff changeset
   679
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   680
    if current and topic:
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   681
        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
   682
    if current and clear:
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   683
        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
   684
    if clear and topic:
e46b68547017 topic: make --clear + topicname invalid
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2867
diff changeset
   685
        raise error.Abort(_("cannot use --clear when setting a topic"))
2995
dbc896a7a1c3 topics: make sure user don't pass both the age option and a topic name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2994
diff changeset
   686
    if age and topic:
dbc896a7a1c3 topics: make sure user don't pass both the age option and a topic name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2994
diff changeset
   687
        raise error.Abort(_("cannot use --age while setting a topic"))
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   688
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
   689
    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
   690
    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
   691
        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
   692
2889
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
   693
    if topic:
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
   694
        topic = topic.strip()
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
   695
        if not topic:
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
   696
            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
   697
        # 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
   698
        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
   699
3667
a346b1641dfa topic: allow '.' in topic names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3652
diff changeset
   700
        rmatch = re.match(br'[-_.\w]+', topic)
3652
81985b9d3e74 topic-ext: restrict the format of topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3614
diff changeset
   701
        if not rmatch or rmatch.group(0) != topic:
81985b9d3e74 topic-ext: restrict the format of topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3614
diff changeset
   702
            helptxt = _("topic names can only consist of alphanumeric, '-'"
3667
a346b1641dfa topic: allow '.' in topic names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3652
diff changeset
   703
                        " '_' and '.' characters")
3652
81985b9d3e74 topic-ext: restrict the format of topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3614
diff changeset
   704
            raise error.Abort(_("invalid topic name: '%s'") % topic, hint=helptxt)
81985b9d3e74 topic-ext: restrict the format of topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3614
diff changeset
   705
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
   706
    if list:
4231
3eb78bdcdd7c topic: improve UX by using pager only when we should
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4218
diff changeset
   707
        ui.pager('topics')
2643
a9ca94defc29 topics: rename '--change' flag to '--rev' flag
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2642
diff changeset
   708
        if clear or rev:
a9ca94defc29 topics: rename '--change' flag to '--rev' flag
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2642
diff changeset
   709
            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
   710
        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
   711
            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
   712
        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
   713
            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
   714
        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
   715
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
   716
    if touchedrevs:
1851
67d53e8e0c1a topic: only require obsolete support for --change
Matt Mackall <mpm@selenic.com>
parents: 1850
diff changeset
   717
        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
   718
            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
   719
        if clear:
2e3f63f4a519 topic: further simplify the clear logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2644
diff changeset
   720
            topic = None
2869
b629874ccaac topics: allow use a --current when setting a topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2868
diff changeset
   721
        elif opts.get('current'):
b629874ccaac topics: allow use a --current when setting a topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2868
diff changeset
   722
            topic = repo.currenttopic
2645
2e3f63f4a519 topic: further simplify the clear logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2644
diff changeset
   723
        elif not topic:
1894
f8ee36489d3c topic: get 'Abort' from error, not 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1890
diff changeset
   724
            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
   725
        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
   726
            raise error.Abort("can't change topic of a public change")
3124
6ef274e01f64 flake8: rename some ambiguous identifier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3097
diff changeset
   727
        wl = lock = txn = None
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   728
        try:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   729
            wl = repo.wlock()
3124
6ef274e01f64 flake8: rename some ambiguous identifier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3097
diff changeset
   730
            lock = repo.lock()
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   731
            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
   732
            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
   733
            txn.close()
4268
d5a2cc19903f topics: improve the message around topic changing
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 4253
diff changeset
   734
            if topic is None:
d5a2cc19903f topics: improve the message around topic changing
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 4253
diff changeset
   735
                ui.status('cleared topic on %d changesets\n' % rewrote)
d5a2cc19903f topics: improve the message around topic changing
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 4253
diff changeset
   736
            else:
d5a2cc19903f topics: improve the message around topic changing
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 4253
diff changeset
   737
                ui.status('changed topic on %d changesets to "%s"\n' % (rewrote,
d5a2cc19903f topics: improve the message around topic changing
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 4253
diff changeset
   738
                                                                        topic))
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   739
        finally:
3124
6ef274e01f64 flake8: rename some ambiguous identifier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3097
diff changeset
   740
            lockmod.release(txn, lock, wl)
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   741
            repo.invalidate()
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   742
        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
   743
2985
f63c97c01f92 topics/ui: signal when the topics command creates a new (empty) topic
Aurélien Campéas
parents: 2984
diff changeset
   744
    ct = repo.currenttopic
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   745
    if clear:
4044
c0fbe70f2e48 topic: check that repo.currenttopic is set before using it as an argument
Anton Shestakov <av6@dwimlabs.net>
parents: 4038
diff changeset
   746
        if ct:
4652
b72cd597a887 stack: check if stack is empty more pythonically
Anton Shestakov <av6@dwimlabs.net>
parents: 4647
diff changeset
   747
            st = stack.stack(repo, topic=ct)
b72cd597a887 stack: check if stack is empty more pythonically
Anton Shestakov <av6@dwimlabs.net>
parents: 4647
diff changeset
   748
            if not st:
2984
30f6030dca8f topics: signal to the end user when a topic has been forgotten
Aurélien Campéas
parents: 2983
diff changeset
   749
                ui.status(_('clearing empty topic "%s"\n') % ct)
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
   750
        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
   751
1860
b7b9e5028c2a topics: consistently use empty string instead of None
Matt Mackall <mpm@selenic.com>
parents: 1859
diff changeset
   752
    if topic:
2985
f63c97c01f92 topics/ui: signal when the topics command creates a new (empty) topic
Aurélien Campéas
parents: 2984
diff changeset
   753
        if not ct:
f63c97c01f92 topics/ui: signal when the topics command creates a new (empty) topic
Aurélien Campéas
parents: 2984
diff changeset
   754
            ui.status(_('marked working directory as topic: %s\n') % 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
   755
        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
   756
4231
3eb78bdcdd7c topic: improve UX by using pager only when we should
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4218
diff changeset
   757
    ui.pager('topics')
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   758
    # `hg topic --current`
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   759
    ret = 0
2985
f63c97c01f92 topics/ui: signal when the topics command creates a new (empty) topic
Aurélien Campéas
parents: 2984
diff changeset
   760
    if current and not ct:
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   761
        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
   762
        ret = 1
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   763
    elif current:
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   764
        fm = ui.formatter('topic', opts)
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   765
        namemask = '%s\n'
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   766
        label = 'topic.active'
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   767
        fm.startitem()
2985
f63c97c01f92 topics/ui: signal when the topics command creates a new (empty) topic
Aurélien Campéas
parents: 2984
diff changeset
   768
        fm.write('topic', namemask, ct, label=label)
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   769
        fm.end()
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   770
    else:
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   771
        _listtopics(ui, repo, opts)
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
   772
    return ret
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
   773
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
   774
@command('stack', [
4285
69fb9e41ce2b stack: add a --children flag to stack
James Reynolds <jreynolds@backstage.com>
parents: 4280
diff changeset
   775
        ('c', 'children', None,
69fb9e41ce2b stack: add a --children flag to stack
James Reynolds <jreynolds@backstage.com>
parents: 4280
diff changeset
   776
            _('display data about children outside of the stack'))
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
   777
    ] + 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
   778
    _('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
   779
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
   780
    """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
   781
2750
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2744
diff changeset
   782
    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
   783
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2744
diff changeset
   784
    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
   785
    """
1990
71410fa2c253 stack: extra argument validation logic outside of showstack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1989
diff changeset
   786
    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
   787
        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
   788
    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
   789
    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
   790
        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
   791
    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
   792
        branch = repo[None].branch()
3701
29c413a7dfb5 compat: drop compatibility layer for pager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3695
diff changeset
   793
    ui.pager('stack')
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
   794
    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
   795
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   796
@command('debugcb|debugconvertbookmark', [
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   797
        ('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
   798
        ('', '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
   799
    ],
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   800
    _('[-b BOOKMARK] [--all]'))
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   801
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
   802
    """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
   803
    """
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   804
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   805
    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
   806
    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
   807
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   808
    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
   809
        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
   810
    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
   811
        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
   812
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   813
    bmstore = repo._bookmarks
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   814
2900
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   815
    nodetobook = {}
4742
db3e7f6b5ceb py3: switch from iteritems() to items() in the topics extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 4719
diff changeset
   816
    for book, revnode in bmstore.items():
2900
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   817
        if nodetobook.get(revnode):
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   818
            nodetobook[revnode].append(book)
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   819
        else:
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   820
            nodetobook[revnode] = [book]
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   821
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   822
    # 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
   823
    # warning repeatedly
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   824
    skipped = []
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   825
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   826
    actions = {}
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   827
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   828
    lock = wlock = tr = None
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   829
    try:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   830
        wlock = repo.wlock()
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   831
        lock = repo.lock()
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   832
        if bookmark:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   833
            try:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   834
                node = bmstore[bookmark]
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   835
            except KeyError:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   836
                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
   837
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   838
            revnum = repo[node].rev()
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   839
            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
   840
                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
   841
                          "on it\n") % revnum)
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   842
                return
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   843
            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
   844
            if targetrevs:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   845
                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
   846
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   847
        elif convertall:
4742
db3e7f6b5ceb py3: switch from iteritems() to items() in the topics extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 4719
diff changeset
   848
            for bmark, revnode in sorted(bmstore.items()):
2900
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   849
                revnum = repo[revnode].rev()
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   850
                if revnum in skipped:
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   851
                    continue
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   852
                if len(nodetobook[revnode]) > 1:
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   853
                    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
   854
                              " it\n") % revnum)
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   855
                    skipped.append(revnum)
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
   856
                    continue
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   857
                if bmark == '@':
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   858
                    continue
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   859
                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
   860
                if targetrevs:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   861
                    actions[(bmark, revnum)] = targetrevs
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   862
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   863
        if actions:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   864
            try:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   865
                tr = repo.transaction('debugconvertbookmark')
4742
db3e7f6b5ceb py3: switch from iteritems() to items() in the topics extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 4719
diff changeset
   866
                for ((bmark, revnum), targetrevs) in sorted(actions.items()):
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   867
                    _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
   868
                tr.close()
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   869
            finally:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   870
                tr.release()
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   871
    finally:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
   872
        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
   873
2906
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
   874
# 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
   875
CONVERTBOOKREVSET = """
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
   876
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
   877
    ancestors(bookmark(%s))
2909
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   878
    and not ancestors(
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   879
        (
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   880
            (head() and not bookmark(%s))
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   881
            or (bookmark() - bookmark(%s))
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   882
        ) - (
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   883
            descendants(bookmark(%s))
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   884
            - 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
   885
        )
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
   886
    )
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
   887
)
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
   888
"""
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
   889
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   890
def _findconvertbmarktopic(repo, bmark):
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3195
diff changeset
   891
    """find revisions unambiguously defined by a bookmark
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   892
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   893
    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
   894
    """
2909
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
   895
    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
   896
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   897
def _applyconvertbmarktopic(ui, repo, revs, old, bmark, tr):
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3195
diff changeset
   898
    """apply bookmark conversion to topic
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   899
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   900
    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
   901
    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
   902
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   903
    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
   904
    """
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   905
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   906
    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
   907
    # 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
   908
    # 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
   909
    # 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
   910
    # changeset
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   911
    if rewrote == 0:
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   912
        return
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
   913
    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
   914
              rewrote))
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
   915
    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
   916
    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
   917
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
   918
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
   919
    """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
   920
9c0b293c2785 topics: move the logic to change or clear current topic into a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2657
diff changeset
   921
    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
   922
        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
   923
            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
   924
                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
   925
    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
   926
        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
   927
            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
   928
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
   929
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
   930
    """ 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
   931
    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
   932
    """
2642
92e882a82aaf topics: factor out the logic to change topic in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2625
diff changeset
   933
    rewrote = 0
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   934
    p1 = None
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   935
    p2 = None
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   936
    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
   937
    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
   938
        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
   939
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   940
        def filectxfn(repo, ctx, path):
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   941
            try:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   942
                return c[path]
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   943
            except error.ManifestLookupError:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   944
                return None
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   945
        fixedextra = dict(c.extra())
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   946
        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
   947
        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
   948
        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
   949
        if oldtopic == newtopic:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   950
            continue
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   951
        if newtopic is None:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   952
            del fixedextra[constants.extrakey]
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   953
        else:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   954
            fixedextra[constants.extrakey] = newtopic
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   955
        fixedextra[constants.changekey] = c.hex()
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   956
        if 'amend_source' in fixedextra:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   957
            # 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
   958
            # 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
   959
            # 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
   960
            # --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
   961
            # to not be so invasive.
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   962
            del fixedextra['amend_source']
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   963
        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
   964
            c, oldtopic, newtopic))
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   965
        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
   966
        # 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
   967
        # 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
   968
        # 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
   969
        p1 = c.p1().node()
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   970
        p2 = c.p2().node()
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   971
        if p1 in successors:
3038
103244e34a9c topics: use scmutil.cleanupnodes to create markers while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3030
diff changeset
   972
            p1 = successors[p1][0]
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   973
        if p2 in successors:
3038
103244e34a9c topics: use scmutil.cleanupnodes to create markers while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3030
diff changeset
   974
            p2 = successors[p2][0]
3040
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
   975
        mc = context.memctx(repo,
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
   976
                            (p1, p2),
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
   977
                            c.description(),
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
   978
                            c.files(),
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
   979
                            filectxfn,
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
   980
                            user=c.user(),
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
   981
                            date=c.date(),
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
   982
                            extra=fixedextra)
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
   983
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
   984
        # phase handling
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
   985
        commitphase = c.phase()
3150
95c77ef938ef compat: drop compatibility dance around configoverride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3141
diff changeset
   986
        overrides = {('phases', 'new-commit'): commitphase}
95c77ef938ef compat: drop compatibility dance around configoverride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3141
diff changeset
   987
        with repo.ui.configoverride(overrides, 'changetopic'):
3040
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
   988
            newnode = repo.commitctx(mc)
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
   989
3038
103244e34a9c topics: use scmutil.cleanupnodes to create markers while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3030
diff changeset
   990
        successors[c.node()] = (newnode,)
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   991
        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
   992
        rewrote += 1
3038
103244e34a9c topics: use scmutil.cleanupnodes to create markers while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3030
diff changeset
   993
103244e34a9c topics: use scmutil.cleanupnodes to create markers while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3030
diff changeset
   994
    # create obsmarkers and move bookmarks
3094
e11e018e8338 compat: add an abstraction for 'scmutil.cleanupnodes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3082
diff changeset
   995
    # XXX we should be creating marker as we go instead of only at the end,
e11e018e8338 compat: add an abstraction for 'scmutil.cleanupnodes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3082
diff changeset
   996
    # this makes the operations more modulars
3695
3680f715c14f compat: drop compat layer for cleanupnodes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3684
diff changeset
   997
    scmutil.cleanupnodes(repo, successors, 'changetopics')
3040
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
   998
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
   999
    # move the working copy too
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
  1000
    wctx = repo[None]
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
  1001
    # 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
  1002
    if len(wctx.parents()) == 1:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
  1003
        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
  1004
        if newid is not None:
3038
103244e34a9c topics: use scmutil.cleanupnodes to create markers while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3030
diff changeset
  1005
            hg.update(repo, newid[0], quietempty=True)
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
  1006
    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
  1007
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
  1008
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
  1009
    fm = ui.formatter('topics', opts)
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
  1010
    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
  1011
    namemask = '%s'
3060
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
  1012
    if repo.topics:
1987
d427fd97c9d5 topic: properly justify the verbose data when listing topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1985
diff changeset
  1013
        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
  1014
        namemask = '%%-%is' % maxwidth
4303
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1015
    if opts.get('age'):
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1016
        # here we sort by age and topic name
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1017
        topicsdata = sorted(_getlasttouched(repo, repo.topics))
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1018
    else:
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1019
        # here we sort by topic name only
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1020
        topicsdata = (
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1021
            (None, topic, None, None)
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1022
            for topic in sorted(repo.topics)
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1023
        )
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1024
    for age, topic, date, user in topicsdata:
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
  1025
        fm.startitem()
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
  1026
        marker = ' '
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
  1027
        label = 'topic'
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
  1028
        active = (topic == activetopic)
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
  1029
        if active:
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
  1030
            marker = '*'
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
  1031
            label = 'topic.active'
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
  1032
        if not ui.quiet:
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
  1033
            # 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
  1034
            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
  1035
        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
  1036
        fm.data(active=active)
3060
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
  1037
3372
4138771105bb topics: list only topic names in quiet mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3371
diff changeset
  1038
        if ui.quiet:
4138771105bb topics: list only topic names in quiet mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3371
diff changeset
  1039
            fm.plain('\n')
4138771105bb topics: list only topic names in quiet mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3371
diff changeset
  1040
            continue
4303
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1041
        fm.plain(' (')
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1042
        if date:
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1043
            if age == -1:
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1044
                timestr = 'empty and active'
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1045
            else:
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1046
                timestr = templatefilters.age(date)
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1047
            fm.write('lasttouched', '%s', timestr, label='topic.list.time')
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1048
        if user:
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1049
            fm.write('usertouched', ' by %s', user, label='topic.list.user')
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1050
        if date:
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
  1051
            fm.plain(', ')
3060
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
  1052
        data = stack.stack(repo, topic=topic)
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
  1053
        if ui.verbose:
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
  1054
            fm.write('branches+', 'on branch: %s',
3059
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
  1055
                     '+'.join(data.branches), # XXX use list directly after 4.0 is released
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
  1056
                     label='topic.list.branches')
3059
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
  1057
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
  1058
            fm.plain(', ')
3060
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
  1059
        fm.write('changesetcount', '%d changesets', data.changesetcount,
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
  1060
                 label='topic.list.changesetcount')
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
  1061
4581
48521a49a07e stack: rename troubledcount to unstablecount
Anton Shestakov <av6@dwimlabs.net>
parents: 4574
diff changeset
  1062
        if data.unstablecount:
3060
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
  1063
            fm.plain(', ')
4581
48521a49a07e stack: rename troubledcount to unstablecount
Anton Shestakov <av6@dwimlabs.net>
parents: 4574
diff changeset
  1064
            fm.write('unstablecount', '%d unstable',
48521a49a07e stack: rename troubledcount to unstablecount
Anton Shestakov <av6@dwimlabs.net>
parents: 4574
diff changeset
  1065
                     data.unstablecount,
48521a49a07e stack: rename troubledcount to unstablecount
Anton Shestakov <av6@dwimlabs.net>
parents: 4574
diff changeset
  1066
                     label='topic.list.unstablecount')
3059
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
  1067
3060
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
  1068
        headcount = len(data.heads)
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
  1069
        if 1 < headcount:
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
  1070
            fm.plain(', ')
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
  1071
            fm.write('headcount', '%d heads',
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
  1072
                     headcount,
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
  1073
                     label='topic.list.headcount.multiple')
3059
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
  1074
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
  1075
        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
  1076
            # XXX we should include the data even when not verbose
3059
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
  1077
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
  1078
            behindcount = data.behindcount
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
  1079
            if 0 < behindcount:
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
  1080
                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
  1081
                fm.write('behindcount', '%d behind',
3059
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
  1082
                         behindcount,
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
  1083
                         label='topic.list.behindcount')
3059
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
  1084
            elif -1 == behindcount:
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
  1085
                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
  1086
                fm.write('behinderror', '%s',
3059
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
  1087
                         _('ambiguous destination: %s') % data.behinderror,
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
  1088
                         label='topic.list.behinderror')
3060
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
  1089
        fm.plain(')\n')
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
  1090
    fm.end()
1974
20fb4195bfc4 topic: extract the code listing all topics
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1973
diff changeset
  1091
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
  1092
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
  1093
    """
4302
8e9940f1ae56 topic: simplify _showlasttouched and _getlasttouched (and its data structure)
Anton Shestakov <av6@dwimlabs.net>
parents: 4285
diff changeset
  1094
    Calculates the last time a topic was used. Returns a generator of 4-tuples:
8e9940f1ae56 topic: simplify _showlasttouched and _getlasttouched (and its data structure)
Anton Shestakov <av6@dwimlabs.net>
parents: 4285
diff changeset
  1095
    (age in seconds, topic name, date, and user who last touched the topic).
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
  1096
    """
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
  1097
    curtime = time.time()
4302
8e9940f1ae56 topic: simplify _showlasttouched and _getlasttouched (and its data structure)
Anton Shestakov <av6@dwimlabs.net>
parents: 4285
diff changeset
  1098
    for topic in topics:
8e9940f1ae56 topic: simplify _showlasttouched and _getlasttouched (and its data structure)
Anton Shestakov <av6@dwimlabs.net>
parents: 4285
diff changeset
  1099
        age = -1
2993
725b660d9886 topics: show the user who last touched the topic in --age
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2992
diff changeset
  1100
        user = None
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
  1101
        maxtime = (0, 0)
4302
8e9940f1ae56 topic: simplify _showlasttouched and _getlasttouched (and its data structure)
Anton Shestakov <av6@dwimlabs.net>
parents: 4285
diff changeset
  1102
        trevs = repo.revs("topic(%s)", topic)
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
  1103
        # 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
  1104
        # 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
  1105
        # 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
  1106
        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
  1107
            rt = repo[revs].date()
2993
725b660d9886 topics: show the user who last touched the topic in --age
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2992
diff changeset
  1108
            if rt[0] >= maxtime[0]:
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
  1109
                # 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
  1110
                # 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
  1111
                maxtime = rt
2993
725b660d9886 topics: show the user who last touched the topic in --age
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2992
diff changeset
  1112
                user = repo[revs].user()
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
  1113
            # 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
  1114
            # 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
  1115
            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
  1116
            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
  1117
                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
  1118
                if rt[0] > maxtime[0]:
2993
725b660d9886 topics: show the user who last touched the topic in --age
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2992
diff changeset
  1119
                    user = marker.metadata().get('user', user)
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
  1120
                    maxtime = rt
2993
725b660d9886 topics: show the user who last touched the topic in --age
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2992
diff changeset
  1121
3371
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3297
diff changeset
  1122
        username = stack.parseusername(user)
4302
8e9940f1ae56 topic: simplify _showlasttouched and _getlasttouched (and its data structure)
Anton Shestakov <av6@dwimlabs.net>
parents: 4285
diff changeset
  1123
        if trevs:
8e9940f1ae56 topic: simplify _showlasttouched and _getlasttouched (and its data structure)
Anton Shestakov <av6@dwimlabs.net>
parents: 4285
diff changeset
  1124
            age = curtime - maxtime[0]
2993
725b660d9886 topics: show the user who last touched the topic in --age
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2992
diff changeset
  1125
4302
8e9940f1ae56 topic: simplify _showlasttouched and _getlasttouched (and its data structure)
Anton Shestakov <av6@dwimlabs.net>
parents: 4285
diff changeset
  1126
        yield (age, topic, maxtime, username)
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
  1127
1848
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
  1128
def summaryhook(ui, repo):
3227
873d2f1949e1 topic: use more protective code to access current topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3194
diff changeset
  1129
    t = getattr(repo, 'currenttopic', '')
1848
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
  1130
    if not t:
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
  1131
        return
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
  1132
    # 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
  1133
    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
  1134
3022
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
  1135
_validmode = [
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
  1136
    'ignore',
3023
cc740c545776 topicmode: add new warning topicmode
Boris Feld <boris.feld@octobus.net>
parents: 3022
diff changeset
  1137
    'warning',
3022
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
  1138
    'enforce',
3025
e814c553ef32 topic: add a 'enforce-all' mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3024
diff changeset
  1139
    'enforce-all',
3028
c2d1f49ac7e2 topicmode: add 'random' topic mode
Boris Feld <boris.feld@octobus.net>
parents: 3027
diff changeset
  1140
    'random',
3030
581a6b9d2c8c test: add support for random-all topic mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3028
diff changeset
  1141
    'random-all',
3022
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
  1142
]
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
  1143
3020
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
  1144
def _configtopicmode(ui):
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
  1145
    """ Parse the config to get the topicmode
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
  1146
    """
3082
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
  1147
    topicmode = ui.config('experimental', 'topic-mode')
3020
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
  1148
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
  1149
    # Fallback to read enforce-topic
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
  1150
    if topicmode is None:
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
  1151
        enforcetopic = ui.configbool('experimental', 'enforce-topic')
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
  1152
        if enforcetopic:
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
  1153
            topicmode = "enforce"
3022
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
  1154
    if topicmode not in _validmode:
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
  1155
        topicmode = _validmode[0]
3020
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
  1156
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
  1157
    return topicmode
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
  1158
1850
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
  1159
def commitwrap(orig, ui, repo, *args, **opts):
4533
51317ce90bdc topic: only affect `hg commit` behavior for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4532
diff changeset
  1160
    if not hastopicext(repo):
51317ce90bdc topic: only affect `hg commit` behavior for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4532
diff changeset
  1161
        return 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
  1162
    with repo.wlock():
3020
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
  1163
        topicmode = _configtopicmode(ui)
3024
89855920fb0f topicmode: 'enforce' topic mode, no longer warn about untopiced merge
Boris Feld <boris.feld@octobus.net>
parents: 3023
diff changeset
  1164
        ismergecommit = len(repo[None].parents()) == 2
89855920fb0f topicmode: 'enforce' topic mode, no longer warn about untopiced merge
Boris Feld <boris.feld@octobus.net>
parents: 3023
diff changeset
  1165
89855920fb0f topicmode: 'enforce' topic mode, no longer warn about untopiced merge
Boris Feld <boris.feld@octobus.net>
parents: 3023
diff changeset
  1166
        notopic = not repo.currenttopic
89855920fb0f topicmode: 'enforce' topic mode, no longer warn about untopiced merge
Boris Feld <boris.feld@octobus.net>
parents: 3023
diff changeset
  1167
        mayabort = (topicmode == "enforce" and not ismergecommit)
89855920fb0f topicmode: 'enforce' topic mode, no longer warn about untopiced merge
Boris Feld <boris.feld@octobus.net>
parents: 3023
diff changeset
  1168
        maywarn = (topicmode == "warning"
89855920fb0f topicmode: 'enforce' topic mode, no longer warn about untopiced merge
Boris Feld <boris.feld@octobus.net>
parents: 3023
diff changeset
  1169
                   or (topicmode == "enforce" and ismergecommit))
89855920fb0f topicmode: 'enforce' topic mode, no longer warn about untopiced merge
Boris Feld <boris.feld@octobus.net>
parents: 3023
diff changeset
  1170
3030
581a6b9d2c8c test: add support for random-all topic mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3028
diff changeset
  1171
        mayrandom = False
581a6b9d2c8c test: add support for random-all topic mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3028
diff changeset
  1172
        if topicmode == "random":
581a6b9d2c8c test: add support for random-all topic mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3028
diff changeset
  1173
            mayrandom = not ismergecommit
581a6b9d2c8c test: add support for random-all topic mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3028
diff changeset
  1174
        elif topicmode == "random-all":
581a6b9d2c8c test: add support for random-all topic mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3028
diff changeset
  1175
            mayrandom = True
581a6b9d2c8c test: add support for random-all topic mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3028
diff changeset
  1176
3025
e814c553ef32 topic: add a 'enforce-all' mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3024
diff changeset
  1177
        if topicmode == 'enforce-all':
e814c553ef32 topic: add a 'enforce-all' mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3024
diff changeset
  1178
            ismergecommit = False
e814c553ef32 topic: add a 'enforce-all' mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3024
diff changeset
  1179
            mayabort = True
e814c553ef32 topic: add a 'enforce-all' mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3024
diff changeset
  1180
            maywarn = False
e814c553ef32 topic: add a 'enforce-all' mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3024
diff changeset
  1181
3027
b220e2f5ebd5 topic: update the topic-mode hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3026
diff changeset
  1182
        hint = _("see 'hg help -e topic.topic-mode' for details")
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
  1183
        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
  1184
            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
  1185
            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
  1186
                f.write(t)
3097
f06c86fd2ffd topic: do to check to topic while amending
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3096
diff changeset
  1187
        elif opts.get('amend'):
f06c86fd2ffd topic: do to check to topic while amending
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3096
diff changeset
  1188
            pass
3024
89855920fb0f topicmode: 'enforce' topic mode, no longer warn about untopiced merge
Boris Feld <boris.feld@octobus.net>
parents: 3023
diff changeset
  1189
        elif notopic and mayabort:
2733
adfbb984ebbb topics: check for topic on commit before a user enters message
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2731
diff changeset
  1190
            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
  1191
            raise error.Abort(msg, hint=hint)
3024
89855920fb0f topicmode: 'enforce' topic mode, no longer warn about untopiced merge
Boris Feld <boris.feld@octobus.net>
parents: 3023
diff changeset
  1192
        elif notopic and maywarn:
3023
cc740c545776 topicmode: add new warning topicmode
Boris Feld <boris.feld@octobus.net>
parents: 3022
diff changeset
  1193
            ui.warn(_("warning: new draft commit without topic\n"))
3027
b220e2f5ebd5 topic: update the topic-mode hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3026
diff changeset
  1194
            if not ui.quiet:
3096
c458c0856ee5 topic-mode: add missing end line in topic-mode warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3095
diff changeset
  1195
                ui.warn(("(%s)\n") % hint)
3030
581a6b9d2c8c test: add support for random-all topic mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3028
diff changeset
  1196
        elif notopic and mayrandom:
3028
c2d1f49ac7e2 topicmode: add 'random' topic mode
Boris Feld <boris.feld@octobus.net>
parents: 3027
diff changeset
  1197
            with repo.vfs.open('topic', 'w') as f:
c2d1f49ac7e2 topicmode: add 'random' topic mode
Boris Feld <boris.feld@octobus.net>
parents: 3027
diff changeset
  1198
                f.write(randomname.randomtopicname(ui))
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
  1199
        return orig(ui, repo, *args, **opts)
1850
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
  1200
1852
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
  1201
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
  1202
    ret = orig(repo, ctx, subs, extramsg)
4534
24662f94d126 topic: only wrap committext for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4533
diff changeset
  1203
    if hastopicext(repo):
24662f94d126 topic: only wrap committext for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4533
diff changeset
  1204
        t = repo.currenttopic
24662f94d126 topic: only wrap committext for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4533
diff changeset
  1205
        if t:
24662f94d126 topic: only wrap committext for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4533
diff changeset
  1206
            ret = ret.replace("\nHG: branch",
24662f94d126 topic: only wrap committext for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4533
diff changeset
  1207
                              "\nHG: topic '%s'\nHG: branch" % t)
1852
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
  1208
    return ret
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
  1209
2983
c0de0010ec30 topic: add a --topic option to "outgoing" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2982
diff changeset
  1210
def pushoutgoingwrap(orig, ui, repo, *args, **opts):
2982
fef934b7ed86 topic: add a --topic option to "push" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2939
diff changeset
  1211
    if opts.get('topic'):
fef934b7ed86 topic: add a --topic option to "push" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2939
diff changeset
  1212
        topicrevs = repo.revs('topic(%s) - obsolete()', opts['topic'])
fef934b7ed86 topic: add a --topic option to "push" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2939
diff changeset
  1213
        opts.setdefault('rev', []).extend(topicrevs)
fef934b7ed86 topic: add a --topic option to "push" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2939
diff changeset
  1214
    return orig(ui, repo, *args, **opts)
fef934b7ed86 topic: add a --topic option to "push" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2939
diff changeset
  1215
1877
69077c65919d topic: handle merge.update function signature change
Augie Fackler <raf@durin42.com>
parents: 1874
diff changeset
  1216
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
  1217
    matcher = kwargs.get('matcher')
e67c526c0a25 update: calculate 'partial' as core does
Sean Farley <sean@farley.io>
parents: 1963
diff changeset
  1218
    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
  1219
    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
  1220
    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
  1221
    ist0 = False
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
  1222
    try:
1877
69077c65919d topic: handle merge.update function signature change
Augie Fackler <raf@durin42.com>
parents: 1874
diff changeset
  1223
        ret = orig(repo, node, branchmerge, force, *args, **kwargs)
4535
8dae14cd076a topic: only wrap mergeupdate for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4534
diff changeset
  1224
        if not hastopicext(repo):
8dae14cd076a topic: only wrap mergeupdate for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4534
diff changeset
  1225
            return ret
2679
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
  1226
        # 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
  1227
        # 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
  1228
        # 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
  1229
        # 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
  1230
        # running.
2984
30f6030dca8f topics: signal to the end user when a topic has been forgotten
Aurélien Campéas
parents: 2983
diff changeset
  1231
        ot = repo.currenttopic
2679
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
  1232
        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
  1233
            isrebase = True
2740
51afc979d88d topic: rename the internal topic option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2733
diff changeset
  1234
        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
  1235
            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
  1236
        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
  1237
            t = ''
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
  1238
            pctx = repo[node]
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
  1239
            if pctx.phase() > phases.public:
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
  1240
                t = pctx.topic()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
  1241
            with repo.vfs.open('topic', 'w') as f:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
  1242
                f.write(t)
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
  1243
            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
  1244
                repo.ui.status(_("switching to topic %s\n") % t)
4044
c0fbe70f2e48 topic: check that repo.currenttopic is set before using it as an argument
Anton Shestakov <av6@dwimlabs.net>
parents: 4038
diff changeset
  1245
            if ot and not t:
4652
b72cd597a887 stack: check if stack is empty more pythonically
Anton Shestakov <av6@dwimlabs.net>
parents: 4647
diff changeset
  1246
                st = stack.stack(repo, topic=ot)
b72cd597a887 stack: check if stack is empty more pythonically
Anton Shestakov <av6@dwimlabs.net>
parents: 4647
diff changeset
  1247
                if not st:
4044
c0fbe70f2e48 topic: check that repo.currenttopic is set before using it as an argument
Anton Shestakov <av6@dwimlabs.net>
parents: 4038
diff changeset
  1248
                    repo.ui.status(_('clearing empty topic "%s"\n') % ot)
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
  1249
        elif ist0:
2984
30f6030dca8f topics: signal to the end user when a topic has been forgotten
Aurélien Campéas
parents: 2983
diff changeset
  1250
            repo.ui.status(_("preserving the current topic '%s'\n") % ot)
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
  1251
        return ret
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
  1252
    finally:
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
  1253
        wlock.release()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
  1254
2793
fb317d218af0 topic: wrap 'update' in a more flexible way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1255
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
  1256
4065
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
  1257
    thezeros = set(['t0', 'b0', 's0'])
2795
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2793
diff changeset
  1258
    backup = repo.ui.backupconfig('_internal', 'keep-topic')
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2793
diff changeset
  1259
    try:
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2793
diff changeset
  1260
        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
  1261
            repo.ui.setconfig('_internal', 'keep-topic', 'yes',
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2793
diff changeset
  1262
                              source='topic-extension')
3614
9ad461df4d4d compat: keep passing arguments as keyword argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3612
diff changeset
  1263
        return orig(ui, repo, node=node, rev=rev, *args, **kwargs)
2795
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2793
diff changeset
  1264
    finally:
0dc119ed06b4 compat: avoid using configoveride
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2793
diff changeset
  1265
        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
  1266
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
  1267
def _fixrebase(loaded):
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
  1268
    if not loaded:
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
  1269
        return
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
  1270
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
  1271
    def savetopic(ctx, extra):
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
  1272
        if ctx.topic():
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
  1273
            extra[constants.extrakey] = ctx.topic()
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
  1274
2679
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
  1275
    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
  1276
        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
  1277
                          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
  1278
        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
  1279
3612
33b718191bc9 rebase: update the rebase wrapping to works with hg 4.6
Boris Feld <boris.feld@octobus.net>
parents: 3603
diff changeset
  1280
    def new_init(orig, *args, **kwargs):
33b718191bc9 rebase: update the rebase wrapping to works with hg 4.6
Boris Feld <boris.feld@octobus.net>
parents: 3603
diff changeset
  1281
        runtime = orig(*args, **kwargs)
33b718191bc9 rebase: update the rebase wrapping to works with hg 4.6
Boris Feld <boris.feld@octobus.net>
parents: 3603
diff changeset
  1282
33b718191bc9 rebase: update the rebase wrapping to works with hg 4.6
Boris Feld <boris.feld@octobus.net>
parents: 3603
diff changeset
  1283
        if util.safehasattr(runtime, 'extrafns'):
33b718191bc9 rebase: update the rebase wrapping to works with hg 4.6
Boris Feld <boris.feld@octobus.net>
parents: 3603
diff changeset
  1284
            runtime.extrafns.append(savetopic)
33b718191bc9 rebase: update the rebase wrapping to works with hg 4.6
Boris Feld <boris.feld@octobus.net>
parents: 3603
diff changeset
  1285
33b718191bc9 rebase: update the rebase wrapping to works with hg 4.6
Boris Feld <boris.feld@octobus.net>
parents: 3603
diff changeset
  1286
        return runtime
33b718191bc9 rebase: update the rebase wrapping to works with hg 4.6
Boris Feld <boris.feld@octobus.net>
parents: 3603
diff changeset
  1287
1969
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
  1288
    try:
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
  1289
        rebase = extensions.find("rebase")
3612
33b718191bc9 rebase: update the rebase wrapping to works with hg 4.6
Boris Feld <boris.feld@octobus.net>
parents: 3603
diff changeset
  1290
        extensions.wrapfunction(rebase.rebaseruntime, '__init__', new_init)
2679
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
  1291
        # 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
  1292
        # 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
  1293
        # 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
  1294
        extensions.wrapcommand(rebase.cmdtable, 'rebase', setrebaseconfig)
1969
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
  1295
    except KeyError:
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
  1296
        pass
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
  1297
1946
72246b13bd72 patch: document the section about import/export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1945
diff changeset
  1298
## 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
  1299
1866
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
  1300
def _exporttopic(seq, ctx):
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
  1301
    topic = ctx.topic()
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
  1302
    if topic:
1917
ea4675c7a028 init: whitespace fixups
Sean Farley <sean@farley.io>
parents: 1916
diff changeset
  1303
        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
  1304
    return None
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
  1305
1867
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
  1306
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
  1307
    if 'topic' in patchdata:
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
  1308
        extra['topic'] = patchdata['topic']
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
  1309
1948
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
  1310
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
  1311
    """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
  1312
    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
  1313
    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
  1314
    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
  1315
    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
  1316
    patch.patchheadermap.append(('EXP-Topic', 'topic'))
2667
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
  1317
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
  1318
## preserve topic during split
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
  1319
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
  1320
def presplitupdatetopic(original, repo, ui, prev, ctx):
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
  1321
    # Save topic of revision
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
  1322
    topic = None
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
  1323
    if util.safehasattr(ctx, 'topic'):
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
  1324
        topic = ctx.topic()
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
  1325
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
  1326
    # Update the working directory
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
  1327
    original(repo, ui, prev, ctx)
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
  1328
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
  1329
    # Restore the topic if need
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
  1330
    if topic:
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
  1331
        _changecurrenttopic(repo, topic)