annotate hgext3rd/topic/__init__.py @ 6828:90f867d5be22

topic: make hg branch command output FQBN
author Anton Shestakov <av6@dwimlabs.net>
date Sun, 19 Nov 2023 23:00:11 -0300
parents ba7ede61f6d4
children c539a2fb600d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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
5798
87006dcf2bb7 doc: change topic phrase 'disappear' to 'fade out'
Chuck Tuffli <chuck@tuffli.net>
parents: 5742
diff changeset
7 Topic branches are lightweight branches which fade out when changes are
2011
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
6642
196babdbb593 topic: we no longer add --publish to push command, it's just there
Anton Shestakov <av6@dwimlabs.net>
parents: 6641
diff changeset
83 Topics vanish when changesets move to the public phase. Moving to the public
196babdbb593 topic: we no longer add --publish to push command, it's just there
Anton Shestakov <av6@dwimlabs.net>
parents: 6641
diff changeset
84 phase usually happens on push, but it is possible to modify this 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
6642
196babdbb593 topic: we no longer add --publish to push command, it's just there
Anton Shestakov <av6@dwimlabs.net>
parents: 6641
diff changeset
87 * everything pushed becomes public (the default)::
3764
f0f9139016d8 topic: use preformatted block for config snippets documentation
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 3725
diff changeset
88
5977
fa7f2e1cb504 topic: fix the help text to show how to disable publishing
Matt Harbison <matt_harbison@yahoo.com>
parents: 5952
diff changeset
89 [phases]
3765
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
6642
196babdbb593 topic: we no longer add --publish to push command, it's just there
Anton Shestakov <av6@dwimlabs.net>
parents: 6641
diff changeset
92 * nothing pushed turns 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
5977
fa7f2e1cb504 topic: fix the help text to show how to disable publishing
Matt Harbison <matt_harbison@yahoo.com>
parents: 5952
diff changeset
94 [phases]
3765
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
6642
196babdbb593 topic: we no longer add --publish to push command, it's just there
Anton Shestakov <av6@dwimlabs.net>
parents: 6641
diff changeset
97 * topic branches are not published, changesets 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
5977
fa7f2e1cb504 topic: fix the help text to show how to disable publishing
Matt Harbison <matt_harbison@yahoo.com>
parents: 5952
diff changeset
99 [phases]
3765
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
6642
196babdbb593 topic: we no longer add --publish to push command, it's just there
Anton Shestakov <av6@dwimlabs.net>
parents: 6641
diff changeset
104 In addition, :hg:`push` command has a ``--publish`` flag. When used, the pushed
196babdbb593 topic: we no longer add --publish to push command, it's just there
Anton Shestakov <av6@dwimlabs.net>
parents: 6641
diff changeset
105 revisions are published if the push succeeds. It also applies to common
196babdbb593 topic: we no longer add --publish to push command, it's just there
Anton Shestakov <av6@dwimlabs.net>
parents: 6641
diff changeset
106 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
6642
196babdbb593 topic: we no longer add --publish to push command, it's just there
Anton Shestakov <av6@dwimlabs.net>
parents: 6641
diff changeset
108 One can prevent any publishing from happening in a repository using::
4647
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
5139
19b8ffd23795 topic: option to hide topic changesets to plain client
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
113 Server side visibility
19b8ffd23795 topic: option to hide topic changesets to plain client
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
114 ======================
19b8ffd23795 topic: option to hide topic changesets to plain client
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
115
19b8ffd23795 topic: option to hide topic changesets to plain client
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
116 Serving changesets with topics to clients without topic extension can get
19b8ffd23795 topic: option to hide topic changesets to plain client
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
117 confusing. Such clients will have multiple anonymous heads without a clear way
19b8ffd23795 topic: option to hide topic changesets to plain client
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
118 to distinguish them. They will also "lose" the canonical heads of the branch.
19b8ffd23795 topic: option to hide topic changesets to plain client
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
119
19b8ffd23795 topic: option to hide topic changesets to plain client
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
120 To avoid this confusion, server can be configured to only serve changesets with
19b8ffd23795 topic: option to hide topic changesets to plain client
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
121 topics to clients with the topic extension (version 9.3+). This might become
19b8ffd23795 topic: option to hide topic changesets to plain client
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
122 the default in future::
19b8ffd23795 topic: option to hide topic changesets to plain client
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
123
19b8ffd23795 topic: option to hide topic changesets to plain client
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
124 [experimental]
19b8ffd23795 topic: option to hide topic changesets to plain client
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
125 topic.server-gate-topic-changesets = yes
5601
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
126
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
127 Explicitly merging in the target branch
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
128 =======================================
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
129
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
130 By default, Mercurial will not let your merge a topic into its target branch if
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
131 that topic is already based on the head of that branch. In other word,
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
132 Mercurial will not let your create a merge that will eventually have two
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
133 parents in the same branches, one parent being the ancestors of the other
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
134 parent. This behavior can be lifted using the following config::
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
135
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
136 [experimental]
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
137 topic.linear-merge = allow-from-bare-branch
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
138
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
139 When this option is set to `allow-from-bare-branch`, it is possible to merge a
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
140 topic branch from a bare branch (commit an active topic (eg: public one))
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
141 regardless of the topology. The result would typically looks like that::
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
142
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
143 @ summary: resulting merge commit
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
144 |\\ branch: my-branch
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
145 | |
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
146 | o summary: some more change in a topic, the merge "target"
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
147 | | branch: my-branch
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
148 | | topic: my-topic
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
149 | |
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
150 | o summary: some change in a topic
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
151 |/ branch: my-branch
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
152 | topic: my-topic
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
153 |
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
154 o summary: previous head of the branch, the merge "source"
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
155 | branch: my-branch
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
156 """
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
157
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
158 from __future__ import absolute_import
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
159
6657
1c998ed77597 topic: remove .hg/topic-namespace file if it has the default value
Anton Shestakov <av6@dwimlabs.net>
parents: 6656
diff changeset
160 import errno
3082
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
161 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
162 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
163 import time
2986
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
164 import weakref
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
165
1848
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
166 from mercurial.i18n import _
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
167 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
168 bookmarks,
6561
d08590ce067d topic: also add topic and topic namespace caches to bundlerepository
Anton Shestakov <av6@dwimlabs.net>
parents: 6560
diff changeset
169 bundlerepo,
2928
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
170 changelog,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
171 cmdutil,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
172 commands,
6334
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
173 configitems,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
174 context,
6825
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
175 dirstate,
6206
2ec9c87e8574 topic: allow unicode symbols in names as long as they are alphanumeric
Anton Shestakov <av6@dwimlabs.net>
parents: 6205
diff changeset
176 encoding,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
177 error,
5221
af9f40236037 topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5154
diff changeset
178 exchange,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
179 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
180 hg,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
181 localrepo,
2890
1e3d97486861 topics: import lock as lockmods
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2889
diff changeset
182 lock as lockmod,
6738
cf37748874f4 topic: add a simple debug command to list changesets with problematic tns
Anton Shestakov <av6@dwimlabs.net>
parents: 6737
diff changeset
183 logcmdutil,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
184 merge,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
185 namespaces,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
186 node,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
187 obsolete,
4942
acc7e27fa5c6 topic: drop compat.getmarkers() and use obsutil.getmarkers() directly
Anton Shestakov <av6@dwimlabs.net>
parents: 4921
diff changeset
188 obsutil,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
189 patch,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
190 phases,
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4748
diff changeset
191 pycompat,
2464
2b53a2a21bbb deprecation: fix cmdutil.command deprecation warning
Boris Feld <boris.feld@octobus.net>
parents: 2428
diff changeset
192 registrar,
6537
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
193 rewriteutil,
2889
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
194 scmutil,
6496
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
195 smartset,
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
196 templatefilters,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
197 util,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
198 )
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
199
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
200 from . import (
4531
1d1f8f56daac topic: introduce a `hastopicext(repo)` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4524
diff changeset
201 common,
6318
3e488afe62f5 topic: use compat.InputError for conflicting CLI flags
Anton Shestakov <av6@dwimlabs.net>
parents: 6311
diff changeset
202 compat,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
203 constants,
3532
68e99d2c6267 prev: fix the breakage of `hg previous` from obsolete cset
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3447
diff changeset
204 destination,
68e99d2c6267 prev: fix the breakage of `hg previous` from obsolete cset
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3447
diff changeset
205 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
206 flow,
3532
68e99d2c6267 prev: fix the breakage of `hg previous` from obsolete cset
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3447
diff changeset
207 randomname,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
208 revset as topicrevset,
5139
19b8ffd23795 topic: option to hide topic changesets to plain client
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
209 server,
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
210 stack,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
211 topicmap,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
212 )
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents: 1842
diff changeset
213
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
214 cmdtable = {}
3971
9f8b99b3d9b5 topic: drop compat layer for `command`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3945
diff changeset
215 command = registrar.command(cmdtable)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
216 colortable = {b'topic.active': b'green',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
217 b'topic.list.unstablecount': b'red',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
218 b'topic.list.headcount.multiple': b'yellow',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
219 b'topic.list.behindcount': b'cyan',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
220 b'topic.list.behinderror': b'red',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
221 b'stack.index': b'yellow',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
222 b'stack.index.base': b'none dim',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
223 b'stack.desc.base': b'none dim',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
224 b'stack.shortnode.base': b'none dim',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
225 b'stack.state.base': b'dim',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
226 b'stack.state.clean': b'green',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
227 b'stack.index.current': b'cyan', # random pick
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
228 b'stack.state.current': b'cyan bold', # random pick
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
229 b'stack.desc.current': b'cyan', # random pick
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
230 b'stack.shortnode.current': b'cyan', # random pick
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
231 b'stack.state.orphan': b'red',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
232 b'stack.state.content-divergent': b'red',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
233 b'stack.state.phase-divergent': b'red',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
234 b'stack.summary.behindcount': b'cyan',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
235 b'stack.summary.behinderror': b'red',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
236 b'stack.summary.headcount.multiple': b'yellow',
2340
e6d3b83b306b topic: configure some default color for topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2339
diff changeset
237 # 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
238 # (first pick I could think off, update as needed
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
239 b'log.topic': b'green_background',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
240 }
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
241
6599
6035b539aa3b branching: merge with stable
Anton Shestakov <av6@dwimlabs.net>
parents: 6598
diff changeset
242 __version__ = b'1.2.0.dev0'
3057
cb8ae3cb0bbc branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3040 3048
diff changeset
243
6822
ed00ed185249 branching: merge with stable
Anton Shestakov <av6@dwimlabs.net>
parents: 6775 6821
diff changeset
244 testedwith = b'5.6 5.7 5.8 5.9 6.0 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8'
6604
6116a0208449 topic: formally drop compatibility with hg 4.9 through 5.5
Anton Shestakov <av6@dwimlabs.net>
parents: 6600
diff changeset
245 minimumhgversion = b'5.6'
4713
fbe7f35a6926 py3: make metadata values be byte strings as Mercurial expects
Martin von Zweigbergk <martinvonz@google.com>
parents: 4704
diff changeset
246 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
247
6334
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
248 configtable = {}
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
249 configitem = registrar.configitem(configtable)
3082
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
250
6334
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
251 configitem(b'experimental', b'enforce-topic',
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
252 default=False,
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
253 )
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
254 configitem(b'experimental', b'enforce-single-head',
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
255 default=False,
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
256 )
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
257 configitem(b'experimental', b'topic-mode',
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
258 default=None,
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
259 )
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
260 configitem(b'experimental', b'topic.publish-bare-branch',
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
261 default=False,
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
262 )
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
263 configitem(b'experimental', b'topic.allow-publish',
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
264 default=configitems.dynamicdefault,
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
265 )
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
266 configitem(b'_internal', b'keep-topic',
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
267 default=False,
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
268 )
6336
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6334
diff changeset
269 # used for signaling that ctx.branch() shouldn't return fqbn even if topic is
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6334
diff changeset
270 # enabled for local repo
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6334
diff changeset
271 configitem(b'_internal', b'tns-disable-fqbn',
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6334
diff changeset
272 default=False,
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6334
diff changeset
273 )
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6334
diff changeset
274 # used for signaling that push will publish changesets
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6334
diff changeset
275 configitem(b'_internal', b'tns-publish',
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6334
diff changeset
276 default=False,
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6334
diff changeset
277 )
6564
2d3771d61068 topic: use a config option to signal explicit target arguments (for tns)
Anton Shestakov <av6@dwimlabs.net>
parents: 6561
diff changeset
278 # used for signaling that the current command has explicit target arguments
2d3771d61068 topic: use a config option to signal explicit target arguments (for tns)
Anton Shestakov <av6@dwimlabs.net>
parents: 6561
diff changeset
279 # (e.g. --rev or --branch) and we should ignore tns-default-* config
2d3771d61068 topic: use a config option to signal explicit target arguments (for tns)
Anton Shestakov <av6@dwimlabs.net>
parents: 6561
diff changeset
280 configitem(b'_internal', b'tns-explicit-target',
2d3771d61068 topic: use a config option to signal explicit target arguments (for tns)
Anton Shestakov <av6@dwimlabs.net>
parents: 6561
diff changeset
281 default=False,
2d3771d61068 topic: use a config option to signal explicit target arguments (for tns)
Anton Shestakov <av6@dwimlabs.net>
parents: 6561
diff changeset
282 )
6655
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
283 # used for selecting what topic and topic namespace values take priority during
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
284 # some history rewriting operations: 'local' prefers active topic and tns,
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
285 # 'other' prefers values in commit extras, if there are any
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
286 configitem(b'_internal', b'topic-source',
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
287 default=b'other',
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
288 )
6496
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
289 configitem(b'devel', b'tns-report-transactions',
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
290 default=lambda: [],
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
291 )
6537
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
292 # used for allowing users to rewrite history only in their "own" topic
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
293 # namespaces
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
294 configitem(b'experimental', b'tns-allow-rewrite',
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
295 default=configitems.dynamicdefault,
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
296 )
6548
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
297 configitem(b'experimental', b'tns-default-pull-namespaces',
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
298 default=configitems.dynamicdefault,
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
299 )
6743
ab60707314e9 topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents: 6740
diff changeset
300 configitem(b'experimental', b'tns-reject-push',
ab60707314e9 topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents: 6740
diff changeset
301 default=False,
ab60707314e9 topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents: 6740
diff changeset
302 )
6334
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
303 configitem(b'experimental', b'topic-mode.server',
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
304 default=configitems.dynamicdefault,
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
305 )
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
306 configitem(b'experimental', b'topic.server-gate-topic-changesets',
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
307 default=False,
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
308 )
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
309 configitem(b'experimental', b'topic.linear-merge',
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
310 default="reject",
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
311 )
3082
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
312
6334
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
313 def extsetup(ui):
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
314 # register config that strictly belong to other code (thg, core, etc)
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
315 #
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
316 # To ensure all config items we used are registered, we register them if
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
317 # nobody else did so far.
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
318 extraitem = functools.partial(configitems._register, ui._knownconfig)
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
319 if (b'experimental' not in ui._knownconfig
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
320 or not ui._knownconfig[b'experimental'].get(b'thg.displaynames')):
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
321 extraitem(b'experimental', b'thg.displaynames',
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
322 default=None,
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
323 )
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
324 if (b'devel' not in ui._knownconfig
6560
abbba073aa88 topic: check for devel.randomseed existence correctly
Anton Shestakov <av6@dwimlabs.net>
parents: 6552
diff changeset
325 or not ui._knownconfig[b'devel'].get(b'randomseed')):
6334
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
326 extraitem(b'devel', b'randomseed',
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
327 default=None,
ef8c1637321a topic: mercurial.configitems and mercurial.registrar.configitem is in hg 4.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
328 )
3082
326e0ee1eed1 topic: register config items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3071
diff changeset
329
6240
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
330 def _contexttns(self, force=False):
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
331 if not force and not self.mutable():
6487
963471ebe26a topic: make topic namespace use string "none" as the default/empty value
Anton Shestakov <av6@dwimlabs.net>
parents: 6480
diff changeset
332 return b'none'
6240
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
333 cache = getattr(self._repo, '_tnscache', None)
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
334 # topic loaded, but not enabled (eg: multiple repo in the same process)
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
335 if cache is None:
6487
963471ebe26a topic: make topic namespace use string "none" as the default/empty value
Anton Shestakov <av6@dwimlabs.net>
parents: 6480
diff changeset
336 return b'none'
6552
81e89d943a4e topic: pretend changeset has no topic namespace if it doesn't have a topic
Anton Shestakov <av6@dwimlabs.net>
parents: 6549
diff changeset
337 # topic namespace is meaningless when topic is not set
81e89d943a4e topic: pretend changeset has no topic namespace if it doesn't have a topic
Anton Shestakov <av6@dwimlabs.net>
parents: 6549
diff changeset
338 if not self.topic(force):
81e89d943a4e topic: pretend changeset has no topic namespace if it doesn't have a topic
Anton Shestakov <av6@dwimlabs.net>
parents: 6549
diff changeset
339 return b'none'
6240
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
340 if self.rev() is None:
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
341 # don't cache volatile ctx instances that aren't stored on-disk yet
6487
963471ebe26a topic: make topic namespace use string "none" as the default/empty value
Anton Shestakov <av6@dwimlabs.net>
parents: 6480
diff changeset
342 return self.extra().get(b'topic-namespace', b'none')
6240
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
343 tns = cache.get(self.rev())
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
344 if tns is None:
6487
963471ebe26a topic: make topic namespace use string "none" as the default/empty value
Anton Shestakov <av6@dwimlabs.net>
parents: 6480
diff changeset
345 tns = self.extra().get(b'topic-namespace', b'none')
6240
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
346 self._repo._tnscache[self.rev()] = tns
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
347 return tns
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
348
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
349 context.basectx.topic_namespace = _contexttns
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
350
2656
4a148ca3e80d topic: update the changectx method to respect phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2655
diff changeset
351 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
352 if not (force or self.mutable()):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
353 return b''
5701
5cbf9c2189fd topic: fix the newly added cache for repository without topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5687
diff changeset
354 cache = getattr(self._repo, '_topiccache', None)
5cbf9c2189fd topic: fix the newly added cache for repository without topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5687
diff changeset
355 # topic loaded, but not enabled (eg: multiple repo in the same process)
5cbf9c2189fd topic: fix the newly added cache for repository without topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5687
diff changeset
356 if cache is None:
5cbf9c2189fd topic: fix the newly added cache for repository without topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5687
diff changeset
357 return b''
6023
6c67219ce779 topic: don't cache topic of e.g. memctx in _topiccache (issue6500)
Anton Shestakov <av6@dwimlabs.net>
parents: 6017
diff changeset
358 if self.rev() is None:
6c67219ce779 topic: don't cache topic of e.g. memctx in _topiccache (issue6500)
Anton Shestakov <av6@dwimlabs.net>
parents: 6017
diff changeset
359 # don't cache volatile ctx instances that aren't stored on-disk yet
6c67219ce779 topic: don't cache topic of e.g. memctx in _topiccache (issue6500)
Anton Shestakov <av6@dwimlabs.net>
parents: 6017
diff changeset
360 return self.extra().get(constants.extrakey, b'')
5701
5cbf9c2189fd topic: fix the newly added cache for repository without topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5687
diff changeset
361 topic = cache.get(self.rev())
5680
18a70ae9fb0b topic: add a basic in-memory cache for topic information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5646
diff changeset
362 if topic is None:
18a70ae9fb0b topic: add a basic in-memory cache for topic information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5646
diff changeset
363 topic = self.extra().get(constants.extrakey, b'')
18a70ae9fb0b topic: add a basic in-memory cache for topic information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5646
diff changeset
364 self._repo._topiccache[self.rev()] = topic
18a70ae9fb0b topic: add a basic in-memory cache for topic information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5646
diff changeset
365 return topic
18a70ae9fb0b topic: add a basic in-memory cache for topic information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5646
diff changeset
366
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
367 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
368
2744
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
369 def _contexttopicidx(self):
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
370 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
371 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
372 # 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
373 # 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
374 return None
2915
b3abdb3d819e stack: replace 'getstack' with direct call to 'stack'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2912
diff changeset
375 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
376 try:
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
377 return revlist.index(self.rev())
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
378 except IndexError:
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
379 # 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
380 return None
ddfe336de779 topic: add a 'topicidx()' to context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2740
diff changeset
381 context.basectx.topicidx = _contexttopicidx
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
382
6242
a433fe0cea21 topic: add ctx.fqbn() method
Anton Shestakov <av6@dwimlabs.net>
parents: 6241
diff changeset
383 def _contextfqbn(self):
a433fe0cea21 topic: add ctx.fqbn() method
Anton Shestakov <av6@dwimlabs.net>
parents: 6241
diff changeset
384 """return branch//namespace/topic of the changeset, also known as fully
a433fe0cea21 topic: add ctx.fqbn() method
Anton Shestakov <av6@dwimlabs.net>
parents: 6241
diff changeset
385 qualified branch name
a433fe0cea21 topic: add ctx.fqbn() method
Anton Shestakov <av6@dwimlabs.net>
parents: 6241
diff changeset
386 """
6268
63d6cc96557c topic: get branch from extra data in ctx.fqbn()
Anton Shestakov <av6@dwimlabs.net>
parents: 6266
diff changeset
387 branch = encoding.tolocal(self.extra()[b'branch'])
63d6cc96557c topic: get branch from extra data in ctx.fqbn()
Anton Shestakov <av6@dwimlabs.net>
parents: 6266
diff changeset
388 return common.formatfqbn(branch, self.topic_namespace(), self.topic())
6242
a433fe0cea21 topic: add ctx.fqbn() method
Anton Shestakov <av6@dwimlabs.net>
parents: 6241
diff changeset
389
a433fe0cea21 topic: add ctx.fqbn() method
Anton Shestakov <av6@dwimlabs.net>
parents: 6241
diff changeset
390 context.basectx.fqbn = _contextfqbn
a433fe0cea21 topic: add ctx.fqbn() method
Anton Shestakov <av6@dwimlabs.net>
parents: 6241
diff changeset
391
4801
16c1398b0063 python3: prefix all regex to work with python 2 and 3
Raphaël Gomès <rgomes@octobus.net>
parents: 4791
diff changeset
392 stackrev = re.compile(br'^s\d+$')
16c1398b0063 python3: prefix all regex to work with python 2 and 3
Raphaël Gomès <rgomes@octobus.net>
parents: 4791
diff changeset
393 topicrev = re.compile(br'^t\d+$')
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
394
4531
1d1f8f56daac topic: introduce a `hastopicext(repo)` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4524
diff changeset
395 hastopicext = common.hastopicext
1d1f8f56daac topic: introduce a `hastopicext(repo)` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4524
diff changeset
396
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
397 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
398 revs = None
4065
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
399 if stackrev.match(name):
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
400 idx = int(name[1:])
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
401 tname = topic = repo.currenttopic
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
402 if topic:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
403 ttype = b'topic'
4065
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
404 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
405 else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
406 ttype = b'branch'
4065
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
407 tname = branch = repo[None].branch()
fbc51e98cf13 alias: allow reference through 's#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4044
diff changeset
408 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
409 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
410 idx = int(name[1:])
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
411 ttype = b'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
412 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
413 if not tname:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
414 raise error.Abort(_(b'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
415 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
416
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
417 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
418 try:
2712
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2711
diff changeset
419 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
420 except IndexError:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
421 if ttype == b'topic':
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
422 msg = _(b'cannot resolve "%s": %s "%s" has only %d changesets')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
423 elif ttype == b'branch':
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
424 msg = _(b'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
425 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
426 # 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
427 if r == -1 and idx == 0:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
428 msg = _(b'the %s "%s" has no %s')
2712
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2711
diff changeset
429 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
430 return [repo[r].node()]
2008
e3ddd696394f flake8: fix E713 style
Sean Farley <sean@farley.io>
parents: 2007
diff changeset
431 if name not in repo.topics:
2000
c413e7c96265 init: guard _namemap with repo.topics (issue5351)
timeless@gmail.com
parents: 1999
diff changeset
432 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
433 node = repo.changelog.node
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
434 return [node(rev) for rev in repo.revs(b'topic(%s)', name)]
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
435
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
436 def _nodemap(repo, node):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
437 ctx = repo[node]
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
438 t = ctx.topic()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
439 if t and ctx.phase() > phases.public:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
440 return [t]
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
441 return []
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
442
5685
7ee15bf011d6 topic: wrap branch call during summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5680
diff changeset
443 def wrap_summary(orig, ui, repo, *args, **kwargs):
7ee15bf011d6 topic: wrap branch call during summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5680
diff changeset
444 with discovery.override_context_branch(repo) as repo:
7ee15bf011d6 topic: wrap branch call during summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5680
diff changeset
445 return orig(ui, repo, *args, **kwargs)
7ee15bf011d6 topic: wrap branch call during summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5680
diff changeset
446
6376
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
447 def wrapwctxbranch(orig, self):
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
448 branch = orig(self)
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
449 return common.formatfqbn(branch=branch)
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
450
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
451 def wrapwctxdirty(orig, self, missing=False, merge=True, branch=True):
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
452 """check whether a working directory is modified"""
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
453 # check subrepos first
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
454 for s in sorted(self.substate):
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
455 if self.sub(s).dirty(missing=missing):
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
456 return True
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
457 # check current working dir
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
458 return (
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
459 (merge and self.p2())
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
460 or (branch and self.branch() != common.formatfqbn(branch=self.p1().branch()))
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
461 or self.modified()
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
462 or self.added()
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
463 or self.removed()
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
464 or (missing and self.deleted())
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
465 )
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
466
6496
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
467 def find_affected_tns(repo, tr):
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
468 origrepolen = tr.changes[b'origrepolen']
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
469 unfi = repo.unfiltered()
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
470
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
471 affected = set()
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
472 # These are the new changesets that weren't in the repo before this
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
473 # transaction
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
474 for rev in smartset.spanset(repo, start=origrepolen):
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
475 ctx = unfi[rev]
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
476 tns = ctx.topic_namespace()
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
477 affected.add(tns)
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
478
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
479 # These are the changesets obsoleted by this transaction
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
480 for rev in obsutil.getobsoleted(repo, tr):
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
481 ctx = unfi[rev]
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
482 tns = ctx.topic_namespace()
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
483 affected.add(tns)
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
484
6498
7ecb0f9cc7f3 topic: report namespace changes in more cases of phase movements
Anton Shestakov <av6@dwimlabs.net>
parents: 6497
diff changeset
485 # Phase movements, we only care about:
7ecb0f9cc7f3 topic: report namespace changes in more cases of phase movements
Anton Shestakov <av6@dwimlabs.net>
parents: 6497
diff changeset
486 # - publishing changesets (since they lose topic namespace)
7ecb0f9cc7f3 topic: report namespace changes in more cases of phase movements
Anton Shestakov <av6@dwimlabs.net>
parents: 6497
diff changeset
487 # - forcefully making changesets draft again
7ecb0f9cc7f3 topic: report namespace changes in more cases of phase movements
Anton Shestakov <av6@dwimlabs.net>
parents: 6497
diff changeset
488 # - turning secret changesets draft and making them visible to peers
7ecb0f9cc7f3 topic: report namespace changes in more cases of phase movements
Anton Shestakov <av6@dwimlabs.net>
parents: 6497
diff changeset
489 tnsphases = (phases.secret, phases.draft)
6702
691a9301b51e topic: drop compatibility for tr.changes[b'phases'] being a dict in hg 5.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6701
diff changeset
490 for revs, (old, new) in tr.changes[b'phases']:
6498
7ecb0f9cc7f3 topic: report namespace changes in more cases of phase movements
Anton Shestakov <av6@dwimlabs.net>
parents: 6497
diff changeset
491 if old not in tnsphases and new not in tnsphases:
7ecb0f9cc7f3 topic: report namespace changes in more cases of phase movements
Anton Shestakov <av6@dwimlabs.net>
parents: 6497
diff changeset
492 # Skip phase movement if there is no phase (old or new) that has
7ecb0f9cc7f3 topic: report namespace changes in more cases of phase movements
Anton Shestakov <av6@dwimlabs.net>
parents: 6497
diff changeset
493 # visible topic namespace (i.e. draft and secret)
6496
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
494 continue
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
495 revs = [rev for rev in revs if rev < origrepolen]
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
496 for rev in revs:
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
497 ctx = unfi[rev]
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
498 tns = ctx.topic_namespace(force=True)
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
499 affected.add(tns)
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
500
6497
4e0f760d332e topic: also find and report topic namespace changes caused by bookmarks
Anton Shestakov <av6@dwimlabs.net>
parents: 6496
diff changeset
501 # We want to detect any bookmark movement, even within one topic namespace
4e0f760d332e topic: also find and report topic namespace changes caused by bookmarks
Anton Shestakov <av6@dwimlabs.net>
parents: 6496
diff changeset
502 for name, nodes in tr.changes[b'bookmarks'].items():
4e0f760d332e topic: also find and report topic namespace changes caused by bookmarks
Anton Shestakov <av6@dwimlabs.net>
parents: 6496
diff changeset
503 for n in nodes:
4e0f760d332e topic: also find and report topic namespace changes caused by bookmarks
Anton Shestakov <av6@dwimlabs.net>
parents: 6496
diff changeset
504 if n is not None and n in unfi:
4e0f760d332e topic: also find and report topic namespace changes caused by bookmarks
Anton Shestakov <av6@dwimlabs.net>
parents: 6496
diff changeset
505 ctx = unfi[n]
4e0f760d332e topic: also find and report topic namespace changes caused by bookmarks
Anton Shestakov <av6@dwimlabs.net>
parents: 6496
diff changeset
506 tns = ctx.topic_namespace()
4e0f760d332e topic: also find and report topic namespace changes caused by bookmarks
Anton Shestakov <av6@dwimlabs.net>
parents: 6496
diff changeset
507 affected.add(tns)
4e0f760d332e topic: also find and report topic namespace changes caused by bookmarks
Anton Shestakov <av6@dwimlabs.net>
parents: 6496
diff changeset
508
6496
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
509 # We don't care about changesets without topic namespace
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
510 affected.discard(b'none')
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
511
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
512 tr.changes[b'tns'] = affected
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
513 report_affected_tns(repo, tr)
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
514
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
515 def report_affected_tns(repo, tr):
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
516 report = set(repo.ui.configlist(b'devel', b'tns-report-transactions'))
6545
7b2bd0332b56 topic: transaction names sometimes need stripping of URLs
Anton Shestakov <av6@dwimlabs.net>
parents: 6544
diff changeset
517 # transaction names sometimes also have a URL after a newline byte
7b2bd0332b56 topic: transaction names sometimes need stripping of URLs
Anton Shestakov <av6@dwimlabs.net>
parents: 6544
diff changeset
518 trnames = (trname.partition(b'\n')[0] for trname in tr._names)
6496
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
519 if b'*' not in report:
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
520 # * matches any transaction
6545
7b2bd0332b56 topic: transaction names sometimes need stripping of URLs
Anton Shestakov <av6@dwimlabs.net>
parents: 6544
diff changeset
521 if not any(trname in report for trname in trnames):
6496
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
522 return
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
523
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
524 if tr.changes[b'tns']:
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
525 repo.ui.status(b'topic namespaces affected: %s\n' % b' '.join(sorted(tr.changes[b'tns'])))
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
526
6645
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
527 def wrapmakebundlerepository(orig, ui, repopath, bundlepath):
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
528 repo = orig(ui, repopath, bundlepath)
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
529
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
530 # We want bundle repos to also have caches for topic extension, because we
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
531 # want to, for example, see topic and topic namespaces in `hg incoming`
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
532 # regardless if the bundle repo has topic extension, as long as local repo
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
533 # has topic enabled.
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
534 class topicbundlerepo(repo.__class__):
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
535 @util.propertycache
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
536 def _tnscache(self):
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
537 return {}
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
538
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
539 @util.propertycache
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
540 def _topiccache(self):
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
541 return {}
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
542
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
543 def invalidatecaches(self):
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
544 self._tnscache.clear()
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
545 self._topiccache.clear()
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
546 super(topicbundlerepo, self).invalidatecaches()
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
547
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
548 repo.__class__ = topicbundlerepo
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
549 return repo
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
550
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1867
diff changeset
551 def uisetup(ui):
1941
7eb737b7a902 destination: rename 'setupdest' to 'modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1939
diff changeset
552 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
553 discovery.modsetup(ui)
1952
665d6322994e uisetup: add call to 'topicmap.modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1951
diff changeset
554 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
555 setupimportexport(ui)
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1867
diff changeset
556
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
557 extensions.afterloaded(b'rebase', _fixrebase)
1951
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
558
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
559 entry = extensions.wrapcommand(commands.table, b'commit', commitwrap)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
560 entry[1].append((b't', b'topic', b'',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
561 _(b"use specified topic"), _(b'TOPIC')))
1951
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
562
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
563 entry = extensions.wrapcommand(commands.table, b'push', pushoutgoingwrap)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
564 entry[1].append((b't', b'topic', b'',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
565 _(b"topic to push"), _(b'TOPIC')))
2983
c0de0010ec30 topic: add a --topic option to "outgoing" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2982
diff changeset
566
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
567 entry = extensions.wrapcommand(commands.table, b'outgoing',
2983
c0de0010ec30 topic: add a --topic option to "outgoing" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2982
diff changeset
568 pushoutgoingwrap)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
569 entry[1].append((b't', b'topic', b'',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
570 _(b"topic to push"), _(b'TOPIC')))
2982
fef934b7ed86 topic: add a --topic option to "push" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2939
diff changeset
571
1951
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
572 extensions.wrapfunction(cmdutil, 'buildcommittext', committextwrap)
5608
d9ee2706487f compat: add support for upstream rename of merge.update() to _update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5531
diff changeset
573 if util.safehasattr(merge, '_update'):
d9ee2706487f compat: add support for upstream rename of merge.update() to _update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5531
diff changeset
574 extensions.wrapfunction(merge, '_update', mergeupdatewrap)
d9ee2706487f compat: add support for upstream rename of merge.update() to _update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5531
diff changeset
575 else:
d9ee2706487f compat: add support for upstream rename of merge.update() to _update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5531
diff changeset
576 # hg <= 5.5 (2c86b9587740)
d9ee2706487f compat: add support for upstream rename of merge.update() to _update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5531
diff changeset
577 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
578 # 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
579 # 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
580 # 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
581 # plug into logic for this into mergemod.update().
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
582 extensions.wrapcommand(commands.table, b'update', checkt0)
2667
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
583
5685
7ee15bf011d6 topic: wrap branch call during summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5680
diff changeset
584 extensions.wrapcommand(commands.table, b'summary', wrap_summary)
7ee15bf011d6 topic: wrap branch call during summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5680
diff changeset
585
6828
90f867d5be22 topic: make hg branch command output FQBN
Anton Shestakov <av6@dwimlabs.net>
parents: 6825
diff changeset
586 extensions.wrapcommand(commands.table, b'branch', wrap_branch_cmd)
90f867d5be22 topic: make hg branch command output FQBN
Anton Shestakov <av6@dwimlabs.net>
parents: 6825
diff changeset
587
2667
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
588 try:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
589 evolve = extensions.find(b'evolve')
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2750
diff changeset
590 extensions.wrapfunction(evolve.rewriteutil, "presplitupdate",
6417
c37754bb02d4 topic: rename presplitupdatetopic() to wrappresplitupdate()
Anton Shestakov <av6@dwimlabs.net>
parents: 6410
diff changeset
591 wrappresplitupdate)
2667
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
592 except (KeyError, AttributeError):
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
593 pass
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
594
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
595 cmdutil.summaryhooks.add(b'topic', summaryhook)
1951
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
596
3281
703e8398ac57 topic: move function wrapping from reposetup to uisetup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3235
diff changeset
597 # 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
598 extensions.wrapfunction(context.workingctx, '__init__', wrapinit)
6376
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
599 # Wrap workingctx.branch() to return branch name in the "//" format
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
600 extensions.wrapfunction(context.workingctx, 'branch', wrapwctxbranch)
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
601 # Wrap workingctx.dirty() to check branch//namespace/topic
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6371
diff changeset
602 extensions.wrapfunction(context.workingctx, 'dirty', wrapwctxdirty)
3281
703e8398ac57 topic: move function wrapping from reposetup to uisetup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3235
diff changeset
603 # 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
604 extensions.wrapfunction(changelog.changelog, 'add', wrapadd)
5221
af9f40236037 topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5154
diff changeset
605 # Make exchange._checkpublish handle experimental.topic.publish-bare-branch
6643
4f0ec124224f evolve: drop compatibility for experimental.auto-publish for hg 4.8
Anton Shestakov <av6@dwimlabs.net>
parents: 6642
diff changeset
606 extensions.wrapfunction(exchange, '_checkpublish',
4f0ec124224f evolve: drop compatibility for experimental.auto-publish for hg 4.8
Anton Shestakov <av6@dwimlabs.net>
parents: 6642
diff changeset
607 flow.replacecheckpublish)
1951
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
608
6117
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
609 try:
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
610 histedit = extensions.find(b'histedit')
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
611 except KeyError:
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
612 pass
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
613 else:
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
614 # Make histedit preserve topics of edited commits
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
615 extensions.wrapfunction(histedit.histeditaction, 'applychange',
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
616 applychangewrap)
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
617
6537
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
618 # Wrapping precheck() both in core and in evolve to make sure all rewrite
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
619 # operations that could use precheck() are covered
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
620 extensions.wrapfunction(rewriteutil, 'precheck', wrapprecheck)
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
621 try:
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
622 evolve = extensions.find(b'evolve')
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
623 extensions.wrapfunction(evolve.rewriteutil, 'precheck', wrapprecheck)
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
624 except (KeyError, AttributeError):
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
625 pass
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
626
6645
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
627 extensions.wrapfunction(bundlerepo, 'makebundlerepository', wrapmakebundlerepository)
6561
d08590ce067d topic: also add topic and topic namespace caches to bundlerepository
Anton Shestakov <av6@dwimlabs.net>
parents: 6560
diff changeset
628
6645
4443117fdf94 topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856)
Anton Shestakov <av6@dwimlabs.net>
parents: 6612
diff changeset
629 server.setupserver(ui)
6561
d08590ce067d topic: also add topic and topic namespace caches to bundlerepository
Anton Shestakov <av6@dwimlabs.net>
parents: 6560
diff changeset
630
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
631 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
632 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
633 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
634
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
635 repo = repo.unfiltered()
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
636
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
637 if repo.ui.config(b'experimental', b'thg.displaynames') is None:
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
638 repo.ui.setconfig(b'experimental', b'thg.displaynames', b'topics',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
639 source=b'topic-extension')
2339
f641cccbd119 topic: automatically configure thg to display topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2288
diff changeset
640
5688
b1e057fb7837 topic: disable inmemory rebase to avoid losing the topic
Matt Harbison <matt_harbison@yahoo.com>
parents: 5644
diff changeset
641 # BUG: inmemory rebase drops the topic, and fails to switch to the new
b1e057fb7837 topic: disable inmemory rebase to avoid losing the topic
Matt Harbison <matt_harbison@yahoo.com>
parents: 5644
diff changeset
642 # topic. Disable inmemory rebase for now.
b1e057fb7837 topic: disable inmemory rebase to avoid losing the topic
Matt Harbison <matt_harbison@yahoo.com>
parents: 5644
diff changeset
643 if repo.ui.configbool(b'rebase', b'experimental.inmemory'):
b1e057fb7837 topic: disable inmemory rebase to avoid losing the topic
Matt Harbison <matt_harbison@yahoo.com>
parents: 5644
diff changeset
644 repo.ui.setconfig(b'rebase', b'experimental.inmemory', b'False',
b1e057fb7837 topic: disable inmemory rebase to avoid losing the topic
Matt Harbison <matt_harbison@yahoo.com>
parents: 5644
diff changeset
645 source=b'topic-extension')
b1e057fb7837 topic: disable inmemory rebase to avoid losing the topic
Matt Harbison <matt_harbison@yahoo.com>
parents: 5644
diff changeset
646
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
647 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
648
4531
1d1f8f56daac topic: introduce a `hastopicext(repo)` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4524
diff changeset
649 # 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
650 hastopicext = True
1d1f8f56daac topic: introduce a `hastopicext(repo)` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4524
diff changeset
651
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
652 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
653 caps = super(topicrepo, self)._restrictcapabilities(caps)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
654 caps.add(b'topics')
6296
a2855aff1268 topic: call a different wire protocol command to get tns-aware branchmap
Anton Shestakov <av6@dwimlabs.net>
parents: 6294
diff changeset
655 caps.add(b'topics-namespaces')
5251
2de59d916266 auto-publish: issue the capabilities in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5242
diff changeset
656 if self.ui.configbool(b'phases', b'publish'):
2de59d916266 auto-publish: issue the capabilities in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5242
diff changeset
657 mode = b'all'
2de59d916266 auto-publish: issue the capabilities in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5242
diff changeset
658 elif self.ui.configbool(b'experimental',
2de59d916266 auto-publish: issue the capabilities in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5242
diff changeset
659 b'topic.publish-bare-branch'):
2de59d916266 auto-publish: issue the capabilities in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5242
diff changeset
660 mode = b'auto'
2de59d916266 auto-publish: issue the capabilities in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5242
diff changeset
661 else:
2de59d916266 auto-publish: issue the capabilities in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5242
diff changeset
662 mode = b'none'
2de59d916266 auto-publish: issue the capabilities in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5242
diff changeset
663 caps.add(b'ext-topics-publish=%s' % mode)
6548
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
664 caps.add(b'ext-topics-tns-heads')
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
665 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
666
1858
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
667 def commit(self, *args, **kwargs):
5007
de0151ba3e46 topic: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4942
diff changeset
668 configoverride = util.nullcontextmanager()
de0151ba3e46 topic: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4942
diff changeset
669 if self.currenttopic != self[b'.'].topic():
de0151ba3e46 topic: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4942
diff changeset
670 # bypass the core "nothing changed" logic
de0151ba3e46 topic: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4942
diff changeset
671 configoverride = self.ui.configoverride({
de0151ba3e46 topic: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4942
diff changeset
672 (b'ui', b'allowemptycommit'): True
6655
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
673 }, b'topic-extension')
5007
de0151ba3e46 topic: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4942
diff changeset
674 with configoverride:
2288
b6ea9049693d topic: directly use "super" call
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2012
diff changeset
675 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
676
4842
ee0866a279da topic: fix some API to make it more robust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 4790
diff changeset
677 def commitctx(self, ctx, *args, **kwargs):
1855
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
678 if isinstance(ctx, context.workingcommitctx):
6655
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
679 tns = self.currenttns
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
680 topic = self.currenttopic
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
681 # topic source:
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
682 # - 'local': we need to put currently active tns and topic into
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
683 # commit extras in any case
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
684 # - 'other': we could use active tns and topic, but only if
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
685 # commit extras don't already have them
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
686 ts = self.ui.config(b'_internal', b'topic-source')
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
687 if ts == b'local' or (tns != b'none' and b'topic-namespace' not in ctx.extra()):
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
688 # default value will be dropped from extra later on
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
689 ctx.extra()[b'topic-namespace'] = tns
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
690 if ts == b'local' or (topic and constants.extrakey not in ctx.extra()):
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
691 # empty value will be dropped from extra later on
81fe0a498447 topic: internal config option to fix hg pick behavior (issue6406)
Anton Shestakov <av6@dwimlabs.net>
parents: 6645
diff changeset
692 ctx.extra()[constants.extrakey] = topic
4842
ee0866a279da topic: fix some API to make it more robust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 4790
diff changeset
693 return super(topicrepo, self).commitctx(ctx, *args, **kwargs)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
694
5680
18a70ae9fb0b topic: add a basic in-memory cache for topic information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5646
diff changeset
695 @util.propertycache
6238
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
696 def _tnscache(self):
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
697 return {}
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
698
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
699 @property
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
700 def topic_namespaces(self):
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
701 if self._topic_namespaces is not None:
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
702 return self._topic_namespaces
6489
71a8d4db4f55 topic: don't show "none" in the list of topic namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6487
diff changeset
703 namespaces = set([b'none', self.currenttns])
6238
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
704 for c in self.set(b'not public()'):
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
705 namespaces.add(c.topic_namespace())
6489
71a8d4db4f55 topic: don't show "none" in the list of topic namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6487
diff changeset
706 namespaces.remove(b'none')
6238
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
707 self._topic_namespaces = namespaces
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
708 return namespaces
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
709
6735
5b08e93a982e topic: run _cleanup_tns_file() when acquiring fresh wlock
Anton Shestakov <av6@dwimlabs.net>
parents: 6734
diff changeset
710 def wlock(self, wait=True):
6737
08a9113a15ee topic: rename the lock variable to wlock in topicrepo.wlock()
Anton Shestakov <av6@dwimlabs.net>
parents: 6736
diff changeset
711 wlock = super(topicrepo, self).wlock(wait=wait)
6735
5b08e93a982e topic: run _cleanup_tns_file() when acquiring fresh wlock
Anton Shestakov <av6@dwimlabs.net>
parents: 6734
diff changeset
712 # we should definitely drop this at some point, but it depends on
5b08e93a982e topic: run _cleanup_tns_file() when acquiring fresh wlock
Anton Shestakov <av6@dwimlabs.net>
parents: 6734
diff changeset
713 # our own release schedule, not core's, so here's hg 1.0
5b08e93a982e topic: run _cleanup_tns_file() when acquiring fresh wlock
Anton Shestakov <av6@dwimlabs.net>
parents: 6734
diff changeset
714 # hg <= 1.0 (cfa08c88a5c4)
6737
08a9113a15ee topic: rename the lock variable to wlock in topicrepo.wlock()
Anton Shestakov <av6@dwimlabs.net>
parents: 6736
diff changeset
715 if wlock is not None and wlock.held:
6736
ce3723b78f91 topic: drop _cleanup_tns_file(), move code directly into wlock()
Anton Shestakov <av6@dwimlabs.net>
parents: 6735
diff changeset
716 try:
ce3723b78f91 topic: drop _cleanup_tns_file(), move code directly into wlock()
Anton Shestakov <av6@dwimlabs.net>
parents: 6735
diff changeset
717 if self.vfs.read(b'topic-namespace') == b'none':
ce3723b78f91 topic: drop _cleanup_tns_file(), move code directly into wlock()
Anton Shestakov <av6@dwimlabs.net>
parents: 6735
diff changeset
718 repo.vfs.unlinkpath(b'topic-namespace')
ce3723b78f91 topic: drop _cleanup_tns_file(), move code directly into wlock()
Anton Shestakov <av6@dwimlabs.net>
parents: 6735
diff changeset
719 except IOError as err:
ce3723b78f91 topic: drop _cleanup_tns_file(), move code directly into wlock()
Anton Shestakov <av6@dwimlabs.net>
parents: 6735
diff changeset
720 if err.errno != errno.ENOENT:
ce3723b78f91 topic: drop _cleanup_tns_file(), move code directly into wlock()
Anton Shestakov <av6@dwimlabs.net>
parents: 6735
diff changeset
721 raise
6737
08a9113a15ee topic: rename the lock variable to wlock in topicrepo.wlock()
Anton Shestakov <av6@dwimlabs.net>
parents: 6736
diff changeset
722 return wlock
6735
5b08e93a982e topic: run _cleanup_tns_file() when acquiring fresh wlock
Anton Shestakov <av6@dwimlabs.net>
parents: 6734
diff changeset
723
6734
c2a4e21f4aaf topic: move .hg/topic-namespace file removal to a separate method
Anton Shestakov <av6@dwimlabs.net>
parents: 6732
diff changeset
724 @property
c2a4e21f4aaf topic: move .hg/topic-namespace file removal to a separate method
Anton Shestakov <av6@dwimlabs.net>
parents: 6732
diff changeset
725 def currenttns(self):
6825
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
726 return self.dirstate.tns()
6238
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
727
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
728 @util.propertycache
5680
18a70ae9fb0b topic: add a basic in-memory cache for topic information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5646
diff changeset
729 def _topiccache(self):
18a70ae9fb0b topic: add a basic in-memory cache for topic information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5646
diff changeset
730 return {}
18a70ae9fb0b topic: add a basic in-memory cache for topic information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5646
diff changeset
731
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
732 @property
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
733 def topics(self):
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
734 if self._topics is not None:
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
735 return self._topics
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
736 topics = set([b'', self.currenttopic])
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
737 for c in self.set(b'not public()'):
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
738 topics.add(c.topic())
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
739 topics.remove(b'')
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
740 self._topics = topics
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
741 return topics
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
742
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
743 @property
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
744 def currenttopic(self):
6825
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
745 return self.dirstate.topic()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
746
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
747 # overwritten at the instance level by topicmap.py
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
748 _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
749
6271
caf302fb8f4d topic: use branch//namespace/topic format everywhere except exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6268
diff changeset
750 def branchmap(self, topic=None, convertbm=False):
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
751 if topic is None:
3880
28dadd024299 topic: use self instead of repo in topicrepo methods
Anton Shestakov <av6@dwimlabs.net>
parents: 3834
diff changeset
752 topic = getattr(self, '_autobranchmaptopic', False)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
753 topicfilter = topicmap.topicfilter(self.filtername)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
754 if not topic or topicfilter == self.filtername:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2652
diff changeset
755 return super(topicrepo, self).branchmap()
6271
caf302fb8f4d topic: use branch//namespace/topic format everywhere except exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6268
diff changeset
756 bm = self.filtered(topicfilter).branchmap()
caf302fb8f4d topic: use branch//namespace/topic format everywhere except exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6268
diff changeset
757 if convertbm:
6745
71c4b6c2bcdc topic: drop branchmap._entries compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6744
diff changeset
758 for key in list(bm._entries):
6271
caf302fb8f4d topic: use branch//namespace/topic format everywhere except exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6268
diff changeset
759 branch, tns, topic = common.parsefqbn(key)
caf302fb8f4d topic: use branch//namespace/topic format everywhere except exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6268
diff changeset
760 if topic:
6745
71c4b6c2bcdc topic: drop branchmap._entries compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6744
diff changeset
761 value = bm._entries.pop(key)
6271
caf302fb8f4d topic: use branch//namespace/topic format everywhere except exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6268
diff changeset
762 # we lose namespace when converting to ":" format
caf302fb8f4d topic: use branch//namespace/topic format everywhere except exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6268
diff changeset
763 key = b'%s:%s' % (branch, topic)
6745
71c4b6c2bcdc topic: drop branchmap._entries compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6744
diff changeset
764 bm._entries[key] = value
6271
caf302fb8f4d topic: use branch//namespace/topic format everywhere except exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6268
diff changeset
765 return bm
1889
d9b929bcc3ad topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1888
diff changeset
766
6296
a2855aff1268 topic: call a different wire protocol command to get tns-aware branchmap
Anton Shestakov <av6@dwimlabs.net>
parents: 6294
diff changeset
767 def branchmaptns(self, topic=None):
a2855aff1268 topic: call a different wire protocol command to get tns-aware branchmap
Anton Shestakov <av6@dwimlabs.net>
parents: 6294
diff changeset
768 """branchmap using fqbn as keys"""
a2855aff1268 topic: call a different wire protocol command to get tns-aware branchmap
Anton Shestakov <av6@dwimlabs.net>
parents: 6294
diff changeset
769 if topic is None:
a2855aff1268 topic: call a different wire protocol command to get tns-aware branchmap
Anton Shestakov <av6@dwimlabs.net>
parents: 6294
diff changeset
770 topic = getattr(self, '_autobranchmaptopic', False)
a2855aff1268 topic: call a different wire protocol command to get tns-aware branchmap
Anton Shestakov <av6@dwimlabs.net>
parents: 6294
diff changeset
771 topicfilter = topicmap.topicfilter(self.filtername)
a2855aff1268 topic: call a different wire protocol command to get tns-aware branchmap
Anton Shestakov <av6@dwimlabs.net>
parents: 6294
diff changeset
772 if not topic or topicfilter == self.filtername:
a2855aff1268 topic: call a different wire protocol command to get tns-aware branchmap
Anton Shestakov <av6@dwimlabs.net>
parents: 6294
diff changeset
773 return super(topicrepo, self).branchmap()
a2855aff1268 topic: call a different wire protocol command to get tns-aware branchmap
Anton Shestakov <av6@dwimlabs.net>
parents: 6294
diff changeset
774 return self.filtered(topicfilter).branchmap()
a2855aff1268 topic: call a different wire protocol command to get tns-aware branchmap
Anton Shestakov <av6@dwimlabs.net>
parents: 6294
diff changeset
775
4704
5f90eb8fd63c evolve: fix confusion in branch heads checking logic when topic in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4669
diff changeset
776 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
777 if branch is None:
6600
421dc5c11108 topic: use dirstate.branch() instead of wdir.branch()
Anton Shestakov <av6@dwimlabs.net>
parents: 6599
diff changeset
778 # using dirstate.branch() instead of self[None].branch()
421dc5c11108 topic: use dirstate.branch() instead of wdir.branch()
Anton Shestakov <av6@dwimlabs.net>
parents: 6599
diff changeset
779 # because we wrap context.branch method to return branch
421dc5c11108 topic: use dirstate.branch() instead of wdir.branch()
Anton Shestakov <av6@dwimlabs.net>
parents: 6599
diff changeset
780 # already in FQBN format, and we can't give it to formatfqbn()
421dc5c11108 topic: use dirstate.branch() instead of wdir.branch()
Anton Shestakov <av6@dwimlabs.net>
parents: 6599
diff changeset
781 # again directly
421dc5c11108 topic: use dirstate.branch() instead of wdir.branch()
Anton Shestakov <av6@dwimlabs.net>
parents: 6599
diff changeset
782 branch = self.dirstate.branch()
6271
caf302fb8f4d topic: use branch//namespace/topic format everywhere except exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6268
diff changeset
783 branch = common.formatfqbn(branch, self.currenttns, self.currenttopic)
4704
5f90eb8fd63c evolve: fix confusion in branch heads checking logic when topic in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4669
diff changeset
784 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
785 start=start,
5f90eb8fd63c evolve: fix confusion in branch heads checking logic when topic in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4669
diff changeset
786 closed=closed)
5f90eb8fd63c evolve: fix confusion in branch heads checking logic when topic in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4669
diff changeset
787
6360
e959390490c2 branching: merge with stable
Anton Shestakov <av6@dwimlabs.net>
parents: 6336
diff changeset
788 def invalidatecaches(self):
6554
ba8354de1c4d topic: invalidate topic namespace cache in repo.invalidatecaches()
Anton Shestakov <av6@dwimlabs.net>
parents: 6536
diff changeset
789 self._tnscache.clear()
6360
e959390490c2 branching: merge with stable
Anton Shestakov <av6@dwimlabs.net>
parents: 6336
diff changeset
790 self._topiccache.clear()
e959390490c2 branching: merge with stable
Anton Shestakov <av6@dwimlabs.net>
parents: 6336
diff changeset
791 super(topicrepo, self).invalidatecaches()
e959390490c2 branching: merge with stable
Anton Shestakov <av6@dwimlabs.net>
parents: 6336
diff changeset
792
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
793 def invalidatevolatilesets(self):
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
794 # 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
795 super(topicrepo, self).invalidatevolatilesets()
6238
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
796 self._topic_namespaces = None
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
797 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
798
6360
e959390490c2 branching: merge with stable
Anton Shestakov <av6@dwimlabs.net>
parents: 6336
diff changeset
799 def peer(self, *args, **kwargs):
e959390490c2 branching: merge with stable
Anton Shestakov <av6@dwimlabs.net>
parents: 6336
diff changeset
800 peer = super(topicrepo, self).peer(*args, **kwargs)
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
801 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
802 class topicpeer(peer.__class__):
6652
92fd4581f569 topic: return our special executor classes for each instance
Anton Shestakov <av6@dwimlabs.net>
parents: 6651
diff changeset
803 def commandexecutor(self):
92fd4581f569 topic: return our special executor classes for each instance
Anton Shestakov <av6@dwimlabs.net>
parents: 6651
diff changeset
804 return server.topiccommandexecutor(self)
92fd4581f569 topic: return our special executor classes for each instance
Anton Shestakov <av6@dwimlabs.net>
parents: 6651
diff changeset
805
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
806 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
807 usetopic = not self._repo.publishing()
6271
caf302fb8f4d topic: use branch//namespace/topic format everywhere except exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6268
diff changeset
808 return self._repo.branchmap(topic=usetopic, convertbm=usetopic)
6296
a2855aff1268 topic: call a different wire protocol command to get tns-aware branchmap
Anton Shestakov <av6@dwimlabs.net>
parents: 6294
diff changeset
809
a2855aff1268 topic: call a different wire protocol command to get tns-aware branchmap
Anton Shestakov <av6@dwimlabs.net>
parents: 6294
diff changeset
810 def branchmaptns(self):
a2855aff1268 topic: call a different wire protocol command to get tns-aware branchmap
Anton Shestakov <av6@dwimlabs.net>
parents: 6294
diff changeset
811 usetopic = not self._repo.publishing()
a2855aff1268 topic: call a different wire protocol command to get tns-aware branchmap
Anton Shestakov <av6@dwimlabs.net>
parents: 6294
diff changeset
812 return self._repo.branchmaptns(topic=usetopic)
6548
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
813
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
814 def tns_heads(self, namespaces):
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
815 if b'*' in namespaces:
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
816 # pulling all topic namespaces, all changesets are visible
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
817 return self._repo.heads()
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
818 else:
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
819 # only changesets in the selected topic namespaces are visible
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
820 h = []
6745
71c4b6c2bcdc topic: drop branchmap._entries compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6744
diff changeset
821 entries = self._repo.branchmaptns()._entries
6573
d511eba4cdb0 topic: compatibility for branchmaptns with branchmap from hg 5.0
Anton Shestakov <av6@dwimlabs.net>
parents: 6566
diff changeset
822 for branch, nodes in compat.branchmapitems(entries):
6548
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
823 namedbranch, tns, topic = common.parsefqbn(branch)
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
824 if tns == b'none' or tns in namespaces:
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
825 h.extend(nodes)
445240ccb701 topic: add experimental.tns-default-pull-namespaces config option
Anton Shestakov <av6@dwimlabs.net>
parents: 6545
diff changeset
826 return h
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
827 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
828 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
829
2989
53246d237373 topic: skip topic movement message during strip
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2986
diff changeset
830 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
831 ctr = self.currenttransaction()
2989
53246d237373 topic: skip topic movement message during strip
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2986
diff changeset
832 tr = super(topicrepo, self).transaction(desc, *a, **k)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
833 if desc in (b'strip', b'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
834 return tr
2986
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
835
3158
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
836 reporef = weakref.ref(self)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
837 if self.ui.configbool(b'experimental', b'enforce-single-head'):
6574
054a7c342463 topic: use distinct names for distinct origvalidator and _validate()
Anton Shestakov <av6@dwimlabs.net>
parents: 6573
diff changeset
838 def _validate_single_head(tr2):
5203
034d6d0efa7d topic: fix compatibility issues caused because of change in transaction API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 5193
diff changeset
839 repo = reporef()
034d6d0efa7d topic: fix compatibility issues caused because of change in transaction API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 5193
diff changeset
840 flow.enforcesinglehead(repo, tr2)
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
841
6700
a7d94f235488 topic: remove transaction validator compatibility for hg 5.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6696
diff changeset
842 tr.addvalidator(b'000-enforce-single-head', _validate_single_head)
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
843
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
844 topicmodeserver = self.ui.config(b'experimental',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
845 b'topic-mode.server', b'ignore')
5930
8d36bfe9968a topic: add more variables to make a condition fit on one line
Anton Shestakov <av6@dwimlabs.net>
parents: 5919
diff changeset
846 publishbare = self.ui.configbool(b'experimental',
8d36bfe9968a topic: add more variables to make a condition fit on one line
Anton Shestakov <av6@dwimlabs.net>
parents: 5919
diff changeset
847 b'topic.publish-bare-branch')
8d36bfe9968a topic: add more variables to make a condition fit on one line
Anton Shestakov <av6@dwimlabs.net>
parents: 5919
diff changeset
848 ispush = desc.startswith((b'push', b'serve'))
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
849 if (topicmodeserver != b'ignore' and ispush):
6574
054a7c342463 topic: use distinct names for distinct origvalidator and _validate()
Anton Shestakov <av6@dwimlabs.net>
parents: 6573
diff changeset
850 def _validate_untopiced(tr2):
3235
8a772f0c54d9 topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
851 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
852 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
853
6700
a7d94f235488 topic: remove transaction validator compatibility for hg 5.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6696
diff changeset
854 tr.addvalidator(b'000-reject-untopiced', _validate_untopiced)
3235
8a772f0c54d9 topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3232
diff changeset
855
5930
8d36bfe9968a topic: add more variables to make a condition fit on one line
Anton Shestakov <av6@dwimlabs.net>
parents: 5919
diff changeset
856 elif publishbare and ispush:
3158
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
857 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
858 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
859
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
860 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
861 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
862 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
863 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
864 origclose()
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
865 tr.close = close
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
866 allow_publish = self.ui.configbool(b'experimental',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
867 b'topic.allow-publish',
4647
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
868 True)
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
869 if not allow_publish:
6574
054a7c342463 topic: use distinct names for distinct origvalidator and _validate()
Anton Shestakov <av6@dwimlabs.net>
parents: 6573
diff changeset
870 def _validate_publish(tr2):
4647
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
871 repo = reporef()
228caeb8b7af topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4646
diff changeset
872 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
873
6700
a7d94f235488 topic: remove transaction validator compatibility for hg 5.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6696
diff changeset
874 tr.addvalidator(b'000-reject-publish', _validate_publish)
3158
678a9802c56b topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3157
diff changeset
875
6743
ab60707314e9 topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents: 6740
diff changeset
876 if self.ui.configbool(b'experimental', b'tns-reject-push'):
ab60707314e9 topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents: 6740
diff changeset
877 def _validate_csets_with_tns(tr2):
ab60707314e9 topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents: 6740
diff changeset
878 repo = reporef()
ab60707314e9 topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents: 6740
diff changeset
879 flow.reject_csets_with_tns(repo, tr2)
ab60707314e9 topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents: 6740
diff changeset
880
6775
6adcc5c7c1f1 branching: merge with stable
Anton Shestakov <av6@dwimlabs.net>
parents: 6745 6774
diff changeset
881 tr.addvalidator(b'000-reject-csets-with-tns', _validate_csets_with_tns)
6496
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
882
6574
054a7c342463 topic: use distinct names for distinct origvalidator and _validate()
Anton Shestakov <av6@dwimlabs.net>
parents: 6573
diff changeset
883 def _validate_affected_tns(tr2):
6496
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
884 repo = reporef()
6622
b669ded0fe00 topic: assert repo reference is not immediately None to help pytype
Anton Shestakov <av6@dwimlabs.net>
parents: 6616
diff changeset
885 assert repo is not None # help pytype
6496
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
886 find_affected_tns(repo, tr2)
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
887
6700
a7d94f235488 topic: remove transaction validator compatibility for hg 5.3
Anton Shestakov <av6@dwimlabs.net>
parents: 6696
diff changeset
888 tr.addvalidator(b'999-find-affected-tns', _validate_affected_tns)
6496
fba501baf5cb topic: find and report topic namespace changes in transactions
Anton Shestakov <av6@dwimlabs.net>
parents: 6489
diff changeset
889
2988
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
890 # real transaction start
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
891 ct = self.currenttopic
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
892 if not ct:
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
893 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
894 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
895
2986
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
896 reporef = weakref.ref(self)
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
897
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
898 def currenttopicempty(tr):
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3195
diff changeset
899 # check active topic emptiness
2986
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
900 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
901 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
902 empty = csetcount == 0
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
903 if empty and not ctwasempty:
5924
16f3fb304285 topic: add a 'topic.active' label to messages with active topic
Anton Shestakov <av6@dwimlabs.net>
parents: 5922
diff changeset
904 ui.status(b"active topic '%s' is now empty\n"
16f3fb304285 topic: add a 'topic.active' label to messages with active topic
Anton Shestakov <av6@dwimlabs.net>
parents: 5922
diff changeset
905 % ui.label(ct, b'topic.active'))
4124
23658110ab26 topic: add a compatibility to access transaction's names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4123
diff changeset
906 trnames = getattr(tr, 'names', getattr(tr, '_names', ()))
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
907 if (b'phase' in trnames
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
908 or any(n.startswith(b'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
909 for n in trnames)):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
910 ui.status(_(b"(use 'hg topic --clear' to clear it if needed)\n"))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
911 hint = _(b"(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
912 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
913 if csetcount == 1:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
914 msg = _(b"active topic '%s' grew its first changeset\n%s")
5924
16f3fb304285 topic: add a 'topic.active' label to messages with active topic
Anton Shestakov <av6@dwimlabs.net>
parents: 5922
diff changeset
915 ui.status(msg % (ui.label(ct, b'topic.active'), hint))
2988
62201935e1a7 topics/ui: detect and signal when an empty changeset becomes non-empty
Aurélien Campéas
parents: 2987
diff changeset
916 else:
5132
fb5f49be3c90 topic: use `%d` for integers instead of `%s` on py3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 5110
diff changeset
917 msg = _(b"active topic '%s' grew its %d first changesets\n%s")
5924
16f3fb304285 topic: add a 'topic.active' label to messages with active topic
Anton Shestakov <av6@dwimlabs.net>
parents: 5922
diff changeset
918 ui.status(msg % (ui.label(ct, b'topic.active'), csetcount, hint))
2986
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
919
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
920 tr.addpostclose(b'signalcurrenttopicempty', currenttopicempty)
2986
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
921 return tr
4746b92cc1f8 topics/ui: signal when an operation entails voiding a topic
Aurélien Campéas
parents: 2985
diff changeset
922
1857
a506ed8ab8da topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents: 1856
diff changeset
923 repo.__class__ = topicrepo
6238
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
924 repo._topic_namespaces = None
1999
fe76e9c92fff init: cache repo.topics
timeless@gmail.com
parents: 1998
diff changeset
925 repo._topics = None
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
926 if util.safehasattr(repo, 'names'):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
927 repo.names.addnamespace(namespaces.namespace(
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
928 b'topics', b'topic', namemap=_namemap, nodemap=_nodemap,
1857
a506ed8ab8da topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents: 1856
diff changeset
929 listnames=lambda repo: repo.topics))
2928
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
930
6825
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
931 class topicdirstate(dirstate.dirstate):
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
932 @dirstate.repocache(b'topic')
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
933 def _topic(self):
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
934 try:
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
935 return self._opener.read(b'topic').strip() or b''
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
936 except IOError as inst:
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
937 if inst.errno != errno.ENOENT:
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
938 raise
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
939 return b''
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
940
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
941 def topic(self):
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
942 return encoding.tolocal(self._topic)
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
943
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
944 def settopic(self, topic, tr):
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
945 self.__class__._topic.set(self, encoding.fromlocal(topic))
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
946 del topic # safeguard to not use it after adjusting encoding
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
947 vfs = self._opener
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
948 if self._topic != b'':
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
949 with vfs(b'topic', b'w', atomictemp=True, checkambig=True) as f:
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
950 f.write(self._topic + b'\n')
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
951 else:
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
952 vfs.tryunlink(b'topic')
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
953 ce = self._filecache[b'_topic']
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
954 if ce:
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
955 ce.refresh()
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
956
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
957 @dirstate.repocache(b'topic-namespace')
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
958 def _tns(self):
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
959 try:
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
960 return self._opener.read(b'topic-namespace').strip() or b'none'
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
961 except IOError as inst:
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
962 if inst.errno != errno.ENOENT:
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
963 raise
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
964 return b'none'
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
965
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
966 def tns(self):
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
967 return encoding.tolocal(self._tns)
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
968
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
969 def settns(self, tns, tr):
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
970 self.__class__._tns.set(self, encoding.fromlocal(tns))
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
971 del tns # safeguard to not use it after adjusting encoding
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
972 vfs = self._opener
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
973 if self._tns != b'none':
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
974 with vfs(b'topic-namespace', b'w', atomictemp=True, checkambig=True) as f:
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
975 f.write(self._tns + b'\n')
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
976 else:
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
977 vfs.tryunlink(b'topic-namespace')
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
978 ce = self._filecache[b'_tns']
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
979 if ce:
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
980 ce.refresh()
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
981
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
982 dirstate.dirstate = topicdirstate
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
983
5183
9ac6779d608c topic: drop 4.5 compatibility for template keywords
Anton Shestakov <av6@dwimlabs.net>
parents: 5164
diff changeset
984 templatekeyword = registrar.templatekeyword()
4152
fb22c7a6ca8b topic: add topicidx template keyword
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4126
diff changeset
985
5183
9ac6779d608c topic: drop 4.5 compatibility for template keywords
Anton Shestakov <av6@dwimlabs.net>
parents: 5164
diff changeset
986 @templatekeyword(b'topic', requires={b'ctx'})
9ac6779d608c topic: drop 4.5 compatibility for template keywords
Anton Shestakov <av6@dwimlabs.net>
parents: 5164
diff changeset
987 def topickw(context, mapping):
6409
77c4f9773aea topic: remove templatekeyword name, not needed after 119702a8b415
Anton Shestakov <av6@dwimlabs.net>
parents: 6406
diff changeset
988 """String. The topic of the changeset"""
5183
9ac6779d608c topic: drop 4.5 compatibility for template keywords
Anton Shestakov <av6@dwimlabs.net>
parents: 5164
diff changeset
989 ctx = context.resource(mapping, b'ctx')
9ac6779d608c topic: drop 4.5 compatibility for template keywords
Anton Shestakov <av6@dwimlabs.net>
parents: 5164
diff changeset
990 return ctx.topic()
3384
2b06f144b6e0 topics: add a new templatekeyword `topic`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3372
diff changeset
991
5183
9ac6779d608c topic: drop 4.5 compatibility for template keywords
Anton Shestakov <av6@dwimlabs.net>
parents: 5164
diff changeset
992 @templatekeyword(b'topicidx', requires={b'ctx'})
9ac6779d608c topic: drop 4.5 compatibility for template keywords
Anton Shestakov <av6@dwimlabs.net>
parents: 5164
diff changeset
993 def topicidxkw(context, mapping):
6409
77c4f9773aea topic: remove templatekeyword name, not needed after 119702a8b415
Anton Shestakov <av6@dwimlabs.net>
parents: 6406
diff changeset
994 """Integer. Index of the changeset as a stack alias"""
5183
9ac6779d608c topic: drop 4.5 compatibility for template keywords
Anton Shestakov <av6@dwimlabs.net>
parents: 5164
diff changeset
995 ctx = context.resource(mapping, b'ctx')
9ac6779d608c topic: drop 4.5 compatibility for template keywords
Anton Shestakov <av6@dwimlabs.net>
parents: 5164
diff changeset
996 return ctx.topicidx()
4152
fb22c7a6ca8b topic: add topicidx template keyword
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4126
diff changeset
997
6241
85abf58c3d8c topic: namespace template keyword
Anton Shestakov <av6@dwimlabs.net>
parents: 6240
diff changeset
998 @templatekeyword(b'topic_namespace', requires={b'ctx'})
85abf58c3d8c topic: namespace template keyword
Anton Shestakov <av6@dwimlabs.net>
parents: 6240
diff changeset
999 def topicnamespacekw(context, mapping):
6409
77c4f9773aea topic: remove templatekeyword name, not needed after 119702a8b415
Anton Shestakov <av6@dwimlabs.net>
parents: 6406
diff changeset
1000 """String. The topic namespace of the changeset"""
6241
85abf58c3d8c topic: namespace template keyword
Anton Shestakov <av6@dwimlabs.net>
parents: 6240
diff changeset
1001 ctx = context.resource(mapping, b'ctx')
85abf58c3d8c topic: namespace template keyword
Anton Shestakov <av6@dwimlabs.net>
parents: 6240
diff changeset
1002 return ctx.topic_namespace()
85abf58c3d8c topic: namespace template keyword
Anton Shestakov <av6@dwimlabs.net>
parents: 6240
diff changeset
1003
6243
91d9a279b84a topic: fqbn template keyword
Anton Shestakov <av6@dwimlabs.net>
parents: 6242
diff changeset
1004 @templatekeyword(b'fqbn', requires={b'ctx'})
91d9a279b84a topic: fqbn template keyword
Anton Shestakov <av6@dwimlabs.net>
parents: 6242
diff changeset
1005 def fqbnkw(context, mapping):
6409
77c4f9773aea topic: remove templatekeyword name, not needed after 119702a8b415
Anton Shestakov <av6@dwimlabs.net>
parents: 6406
diff changeset
1006 """String. The branch//namespace/topic of the changeset"""
6243
91d9a279b84a topic: fqbn template keyword
Anton Shestakov <av6@dwimlabs.net>
parents: 6242
diff changeset
1007 ctx = context.resource(mapping, b'ctx')
91d9a279b84a topic: fqbn template keyword
Anton Shestakov <av6@dwimlabs.net>
parents: 6242
diff changeset
1008 return ctx.fqbn()
91d9a279b84a topic: fqbn template keyword
Anton Shestakov <av6@dwimlabs.net>
parents: 6242
diff changeset
1009
2928
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
1010 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
1011 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
1012 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
1013 return
6240
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
1014 if b'topic-namespace' not in self._extra:
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
1015 if getattr(repo, 'currenttns', b''):
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
1016 self._extra[b'topic-namespace'] = repo.currenttns
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
1017 else:
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
1018 # Default value will be dropped from extra by another hack at the changegroup level
6487
963471ebe26a topic: make topic namespace use string "none" as the default/empty value
Anton Shestakov <av6@dwimlabs.net>
parents: 6480
diff changeset
1019 self._extra[b'topic-namespace'] = b'none'
4125
865c33c16508 topic: respect preexisting 'topic' value on workingcommitctx
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4124
diff changeset
1020 if constants.extrakey not in self._extra:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1021 if getattr(repo, 'currenttopic', b''):
4125
865c33c16508 topic: respect preexisting 'topic' value on workingcommitctx
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4124
diff changeset
1022 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
1023 else:
865c33c16508 topic: respect preexisting 'topic' value on workingcommitctx
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4124
diff changeset
1024 # Empty key will be dropped from extra by another hack at the changegroup level
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1025 self._extra[constants.extrakey] = b''
2928
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
1026
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
1027 def wrapadd(orig, cl, manifest, files, desc, transaction, p1, p2, user,
6701
f0cbc19e77ef topic: drop compatibility for changelog.add() for hg 5.5 and older
Anton Shestakov <av6@dwimlabs.net>
parents: 6700
diff changeset
1028 date=None, extra=None):
6487
963471ebe26a topic: make topic namespace use string "none" as the default/empty value
Anton Shestakov <av6@dwimlabs.net>
parents: 6480
diff changeset
1029 if b'topic-namespace' in extra and extra[b'topic-namespace'] == b'none':
6240
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
1030 extra = extra.copy()
2686ecc90791 topic: store topic namespace in commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6239
diff changeset
1031 del extra[b'topic-namespace']
2928
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
1032 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
1033 extra = extra.copy()
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
1034 del extra[constants.extrakey]
6549
e45bfd1e0588 topic: don't write namespace into commit extras if there's no topic
Anton Shestakov <av6@dwimlabs.net>
parents: 6548
diff changeset
1035 if constants.extrakey not in extra and b'topic-namespace' in extra:
e45bfd1e0588 topic: don't write namespace into commit extras if there's no topic
Anton Shestakov <av6@dwimlabs.net>
parents: 6548
diff changeset
1036 # if topic is not in extra, drop namespace as well
e45bfd1e0588 topic: don't write namespace into commit extras if there's no topic
Anton Shestakov <av6@dwimlabs.net>
parents: 6548
diff changeset
1037 extra = extra.copy()
e45bfd1e0588 topic: don't write namespace into commit extras if there's no topic
Anton Shestakov <av6@dwimlabs.net>
parents: 6548
diff changeset
1038 del extra[b'topic-namespace']
2928
6275808e89ef topic: setup 'topic' value for working ctx
Boris Feld <boris.feld@octobus.net>
parents: 2924
diff changeset
1039 return orig(cl, manifest, files, desc, transaction, p1, p2, user,
6701
f0cbc19e77ef topic: drop compatibility for changelog.add() for hg 5.5 and older
Anton Shestakov <av6@dwimlabs.net>
parents: 6700
diff changeset
1040 date=date, extra=extra)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
1041
6117
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
1042 def applychangewrap(orig, self):
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
1043 orig(self)
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
1044 repo = self.repo
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
1045 rulectx = repo[self.node]
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
1046
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
1047 topic = None
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
1048 if util.safehasattr(rulectx, 'topic'):
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
1049 topic = rulectx.topic()
6118
5d1bfde39b95 topic: also make histedit clear the current topic if needed
Simon Sapin <simon.sapin@octobus.net>
parents: 6117
diff changeset
1050 _changecurrenttopic(repo, topic)
6117
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
1051
a27bdd116761 topic: wrap applychange from histedit to preserve topics
Simon Sapin <simon.sapin@octobus.net>
parents: 6088
diff changeset
1052
2924
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
1053 # 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
1054 revsetpredicate = topicrevset.revsetpredicate
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2923
diff changeset
1055
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4713
diff changeset
1056 @command(b'topics', [
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4713
diff changeset
1057 (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
1058 (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
1059 (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
1060 (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
1061 (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
1062 ] + commands.formatteropts,
4921
a7c01a2a3974 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4894 4914
diff changeset
1063 _(b'hg topics [OPTION]... [-r REV]... [TOPIC]'),
6305
77ce98287dc2 topic: drop helpcategory 4.7 compat, use helpcategory keyword directly
Anton Shestakov <av6@dwimlabs.net>
parents: 6304
diff changeset
1064 helpcategory=registrar.command.CATEGORY_CHANGE_ORGANIZATION,
77ce98287dc2 topic: drop helpcategory 4.7 compat, use helpcategory keyword directly
Anton Shestakov <av6@dwimlabs.net>
parents: 6304
diff changeset
1065 )
2991
f4956eb3a456 topics: improve the function signature by accepting arguments as **opts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2990
diff changeset
1066 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
1067 """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
1068
2923
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
1069 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
1070
2994
1e8ac0fcd6b7 topics: spell out topics completely in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2993
diff changeset
1071 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
1072
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
1073 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
1074
2994
1e8ac0fcd6b7 topics: spell out topics completely in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2993
diff changeset
1075 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
1076
2923
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
1077 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
1078
2994
1e8ac0fcd6b7 topics: spell out topics completely in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2993
diff changeset
1079 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
1080
2923
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
1081 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
1082
2994
1e8ac0fcd6b7 topics: spell out topics completely in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2993
diff changeset
1083 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
1084
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
1085 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
1086
2923
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2922
diff changeset
1087 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
1088
2993
725b660d9886 topics: show the user who last touched the topic in --age
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2992
diff changeset
1089 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
1090 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
1091
2994
1e8ac0fcd6b7 topics: spell out topics completely in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2993
diff changeset
1092 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
1093
2717
ed45a5fb4452 topics: update the help for `hg topics` describing ways to use the command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
1094 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
1095
2869
b629874ccaac topics: allow use a --current when setting a topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2868
diff changeset
1096 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
1097 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
1098 active topic, you can do:
2994
1e8ac0fcd6b7 topics: spell out topics completely in help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2993
diff changeset
1099 `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
1100
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
1101 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
1102
2991
f4956eb3a456 topics: improve the function signature by accepting arguments as **opts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2990
diff changeset
1103 clear = opts.get('clear')
f4956eb3a456 topics: improve the function signature by accepting arguments as **opts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2990
diff changeset
1104 list = opts.get('list')
f4956eb3a456 topics: improve the function signature by accepting arguments as **opts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2990
diff changeset
1105 rev = opts.get('rev')
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
1106 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
1107 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
1108
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
1109 if current and topic:
6318
3e488afe62f5 topic: use compat.InputError for conflicting CLI flags
Anton Shestakov <av6@dwimlabs.net>
parents: 6311
diff changeset
1110 raise compat.InputError(_(b"cannot use --current when setting a topic"))
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
1111 if current and clear:
6318
3e488afe62f5 topic: use compat.InputError for conflicting CLI flags
Anton Shestakov <av6@dwimlabs.net>
parents: 6311
diff changeset
1112 raise compat.InputError(_(b"cannot use --current and --clear"))
2868
e46b68547017 topic: make --clear + topicname invalid
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2867
diff changeset
1113 if clear and topic:
6318
3e488afe62f5 topic: use compat.InputError for conflicting CLI flags
Anton Shestakov <av6@dwimlabs.net>
parents: 6311
diff changeset
1114 raise compat.InputError(_(b"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
1115 if age and topic:
6318
3e488afe62f5 topic: use compat.InputError for conflicting CLI flags
Anton Shestakov <av6@dwimlabs.net>
parents: 6311
diff changeset
1116 raise compat.InputError(_(b"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
1117
6320
0c780d972350 topic: use check_incompatible_arguments() for --list with --clear or --rev
Anton Shestakov <av6@dwimlabs.net>
parents: 6319
diff changeset
1118 compat.check_incompatible_arguments(opts, 'list', ('clear', 'rev'))
0c780d972350 topic: use check_incompatible_arguments() for --list with --clear or --rev
Anton Shestakov <av6@dwimlabs.net>
parents: 6319
diff changeset
1119
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
1120 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
1121 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
1122 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
1123
2889
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
1124 if topic:
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
1125 topic = topic.strip()
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
1126 if not topic:
6319
8c664ed9c103 topic: use compat.InputError for invalid topic names
Anton Shestakov <av6@dwimlabs.net>
parents: 6318
diff changeset
1127 raise compat.InputError(_(b"topic names cannot consist entirely of whitespace"))
2889
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
1128 # Have some restrictions on the topic name just like bookmark name
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1129 scmutil.checknewlabel(repo, topic, b'topic')
2889
31cbace4c0f1 topics: make sure we have some restrictions on topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2869
diff changeset
1130
6611
1dc008b6ad21 topic: add a missing comma in the topic name rejection message
Anton Shestakov <av6@dwimlabs.net>
parents: 6610
diff changeset
1131 helptxt = _(b"topic names can only consist of alphanumeric, '-',"
6206
2ec9c87e8574 topic: allow unicode symbols in names as long as they are alphanumeric
Anton Shestakov <av6@dwimlabs.net>
parents: 6205
diff changeset
1132 b" '_' and '.' characters")
2ec9c87e8574 topic: allow unicode symbols in names as long as they are alphanumeric
Anton Shestakov <av6@dwimlabs.net>
parents: 6205
diff changeset
1133 try:
2ec9c87e8574 topic: allow unicode symbols in names as long as they are alphanumeric
Anton Shestakov <av6@dwimlabs.net>
parents: 6205
diff changeset
1134 utopic = encoding.unifromlocal(topic)
2ec9c87e8574 topic: allow unicode symbols in names as long as they are alphanumeric
Anton Shestakov <av6@dwimlabs.net>
parents: 6205
diff changeset
1135 except error.Abort:
2ec9c87e8574 topic: allow unicode symbols in names as long as they are alphanumeric
Anton Shestakov <av6@dwimlabs.net>
parents: 6205
diff changeset
1136 # Maybe we should allow these topic names as well, as long as they
6616
9107d91de94e topic: update comment in the topic namespace name check
Anton Shestakov <av6@dwimlabs.net>
parents: 6615
diff changeset
1137 # don't break any other rules.
6206
2ec9c87e8574 topic: allow unicode symbols in names as long as they are alphanumeric
Anton Shestakov <av6@dwimlabs.net>
parents: 6205
diff changeset
1138 utopic = ''
2ec9c87e8574 topic: allow unicode symbols in names as long as they are alphanumeric
Anton Shestakov <av6@dwimlabs.net>
parents: 6205
diff changeset
1139 rmatch = re.match(r'[-_.\w]+', utopic, re.UNICODE)
2ec9c87e8574 topic: allow unicode symbols in names as long as they are alphanumeric
Anton Shestakov <av6@dwimlabs.net>
parents: 6205
diff changeset
1140 if not utopic or not rmatch or rmatch.group(0) != utopic:
6319
8c664ed9c103 topic: use compat.InputError for invalid topic names
Anton Shestakov <av6@dwimlabs.net>
parents: 6318
diff changeset
1141 raise compat.InputError(_(b"invalid topic name: '%s'") % topic, hint=helptxt)
3652
81985b9d3e74 topic-ext: restrict the format of topic names
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3614
diff changeset
1142
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
1143 if list:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1144 ui.pager(b'topics')
1990
71410fa2c253 stack: extra argument validation logic outside of showstack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1989
diff changeset
1145 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
1146 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
1147 if not topic:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1148 raise error.Abort(_(b'no active topic to list'))
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4748
diff changeset
1149 return stack.showstack(ui, repo, topic=topic,
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4748
diff changeset
1150 opts=pycompat.byteskwargs(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
1151
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
1152 if touchedrevs:
1851
67d53e8e0c1a topic: only require obsolete support for --change
Matt Mackall <mpm@selenic.com>
parents: 1850
diff changeset
1153 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1154 raise error.Abort(_(b'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
1155 if clear:
2e3f63f4a519 topic: further simplify the clear logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2644
diff changeset
1156 topic = None
2869
b629874ccaac topics: allow use a --current when setting a topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2868
diff changeset
1157 elif opts.get('current'):
b629874ccaac topics: allow use a --current when setting a topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2868
diff changeset
1158 topic = repo.currenttopic
2645
2e3f63f4a519 topic: further simplify the clear logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2644
diff changeset
1159 elif not topic:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1160 raise error.Abort(b'changing topic requires a topic name or --clear')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1161 if repo.revs(b'%ld and public()', touchedrevs):
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1162 raise error.Abort(b"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
1163 wl = lock = txn = None
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1164 try:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1165 wl = repo.wlock()
3124
6ef274e01f64 flake8: rename some ambiguous identifier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3097
diff changeset
1166 lock = repo.lock()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1167 txn = repo.transaction(b'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
1168 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
1169 txn.close()
4268
d5a2cc19903f topics: improve the message around topic changing
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 4253
diff changeset
1170 if topic is None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1171 ui.status(b'cleared topic on %d changesets\n' % rewrote)
4268
d5a2cc19903f topics: improve the message around topic changing
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 4253
diff changeset
1172 else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1173 ui.status(b'changed topic on %d changesets to "%s"\n' % (rewrote,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1174 topic))
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1175 finally:
3124
6ef274e01f64 flake8: rename some ambiguous identifier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3097
diff changeset
1176 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
1177 repo.invalidate()
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1178 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
1179
2985
f63c97c01f92 topics/ui: signal when the topics command creates a new (empty) topic
Aurélien Campéas
parents: 2984
diff changeset
1180 ct = repo.currenttopic
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
1181 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
1182 if ct:
4652
b72cd597a887 stack: check if stack is empty more pythonically
Anton Shestakov <av6@dwimlabs.net>
parents: 4647
diff changeset
1183 st = stack.stack(repo, topic=ct)
b72cd597a887 stack: check if stack is empty more pythonically
Anton Shestakov <av6@dwimlabs.net>
parents: 4647
diff changeset
1184 if not st:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1185 ui.status(_(b'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
1186 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
1187
1860
b7b9e5028c2a topics: consistently use empty string instead of None
Matt Mackall <mpm@selenic.com>
parents: 1859
diff changeset
1188 if topic:
2985
f63c97c01f92 topics/ui: signal when the topics command creates a new (empty) topic
Aurélien Campéas
parents: 2984
diff changeset
1189 if not ct:
5924
16f3fb304285 topic: add a 'topic.active' label to messages with active topic
Anton Shestakov <av6@dwimlabs.net>
parents: 5922
diff changeset
1190 ui.status(_(b'marked working directory as topic: %s\n')
16f3fb304285 topic: add a 'topic.active' label to messages with active topic
Anton Shestakov <av6@dwimlabs.net>
parents: 5922
diff changeset
1191 % ui.label(topic, b'topic.active'))
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
1192 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
1193
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1194 ui.pager(b'topics')
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
1195 # `hg topic --current`
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
1196 ret = 0
2985
f63c97c01f92 topics/ui: signal when the topics command creates a new (empty) topic
Aurélien Campéas
parents: 2984
diff changeset
1197 if current and not ct:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1198 ui.write_err(_(b'no active topic\n'))
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
1199 ret = 1
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
1200 elif current:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1201 fm = ui.formatter(b'topic', pycompat.byteskwargs(opts))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1202 namemask = b'%s\n'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1203 label = b'topic.active'
2867
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
1204 fm.startitem()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1205 fm.write(b'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
1206 fm.end()
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
1207 else:
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
1208 _listtopics(ui, repo, opts)
5c0b6af37b21 topics: add a current flag to display current topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2866
diff changeset
1209 return ret
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
1210
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1211 @command(b'stack', [
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1212 (b'c', b'children', None,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1213 _(b'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
1214 ] + commands.formatteropts,
4894
f9743b13de6d help: categorizing evolve and topic commands
Rodrigo Damazio <rdamazio@google.com>
parents: 4892
diff changeset
1215 _(b'hg stack [TOPIC]'),
6305
77ce98287dc2 topic: drop helpcategory 4.7 compat, use helpcategory keyword directly
Anton Shestakov <av6@dwimlabs.net>
parents: 6304
diff changeset
1216 helpcategory=registrar.command.CATEGORY_CHANGE_NAVIGATION,
77ce98287dc2 topic: drop helpcategory 4.7 compat, use helpcategory keyword directly
Anton Shestakov <av6@dwimlabs.net>
parents: 6304
diff changeset
1217 )
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1218 def cmdstack(ui, repo, topic=b'', **opts):
2011
9c7665e3107b documentation: some basic update of the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2008
diff changeset
1219 """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
1220
2750
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2744
diff changeset
1221 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
1222
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2744
diff changeset
1223 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
1224 """
1990
71410fa2c253 stack: extra argument validation logic outside of showstack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1989
diff changeset
1225 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
1226 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
1227 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
1228 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
1229 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
1230 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
1231 branch = repo[None].branch()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1232 ui.pager(b'stack')
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4748
diff changeset
1233 return stack.showstack(ui, repo, branch=branch, topic=topic,
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4748
diff changeset
1234 opts=pycompat.byteskwargs(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
1235
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1236 @command(b'debugcb|debugconvertbookmark', [
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1237 (b'b', b'bookmark', b'', _(b'bookmark to convert to topic')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1238 (b'', b'all', None, _(b'convert all bookmarks to topics')),
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1239 ],
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1240 _(b'[-b BOOKMARK] [--all]'))
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1241 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
1242 """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
1243 """
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1244
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1245 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
1246 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
1247
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1248 if convertall and bookmark:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1249 raise error.Abort(_(b"cannot use '--all' and '-b' together"))
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1250 if not (convertall or bookmark):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1251 raise error.Abort(_(b"you must specify either '--all' or '-b'"))
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1252
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1253 bmstore = repo._bookmarks
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1254
2900
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
1255 nodetobook = {}
4742
db3e7f6b5ceb py3: switch from iteritems() to items() in the topics extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 4719
diff changeset
1256 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
1257 if nodetobook.get(revnode):
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
1258 nodetobook[revnode].append(book)
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
1259 else:
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
1260 nodetobook[revnode] = [book]
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
1261
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
1262 # 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
1263 # warning repeatedly
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
1264 skipped = []
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
1265
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1266 actions = {}
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1267
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1268 lock = wlock = tr = None
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1269 try:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1270 wlock = repo.wlock()
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1271 lock = repo.lock()
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1272 if bookmark:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1273 try:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1274 node = bmstore[bookmark]
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1275 except KeyError:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1276 raise error.Abort(_(b"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
1277
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1278 revnum = repo[node].rev()
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1279 if len(nodetobook[node]) > 1:
5922
8bffab1e7c4f topic: make two almost identical messages actually identical
Anton Shestakov <av6@dwimlabs.net>
parents: 5920
diff changeset
1280 ui.status(_(b"skipping revision %d as it has multiple "
8bffab1e7c4f topic: make two almost identical messages actually identical
Anton Shestakov <av6@dwimlabs.net>
parents: 5920
diff changeset
1281 b"bookmarks on it\n") % revnum)
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1282 return
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
1283 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
1284 if targetrevs:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1285 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
1286
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1287 elif convertall:
4742
db3e7f6b5ceb py3: switch from iteritems() to items() in the topics extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 4719
diff changeset
1288 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
1289 revnum = repo[revnode].rev()
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
1290 if revnum in skipped:
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
1291 continue
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
1292 if len(nodetobook[revnode]) > 1:
5922
8bffab1e7c4f topic: make two almost identical messages actually identical
Anton Shestakov <av6@dwimlabs.net>
parents: 5920
diff changeset
1293 ui.status(_(b"skipping revision %d as it has multiple "
8bffab1e7c4f topic: make two almost identical messages actually identical
Anton Shestakov <av6@dwimlabs.net>
parents: 5920
diff changeset
1294 b"bookmarks on it\n") % revnum)
2900
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
1295 skipped.append(revnum)
1928e9c802dd convertbookmark: add logic to skip revisions with multiple bookmarks
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2899
diff changeset
1296 continue
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1297 if bmark == b'@':
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1298 continue
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
1299 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
1300 if targetrevs:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1301 actions[(bmark, revnum)] = targetrevs
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1302
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1303 if actions:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1304 try:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1305 tr = repo.transaction(b'debugconvertbookmark')
4742
db3e7f6b5ceb py3: switch from iteritems() to items() in the topics extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 4719
diff changeset
1306 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
1307 _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
1308 tr.close()
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1309 finally:
6632
7771e80a7280 topic: release transaction using lockmod
Anton Shestakov <av6@dwimlabs.net>
parents: 6622
diff changeset
1310 lockmod.release(tr)
2908
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1311 finally:
95bb27b8918c convertbookmark: perform all actions at the end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2907
diff changeset
1312 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
1313
2906
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
1314 # inspired from mercurial.repair.stripbmrevset
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1315 CONVERTBOOKREVSET = b"""
2906
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
1316 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
1317 ancestors(bookmark(%s))
2909
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
1318 and not ancestors(
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
1319 (
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
1320 (head() and not bookmark(%s))
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
1321 or (bookmark() - bookmark(%s))
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
1322 ) - (
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
1323 descendants(bookmark(%s))
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
1324 - 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
1325 )
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
1326 )
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
1327 )
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
1328 """
92566275be77 convertbookmark: extract the revset into a module level constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2905
diff changeset
1329
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
1330 def _findconvertbmarktopic(repo, bmark):
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3195
diff changeset
1331 """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
1332
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
1333 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
1334 """
2909
9ce092b17530 convertbookmark: properly convert stacked bookmarks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2908
diff changeset
1335 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
1336
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
1337 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
1338 """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
1339
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
1340 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
1341 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
1342
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
1343 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
1344 """
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1345
2907
d617128279f6 converbookmark: split target computation from actual update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2906
diff changeset
1346 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
1347 # 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
1348 # 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
1349 # 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
1350 # changeset
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1351 if rewrote == 0:
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1352 return
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1353 ui.status(_(b'changed topic to "%s" on %d revisions\n') % (bmark,
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1354 rewrote))
5721
242a0530823a cleanup: ensure log and output messages have a '\n' terminator
Matt Harbison <matt_harbison@yahoo.com>
parents: 5689
diff changeset
1355 ui.debug(b'removing bookmark "%s" from "%d"\n' % (bmark, old))
2899
32306ee32806 topics: add a new debugconvertbookmark command to convert bookmarks to topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2898
diff changeset
1356 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
1357
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
1358 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
1359 """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
1360
6825
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
1361 # assert newtopic is not None
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
1362 if not newtopic:
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
1363 newtopic = b''
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
1364 with repo.wlock():
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
1365 repo.dirstate.settopic(newtopic, repo.currenttransaction())
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
1366
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
1367 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
1368 """ 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
1369 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
1370 """
2642
92e882a82aaf topics: factor out the logic to change topic in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2625
diff changeset
1371 rewrote = 0
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1372 p1 = None
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1373 p2 = None
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1374 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
1375 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
1376 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
1377
5919
1a8e86053adb topic: don't lose any file changes when changing topic of a merge commit
Anton Shestakov <av6@dwimlabs.net>
parents: 5907
diff changeset
1378 if len(c.parents()) > 1:
1a8e86053adb topic: don't lose any file changes when changing topic of a merge commit
Anton Shestakov <av6@dwimlabs.net>
parents: 5907
diff changeset
1379 # ctx.files() isn't reliable for merges, so fall back to the
1a8e86053adb topic: don't lose any file changes when changing topic of a merge commit
Anton Shestakov <av6@dwimlabs.net>
parents: 5907
diff changeset
1380 # slower repo.status() method
1a8e86053adb topic: don't lose any file changes when changing topic of a merge commit
Anton Shestakov <av6@dwimlabs.net>
parents: 5907
diff changeset
1381 st = c.p1().status(c)
1a8e86053adb topic: don't lose any file changes when changing topic of a merge commit
Anton Shestakov <av6@dwimlabs.net>
parents: 5907
diff changeset
1382 files = set(st.modified) | set(st.added) | set(st.removed)
1a8e86053adb topic: don't lose any file changes when changing topic of a merge commit
Anton Shestakov <av6@dwimlabs.net>
parents: 5907
diff changeset
1383 else:
1a8e86053adb topic: don't lose any file changes when changing topic of a merge commit
Anton Shestakov <av6@dwimlabs.net>
parents: 5907
diff changeset
1384 files = set(c.files())
1a8e86053adb topic: don't lose any file changes when changing topic of a merge commit
Anton Shestakov <av6@dwimlabs.net>
parents: 5907
diff changeset
1385
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1386 def filectxfn(repo, ctx, path):
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1387 try:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1388 return c[path]
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1389 except error.ManifestLookupError:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1390 return None
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1391 fixedextra = dict(c.extra())
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1392 ui.debug(b'old node id is %s\n' % node.hex(c.node()))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1393 ui.debug(b'origextra: %r\n' % fixedextra)
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1394 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
1395 if oldtopic == newtopic:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1396 continue
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1397 if newtopic is None:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1398 del fixedextra[constants.extrakey]
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1399 else:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1400 fixedextra[constants.extrakey] = newtopic
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1401 fixedextra[constants.changekey] = c.hex()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1402 ui.debug(b'changing topic of %s from %s to %s\n' % (
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1403 c, oldtopic or b'<none>', newtopic or b'<none>'))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1404 ui.debug(b'fixedextra: %r\n' % fixedextra)
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1405 # 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
1406 # 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
1407 # 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
1408 p1 = c.p1().node()
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1409 p2 = c.p2().node()
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1410 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
1411 p1 = successors[p1][0]
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1412 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
1413 p2 = successors[p2][0]
3040
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
1414 mc = context.memctx(repo,
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
1415 (p1, p2),
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
1416 c.description(),
5919
1a8e86053adb topic: don't lose any file changes when changing topic of a merge commit
Anton Shestakov <av6@dwimlabs.net>
parents: 5907
diff changeset
1417 files,
3040
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
1418 filectxfn,
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
1419 user=c.user(),
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
1420 date=c.date(),
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
1421 extra=fixedextra)
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
1422
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
1423 # phase handling
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
1424 commitphase = c.phase()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1425 overrides = {(b'phases', b'new-commit'): commitphase}
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1426 with repo.ui.configoverride(overrides, b'changetopic'):
3040
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
1427 newnode = repo.commitctx(mc)
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
1428
3038
103244e34a9c topics: use scmutil.cleanupnodes to create markers while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3030
diff changeset
1429 successors[c.node()] = (newnode,)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1430 ui.debug(b'new node id is %s\n' % node.hex(newnode))
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1431 rewrote += 1
3038
103244e34a9c topics: use scmutil.cleanupnodes to create markers while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3030
diff changeset
1432
103244e34a9c topics: use scmutil.cleanupnodes to create markers while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3030
diff changeset
1433 # 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
1434 # 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
1435 # this makes the operations more modulars
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1436 scmutil.cleanupnodes(repo, successors, b'changetopics')
3040
a05b6580f71c topics: handle phase correctly while changing topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3038
diff changeset
1437
2850
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1438 # move the working copy too
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1439 wctx = repo[None]
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1440 # 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
1441 if len(wctx.parents()) == 1:
a0d6741d4bb8 topics: take locks and start transaction before calling _changetopics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2831
diff changeset
1442 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
1443 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
1444 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
1445 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
1446
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
1447 def _listtopics(ui, repo, opts):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1448 fm = ui.formatter(b'topics', pycompat.byteskwargs(opts))
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
1449 activetopic = repo.currenttopic
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1450 namemask = b'%s'
3060
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
1451 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
1452 maxwidth = max(len(t) for t in repo.topics)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1453 namemask = b'%%-%is' % maxwidth
4303
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1454 if opts.get('age'):
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1455 # here we sort by age and topic name
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1456 topicsdata = sorted(_getlasttouched(repo, repo.topics))
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1457 else:
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1458 # here we sort by topic name only
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1459 topicsdata = (
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1460 (None, topic, None, None)
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1461 for topic in sorted(repo.topics)
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1462 )
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1463 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
1464 fm.startitem()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1465 marker = b' '
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1466 label = b'topic'
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
1467 active = (topic == activetopic)
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
1468 if active:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1469 marker = b'*'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1470 label = b'topic.active'
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
1471 if not ui.quiet:
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
1472 # registering the active data is made explicitly later
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1473 fm.plain(b' %s ' % marker, label=label)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1474 fm.write(b'topic', namemask, topic, label=label)
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
1475 fm.data(active=active)
3060
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
1476
3372
4138771105bb topics: list only topic names in quiet mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3371
diff changeset
1477 if ui.quiet:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1478 fm.plain(b'\n')
3372
4138771105bb topics: list only topic names in quiet mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3371
diff changeset
1479 continue
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1480 fm.plain(b' (')
4303
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1481 if date:
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1482 if age == -1:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1483 timestr = b'empty and active'
4303
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1484 else:
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1485 timestr = templatefilters.age(date)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1486 fm.write(b'lasttouched', b'%s', timestr, label=b'topic.list.time')
4303
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1487 if user:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1488 fm.write(b'usertouched', b' by %s', user, label=b'topic.list.user')
4303
78700a59192a topic: merge _showlasttouched logic into _listtopics
Anton Shestakov <av6@dwimlabs.net>
parents: 4302
diff changeset
1489 if date:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1490 fm.plain(b', ')
3060
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
1491 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
1492 if ui.verbose:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1493 fm.write(b'branches+', b'on branch: %s',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1494 b'+'.join(data.branches), # XXX use list directly after 4.0 is released
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1495 label=b'topic.list.branches')
3059
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
1496
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1497 fm.plain(b', ')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1498 fm.write(b'changesetcount', b'%d changesets', data.changesetcount,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1499 label=b'topic.list.changesetcount')
3060
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
1500
4581
48521a49a07e stack: rename troubledcount to unstablecount
Anton Shestakov <av6@dwimlabs.net>
parents: 4574
diff changeset
1501 if data.unstablecount:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1502 fm.plain(b', ')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1503 fm.write(b'unstablecount', b'%d unstable',
4581
48521a49a07e stack: rename troubledcount to unstablecount
Anton Shestakov <av6@dwimlabs.net>
parents: 4574
diff changeset
1504 data.unstablecount,
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1505 label=b'topic.list.unstablecount')
3059
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
1506
3060
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
1507 headcount = len(data.heads)
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
1508 if 1 < headcount:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1509 fm.plain(b', ')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1510 fm.write(b'headcount', b'%d heads',
3060
f43a310c4338 topics: show changesetcount, troubledcount and headscount by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3059
diff changeset
1511 headcount,
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1512 label=b'topic.list.headcount.multiple')
3059
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
1513
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
1514 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
1515 # 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
1516
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
1517 behindcount = data.behindcount
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
1518 if 0 < behindcount:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1519 fm.plain(b', ')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1520 fm.write(b'behindcount', b'%d behind',
3059
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
1521 behindcount,
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1522 label=b'topic.list.behindcount')
3059
02b220984b01 topics: use stack.stack() instead of stack.stackdata()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3057
diff changeset
1523 elif -1 == behindcount:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1524 fm.plain(b', ')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1525 fm.write(b'behinderror', b'%s',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1526 _(b'ambiguous destination: %s') % data.behinderror,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1527 label=b'topic.list.behinderror')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1528 fm.plain(b')\n')
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
1529 fm.end()
1974
20fb4195bfc4 topic: extract the code listing all topics
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1973
diff changeset
1530
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
1531 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
1532 """
4302
8e9940f1ae56 topic: simplify _showlasttouched and _getlasttouched (and its data structure)
Anton Shestakov <av6@dwimlabs.net>
parents: 4285
diff changeset
1533 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
1534 (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
1535 """
d39942773163 topics: add a new flag --age which will show last touched time for topics
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2718
diff changeset
1536 curtime = time.time()
4302
8e9940f1ae56 topic: simplify _showlasttouched and _getlasttouched (and its data structure)
Anton Shestakov <av6@dwimlabs.net>
parents: 4285
diff changeset
1537 for topic in topics:
8e9940f1ae56 topic: simplify _showlasttouched and _getlasttouched (and its data structure)
Anton Shestakov <av6@dwimlabs.net>
parents: 4285
diff changeset
1538 age = -1
2993
725b660d9886 topics: show the user who last touched the topic in --age
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2992
diff changeset
1539 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
1540 maxtime = (0, 0)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1541 trevs = repo.revs(b"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
1542 # 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
1543 # 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
1544 # 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
1545 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
1546 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
1547 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
1548 # 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
1549 # 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
1550 maxtime = rt
2993
725b660d9886 topics: show the user who last touched the topic in --age
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2992
diff changeset
1551 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
1552 # 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
1553 # last touch time.
4942
acc7e27fa5c6 topic: drop compat.getmarkers() and use obsutil.getmarkers() directly
Anton Shestakov <av6@dwimlabs.net>
parents: 4921
diff changeset
1554 obsmarkers = obsutil.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
1555 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
1556 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
1557 if rt[0] > maxtime[0]:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1558 user = marker.metadata().get(b'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
1559 maxtime = rt
2993
725b660d9886 topics: show the user who last touched the topic in --age
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2992
diff changeset
1560
3371
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3297
diff changeset
1561 username = stack.parseusername(user)
4302
8e9940f1ae56 topic: simplify _showlasttouched and _getlasttouched (and its data structure)
Anton Shestakov <av6@dwimlabs.net>
parents: 4285
diff changeset
1562 if trevs:
8e9940f1ae56 topic: simplify _showlasttouched and _getlasttouched (and its data structure)
Anton Shestakov <av6@dwimlabs.net>
parents: 4285
diff changeset
1563 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
1564
4302
8e9940f1ae56 topic: simplify _showlasttouched and _getlasttouched (and its data structure)
Anton Shestakov <av6@dwimlabs.net>
parents: 4285
diff changeset
1565 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
1566
1848
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
1567 def summaryhook(ui, repo):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1568 t = getattr(repo, 'currenttopic', b'')
1848
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
1569 if not t:
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
1570 return
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
1571 # i18n: column positioning for "hg summary"
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1572 ui.write(_(b"topic: %s\n") % ui.label(t, b'topic.active'))
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
1573
3022
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
1574 _validmode = [
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1575 b'ignore',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1576 b'warning',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1577 b'enforce',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1578 b'enforce-all',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1579 b'random',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1580 b'random-all',
3022
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
1581 ]
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
1582
3020
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
1583 def _configtopicmode(ui):
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
1584 """ 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
1585 """
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1586 topicmode = ui.config(b'experimental', b'topic-mode')
3020
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
1587
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
1588 # 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
1589 if topicmode is None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1590 enforcetopic = ui.configbool(b'experimental', b'enforce-topic')
3020
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
1591 if enforcetopic:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1592 topicmode = b"enforce"
3022
255e66783505 topic: add documentation for the 'topic-mode' option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3021
diff changeset
1593 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
1594 topicmode = _validmode[0]
3020
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
1595
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
1596 return topicmode
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
1597
1850
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
1598 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
1599 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
1600 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
1601 with repo.wlock():
3020
361d83261d7a topic: migrate experimental.enforce-topic to experimental.topic-mode
Boris Feld <boris.feld@octobus.net>
parents: 3014
diff changeset
1602 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
1603 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
1604
89855920fb0f topicmode: 'enforce' topic mode, no longer warn about untopiced merge
Boris Feld <boris.feld@octobus.net>
parents: 3023
diff changeset
1605 notopic = not repo.currenttopic
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1606 mayabort = (topicmode == b"enforce" and not ismergecommit)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1607 maywarn = (topicmode == b"warning"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1608 or (topicmode == b"enforce" and ismergecommit))
3024
89855920fb0f topicmode: 'enforce' topic mode, no longer warn about untopiced merge
Boris Feld <boris.feld@octobus.net>
parents: 3023
diff changeset
1609
3030
581a6b9d2c8c test: add support for random-all topic mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3028
diff changeset
1610 mayrandom = False
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1611 if topicmode == b"random":
3030
581a6b9d2c8c test: add support for random-all topic mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3028
diff changeset
1612 mayrandom = not ismergecommit
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1613 elif topicmode == b"random-all":
3030
581a6b9d2c8c test: add support for random-all topic mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3028
diff changeset
1614 mayrandom = True
581a6b9d2c8c test: add support for random-all topic mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3028
diff changeset
1615
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1616 if topicmode == b'enforce-all':
3025
e814c553ef32 topic: add a 'enforce-all' mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3024
diff changeset
1617 ismergecommit = False
e814c553ef32 topic: add a 'enforce-all' mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3024
diff changeset
1618 mayabort = True
e814c553ef32 topic: add a 'enforce-all' mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3024
diff changeset
1619 maywarn = False
e814c553ef32 topic: add a 'enforce-all' mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3024
diff changeset
1620
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1621 hint = _(b"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
1622 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
1623 t = opts['topic']
6825
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
1624 _changecurrenttopic(repo, t)
3097
f06c86fd2ffd topic: do to check to topic while amending
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3096
diff changeset
1625 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
1626 pass
3024
89855920fb0f topicmode: 'enforce' topic mode, no longer warn about untopiced merge
Boris Feld <boris.feld@octobus.net>
parents: 3023
diff changeset
1627 elif notopic and mayabort:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1628 msg = _(b"no active topic")
2733
adfbb984ebbb topics: check for topic on commit before a user enters message
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2731
diff changeset
1629 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
1630 elif notopic and maywarn:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1631 ui.warn(_(b"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
1632 if not ui.quiet:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1633 ui.warn((b"(%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
1634 elif notopic and mayrandom:
6825
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
1635 t = randomname.randomtopicname(ui)
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
1636 _changecurrenttopic(repo, t)
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
1637 return orig(ui, repo, *args, **opts)
1850
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
1638
1852
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
1639 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
1640 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
1641 if hastopicext(repo):
24662f94d126 topic: only wrap committext for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4533
diff changeset
1642 t = repo.currenttopic
24662f94d126 topic: only wrap committext for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4533
diff changeset
1643 if t:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1644 ret = ret.replace(b"\nHG: branch",
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1645 b"\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
1646 return ret
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
1647
2983
c0de0010ec30 topic: add a --topic option to "outgoing" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2982
diff changeset
1648 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
1649 if opts.get('topic'):
5380
60317988f5ae topic: substitute current topic when `--topic .` is used for outgoing/push
Anton Shestakov <av6@dwimlabs.net>
parents: 5375
diff changeset
1650 topic = opts['topic']
60317988f5ae topic: substitute current topic when `--topic .` is used for outgoing/push
Anton Shestakov <av6@dwimlabs.net>
parents: 5375
diff changeset
1651 if topic == b'.':
60317988f5ae topic: substitute current topic when `--topic .` is used for outgoing/push
Anton Shestakov <av6@dwimlabs.net>
parents: 5375
diff changeset
1652 topic = repo.currenttopic
60317988f5ae topic: substitute current topic when `--topic .` is used for outgoing/push
Anton Shestakov <av6@dwimlabs.net>
parents: 5375
diff changeset
1653 topic = b'literal:' + topic
5375
bed4fc158fc9 topic: treat argument to --topic as a literal topic name explicitly
Anton Shestakov <av6@dwimlabs.net>
parents: 5320
diff changeset
1654 topicrevs = repo.revs(b'topic(%s) - obsolete()', topic)
2982
fef934b7ed86 topic: add a --topic option to "push" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2939
diff changeset
1655 opts.setdefault('rev', []).extend(topicrevs)
fef934b7ed86 topic: add a --topic option to "push" command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 2939
diff changeset
1656 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
1657
1877
69077c65919d topic: handle merge.update function signature change
Augie Fackler <raf@durin42.com>
parents: 1874
diff changeset
1658 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
1659 matcher = kwargs.get('matcher')
e67c526c0a25 update: calculate 'partial' as core does
Sean Farley <sean@farley.io>
parents: 1963
diff changeset
1660 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
1661 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
1662 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
1663 ist0 = False
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
1664 try:
5601
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1665 mergemode = repo.ui.config(b'experimental', b'topic.linear-merge')
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1666
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1667 cleanup = lambda: None
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1668 oldrepo = repo
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1669 if mergemode == b'allow-from-bare-branch' and not repo[None].topic():
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1670 unfi = repo.unfiltered()
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1671 oldrepo = repo
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1672 old = unfi.__class__
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1673
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1674 class overridebranch(old):
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1675 def __getitem__(self, rev):
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1676 ret = super(overridebranch, self).__getitem__(rev)
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1677 if rev == node:
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1678 b = ret.branch()
6311
466702ac6c28 topic: complete "//" format support in experimental.topic.linear-merge code
Anton Shestakov <av6@dwimlabs.net>
parents: 6306
diff changeset
1679 tns = ret.topic_namespace()
5601
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1680 t = ret.topic()
6311
466702ac6c28 topic: complete "//" format support in experimental.topic.linear-merge code
Anton Shestakov <av6@dwimlabs.net>
parents: 6306
diff changeset
1681 # topic is required for merging from bare branch
5601
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1682 if t:
6311
466702ac6c28 topic: complete "//" format support in experimental.topic.linear-merge code
Anton Shestakov <av6@dwimlabs.net>
parents: 6306
diff changeset
1683 ret.branch = lambda: common.formatfqbn(b, tns, t)
5601
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1684 return ret
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1685 unfi.__class__ = overridebranch
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1686 if repo.filtername is not None:
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1687 repo = unfi.filtered(repo.filtername)
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1688
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1689 def cleanup():
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1690 unfi.__class__ = old
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1691
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1692 try:
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1693 ret = orig(repo, node, branchmerge, force, *args, **kwargs)
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1694 finally:
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1695 cleanup()
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1696 repo = oldrepo
3946ee4ee3ae topic: add a `exp….topic.linear-merge` option to allow some oedipus
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5566
diff changeset
1697
4535
8dae14cd076a topic: only wrap mergeupdate for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4534
diff changeset
1698 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
1699 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
1700 # 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
1701 # 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
1702 # 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
1703 # 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
1704 # running.
6245
a54db3e55c88 topic: switch to namespace when updating to a commit, similar to topic
Anton Shestakov <av6@dwimlabs.net>
parents: 6243
diff changeset
1705 otns = repo.currenttns
2984
30f6030dca8f topics: signal to the end user when a topic has been forgotten
Aurélien Campéas
parents: 2983
diff changeset
1706 ot = repo.currenttopic
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1707 if repo.ui.hasconfig(b'experimental', b'topicrebase'):
2679
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
1708 isrebase = True
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1709 if repo.ui.configbool(b'_internal', b'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
1710 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
1711 if ((not partial and not branchmerge) or isrebase) and not ist0:
6487
963471ebe26a topic: make topic namespace use string "none" as the default/empty value
Anton Shestakov <av6@dwimlabs.net>
parents: 6480
diff changeset
1712 tns = b'none'
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1713 t = b''
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
1714 pctx = repo[node]
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
1715 if pctx.phase() > phases.public:
6245
a54db3e55c88 topic: switch to namespace when updating to a commit, similar to topic
Anton Shestakov <av6@dwimlabs.net>
parents: 6243
diff changeset
1716 tns = pctx.topic_namespace()
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
1717 t = pctx.topic()
6656
d3668c704d40 topic: use the appropriate functions to change topic and tns on wdir update
Anton Shestakov <av6@dwimlabs.net>
parents: 6655
diff changeset
1718 _changecurrenttns(repo, tns)
6487
963471ebe26a topic: make topic namespace use string "none" as the default/empty value
Anton Shestakov <av6@dwimlabs.net>
parents: 6480
diff changeset
1719 if tns != b'none' and tns != otns:
6245
a54db3e55c88 topic: switch to namespace when updating to a commit, similar to topic
Anton Shestakov <av6@dwimlabs.net>
parents: 6243
diff changeset
1720 repo.ui.status(_(b"switching to topic-namespace %s\n") % tns)
6656
d3668c704d40 topic: use the appropriate functions to change topic and tns on wdir update
Anton Shestakov <av6@dwimlabs.net>
parents: 6655
diff changeset
1721 _changecurrenttopic(repo, t)
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
1722 if t and t != ot:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1723 repo.ui.status(_(b"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
1724 if ot and not t:
4652
b72cd597a887 stack: check if stack is empty more pythonically
Anton Shestakov <av6@dwimlabs.net>
parents: 4647
diff changeset
1725 st = stack.stack(repo, topic=ot)
b72cd597a887 stack: check if stack is empty more pythonically
Anton Shestakov <av6@dwimlabs.net>
parents: 4647
diff changeset
1726 if not st:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1727 repo.ui.status(_(b'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
1728 elif ist0:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1729 repo.ui.status(_(b"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
1730 return ret
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
1731 finally:
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
1732 wlock.release()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
1733
2793
fb317d218af0 topic: wrap 'update' in a more flexible way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
1734 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
1735
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1736 thezeros = set([b't0', b'b0', b's0'])
5008
848ca807f83a topic: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5007
diff changeset
1737 configoverride = util.nullcontextmanager()
848ca807f83a topic: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5007
diff changeset
1738 if node in thezeros or rev in thezeros:
848ca807f83a topic: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5007
diff changeset
1739 configoverride = repo.ui.configoverride({
848ca807f83a topic: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5007
diff changeset
1740 (b'_internal', b'keep-topic'): b'yes'
848ca807f83a topic: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5007
diff changeset
1741 }, source=b'topic-extension')
848ca807f83a topic: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5007
diff changeset
1742 with configoverride:
3614
9ad461df4d4d compat: keep passing arguments as keyword argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3612
diff changeset
1743 return orig(ui, repo, node=node, rev=rev, *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
1744
6828
90f867d5be22 topic: make hg branch command output FQBN
Anton Shestakov <av6@dwimlabs.net>
parents: 6825
diff changeset
1745 def wrap_branch_cmd(orig, ui, repo, label=None, **opts):
90f867d5be22 topic: make hg branch command output FQBN
Anton Shestakov <av6@dwimlabs.net>
parents: 6825
diff changeset
1746 if not opts.get('clean') and not label and not opts.get('rev'):
90f867d5be22 topic: make hg branch command output FQBN
Anton Shestakov <av6@dwimlabs.net>
parents: 6825
diff changeset
1747 ui.write(b'%s\n' % repo[None].fqbn())
90f867d5be22 topic: make hg branch command output FQBN
Anton Shestakov <av6@dwimlabs.net>
parents: 6825
diff changeset
1748 return
90f867d5be22 topic: make hg branch command output FQBN
Anton Shestakov <av6@dwimlabs.net>
parents: 6825
diff changeset
1749 return orig(ui, repo, label=label, **opts)
90f867d5be22 topic: make hg branch command output FQBN
Anton Shestakov <av6@dwimlabs.net>
parents: 6825
diff changeset
1750
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
1751 def _fixrebase(loaded):
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
1752 if not loaded:
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
1753 return
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
1754
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
1755 def savetopic(ctx, extra):
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
1756 if ctx.topic():
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
1757 extra[constants.extrakey] = ctx.topic()
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
1758
2679
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
1759 def setrebaseconfig(orig, ui, repo, **opts):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1760 repo.ui.setconfig(b'experimental', b'topicrebase', b'yes',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1761 source=b'topic-extension')
2679
5156a67f66a6 topics: update current topic to the topic of newly rebased commit (issue5551)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2677
diff changeset
1762 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
1763
3612
33b718191bc9 rebase: update the rebase wrapping to works with hg 4.6
Boris Feld <boris.feld@octobus.net>
parents: 3603
diff changeset
1764 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
1765 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
1766
33b718191bc9 rebase: update the rebase wrapping to works with hg 4.6
Boris Feld <boris.feld@octobus.net>
parents: 3603
diff changeset
1767 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
1768 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
1769
33b718191bc9 rebase: update the rebase wrapping to works with hg 4.6
Boris Feld <boris.feld@octobus.net>
parents: 3603
diff changeset
1770 return runtime
33b718191bc9 rebase: update the rebase wrapping to works with hg 4.6
Boris Feld <boris.feld@octobus.net>
parents: 3603
diff changeset
1771
1969
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
1772 try:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1773 rebase = extensions.find(b"rebase")
3612
33b718191bc9 rebase: update the rebase wrapping to works with hg 4.6
Boris Feld <boris.feld@octobus.net>
parents: 3603
diff changeset
1774 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
1775 # 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
1776 # 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
1777 # when we have better options.
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1778 extensions.wrapcommand(rebase.cmdtable, b'rebase', setrebaseconfig)
1969
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
1779 except KeyError:
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
1780 pass
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
1781
1946
72246b13bd72 patch: document the section about import/export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1945
diff changeset
1782 ## 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
1783
6539
45689da4ed41 topic: teach hg import/export to handle topic namespace as well
Anton Shestakov <av6@dwimlabs.net>
parents: 6537
diff changeset
1784 def _exporttns(seq, ctx):
45689da4ed41 topic: teach hg import/export to handle topic namespace as well
Anton Shestakov <av6@dwimlabs.net>
parents: 6537
diff changeset
1785 tns = ctx.topic_namespace()
45689da4ed41 topic: teach hg import/export to handle topic namespace as well
Anton Shestakov <av6@dwimlabs.net>
parents: 6537
diff changeset
1786 if tns != b'none':
45689da4ed41 topic: teach hg import/export to handle topic namespace as well
Anton Shestakov <av6@dwimlabs.net>
parents: 6537
diff changeset
1787 return b'EXP-Topic-Namespace %s' % tns
45689da4ed41 topic: teach hg import/export to handle topic namespace as well
Anton Shestakov <av6@dwimlabs.net>
parents: 6537
diff changeset
1788 return None
45689da4ed41 topic: teach hg import/export to handle topic namespace as well
Anton Shestakov <av6@dwimlabs.net>
parents: 6537
diff changeset
1789
1866
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
1790 def _exporttopic(seq, ctx):
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
1791 topic = ctx.topic()
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
1792 if topic:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1793 return b'EXP-Topic %s' % topic
1866
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
1794 return None
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
1795
6539
45689da4ed41 topic: teach hg import/export to handle topic namespace as well
Anton Shestakov <av6@dwimlabs.net>
parents: 6537
diff changeset
1796 def _importtns(repo, patchdata, extra, opts):
45689da4ed41 topic: teach hg import/export to handle topic namespace as well
Anton Shestakov <av6@dwimlabs.net>
parents: 6537
diff changeset
1797 if b'topic-namespace' in patchdata:
45689da4ed41 topic: teach hg import/export to handle topic namespace as well
Anton Shestakov <av6@dwimlabs.net>
parents: 6537
diff changeset
1798 extra[b'topic-namespace'] = patchdata[b'topic-namespace']
45689da4ed41 topic: teach hg import/export to handle topic namespace as well
Anton Shestakov <av6@dwimlabs.net>
parents: 6537
diff changeset
1799
1867
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
1800 def _importtopic(repo, patchdata, extra, opts):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1801 if b'topic' in patchdata:
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1802 extra[b'topic'] = patchdata[b'topic']
1867
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
1803
1948
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
1804 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
1805 """run at ui setup time to install import/export logic"""
6539
45689da4ed41 topic: teach hg import/export to handle topic namespace as well
Anton Shestakov <av6@dwimlabs.net>
parents: 6537
diff changeset
1806 cmdutil.extraexport.append(b'topic-namespace')
45689da4ed41 topic: teach hg import/export to handle topic namespace as well
Anton Shestakov <av6@dwimlabs.net>
parents: 6537
diff changeset
1807 cmdutil.extraexportmap[b'topic-namespace'] = _exporttns
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1808 cmdutil.extraexport.append(b'topic')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1809 cmdutil.extraexportmap[b'topic'] = _exporttopic
6539
45689da4ed41 topic: teach hg import/export to handle topic namespace as well
Anton Shestakov <av6@dwimlabs.net>
parents: 6537
diff changeset
1810 cmdutil.extrapreimport.append(b'topic-namespace')
45689da4ed41 topic: teach hg import/export to handle topic namespace as well
Anton Shestakov <av6@dwimlabs.net>
parents: 6537
diff changeset
1811 cmdutil.extrapreimportmap[b'topic-namespace'] = _importtns
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1812 cmdutil.extrapreimport.append(b'topic')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1813 cmdutil.extrapreimportmap[b'topic'] = _importtopic
6539
45689da4ed41 topic: teach hg import/export to handle topic namespace as well
Anton Shestakov <av6@dwimlabs.net>
parents: 6537
diff changeset
1814 patch.patchheadermap.append((b'EXP-Topic-Namespace', b'topic-namespace'))
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
1815 patch.patchheadermap.append((b'EXP-Topic', b'topic'))
2667
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
1816
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
1817 ## preserve topic during split
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
1818
6417
c37754bb02d4 topic: rename presplitupdatetopic() to wrappresplitupdate()
Anton Shestakov <av6@dwimlabs.net>
parents: 6410
diff changeset
1819 def wrappresplitupdate(original, repo, ui, prev, ctx):
2667
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
1820 # Save topic of revision
6418
50c4ed02ac6d topic: make hg split preserve topic namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6417
diff changeset
1821 tns = None
2667
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
1822 topic = None
6418
50c4ed02ac6d topic: make hg split preserve topic namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6417
diff changeset
1823 if util.safehasattr(ctx, 'topic_namespace'):
50c4ed02ac6d topic: make hg split preserve topic namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6417
diff changeset
1824 tns = ctx.topic_namespace()
2667
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
1825 if util.safehasattr(ctx, 'topic'):
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
1826 topic = ctx.topic()
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
1827
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
1828 # Update the working directory
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
1829 original(repo, ui, prev, ctx)
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
1830
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
1831 # Restore the topic if need
6535
d324fa553620 topic: check if tns is "none" in one more place
Anton Shestakov <av6@dwimlabs.net>
parents: 6534
diff changeset
1832 if tns != b'none':
6418
50c4ed02ac6d topic: make hg split preserve topic namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6417
diff changeset
1833 _changecurrenttns(repo, tns)
2667
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
1834 if topic:
e7079bba383d topic: makes split keep the topic
Boris Feld <boris.feld@octobus.net>
parents: 2665
diff changeset
1835 _changecurrenttopic(repo, topic)
6236
7ad8107d953a topic: introduce topic namespaces concept starting with simple parsing
Anton Shestakov <av6@dwimlabs.net>
parents: 6206
diff changeset
1836
6537
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1837 def wrapprecheck(orig, repo, revs, action=b'rewrite', check_divergence=True):
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1838 # hg <= 6.1 (d4752aeb20f1)
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1839 args = pycompat.getargspec(orig).args
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1840 if r'check_divergence' in args:
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1841 orig(repo, revs, action, check_divergence=check_divergence)
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1842 else:
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1843 orig(repo, revs, action)
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1844
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1845 # TODO: at some point in future the default will change from '*' to the
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1846 # default topic namespace for the current user
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1847 allow = set(repo.ui.configlist(b'experimental', b'tns-allow-rewrite', [b'*']))
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1848 if b'*' not in allow:
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1849 namespaces = set(repo[rev].topic_namespace() for rev in revs)
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1850 disallowed = namespaces - allow
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1851 if disallowed:
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1852 msg = _(b"refusing to %s changesets with these topic namespaces: %s")
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1853 msg %= (action, b' '.join(disallowed))
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1854 hint = _(b"modify experimental.tns-allow-rewrite to allow rewriting changesets from these topic namespaces")
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1855 raise compat.InputError(msg, hint=hint)
80d5d4e587f7 topic: experimental config option and topic namespace checking in precheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 6535
diff changeset
1856
6239
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1857 def _changecurrenttns(repo, tns):
6825
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
1858 with repo.wlock():
ba7ede61f6d4 topic: implement dirstate.topic() and dirstate.tns()
Anton Shestakov <av6@dwimlabs.net>
parents: 6822
diff changeset
1859 repo.dirstate.settns(tns, repo.currenttransaction())
6239
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1860
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1861 @command(b'debug-topic-namespace', [
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1862 (b'', b'clear', False, b'clear active topic namespace if any'),
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1863 ],
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1864 _(b'[NAMESPACE|--clear]'))
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1865 def debugtopicnamespace(ui, repo, tns=None, **opts):
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1866 """set or show the current topic namespace"""
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1867 if opts.get('clear'):
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1868 if tns:
6615
9e442e116621 topic: use InputError instead of simple Abort for topic namespaces checks
Anton Shestakov <av6@dwimlabs.net>
parents: 6614
diff changeset
1869 raise compat.InputError(_(b"cannot use --clear when setting a topic namespace"))
6534
43a1bacf6a14 topic: write topic namespace to disk if it's not "none"
Anton Shestakov <av6@dwimlabs.net>
parents: 6530
diff changeset
1870 tns = b'none'
6239
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1871 elif not tns:
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1872 ui.write(b'%s\n' % repo.currenttns)
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1873 return
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1874 if tns:
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1875 tns = tns.strip()
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1876 if not tns:
6615
9e442e116621 topic: use InputError instead of simple Abort for topic namespaces checks
Anton Shestakov <av6@dwimlabs.net>
parents: 6614
diff changeset
1877 raise compat.InputError(_(b"topic namespace cannot consist entirely of whitespace"))
6239
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1878 if b'/' in tns:
6615
9e442e116621 topic: use InputError instead of simple Abort for topic namespaces checks
Anton Shestakov <av6@dwimlabs.net>
parents: 6614
diff changeset
1879 raise compat.InputError(_(b"topic namespace cannot contain '/' character"))
6239
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1880 scmutil.checknewlabel(repo, tns, b'topic namespace')
6612
94bf2f307b75 topic: check that topic namespace names are human-readable like topics
Anton Shestakov <av6@dwimlabs.net>
parents: 6611
diff changeset
1881
94bf2f307b75 topic: check that topic namespace names are human-readable like topics
Anton Shestakov <av6@dwimlabs.net>
parents: 6611
diff changeset
1882 helptxt = _(b"topic namespace names can only consist of alphanumeric, "
94bf2f307b75 topic: check that topic namespace names are human-readable like topics
Anton Shestakov <av6@dwimlabs.net>
parents: 6611
diff changeset
1883 b"'-', '_' and '.' characters")
94bf2f307b75 topic: check that topic namespace names are human-readable like topics
Anton Shestakov <av6@dwimlabs.net>
parents: 6611
diff changeset
1884 try:
94bf2f307b75 topic: check that topic namespace names are human-readable like topics
Anton Shestakov <av6@dwimlabs.net>
parents: 6611
diff changeset
1885 utns = encoding.unifromlocal(tns)
94bf2f307b75 topic: check that topic namespace names are human-readable like topics
Anton Shestakov <av6@dwimlabs.net>
parents: 6611
diff changeset
1886 except error.Abort:
6616
9107d91de94e topic: update comment in the topic namespace name check
Anton Shestakov <av6@dwimlabs.net>
parents: 6615
diff changeset
1887 # Maybe we should allow these topic namespace names as well, as
9107d91de94e topic: update comment in the topic namespace name check
Anton Shestakov <av6@dwimlabs.net>
parents: 6615
diff changeset
1888 # long as they don't break any other rules.
6612
94bf2f307b75 topic: check that topic namespace names are human-readable like topics
Anton Shestakov <av6@dwimlabs.net>
parents: 6611
diff changeset
1889 utns = ''
94bf2f307b75 topic: check that topic namespace names are human-readable like topics
Anton Shestakov <av6@dwimlabs.net>
parents: 6611
diff changeset
1890 rmatch = re.match(r'[-_.\w]+', utns, re.UNICODE)
94bf2f307b75 topic: check that topic namespace names are human-readable like topics
Anton Shestakov <av6@dwimlabs.net>
parents: 6611
diff changeset
1891 if not utns or not rmatch or rmatch.group(0) != utns:
94bf2f307b75 topic: check that topic namespace names are human-readable like topics
Anton Shestakov <av6@dwimlabs.net>
parents: 6611
diff changeset
1892 raise compat.InputError(_(b"invalid topic namespace name: '%s'") % tns, hint=helptxt)
6239
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1893 ctns = repo.currenttns
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1894 _changecurrenttns(repo, tns)
6541
09fb1cfb5adc topic: update hg debug-topic-namespace to treat "none" as the empty value
Anton Shestakov <av6@dwimlabs.net>
parents: 6539
diff changeset
1895 if ctns == b'none' and tns != b'none':
6239
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1896 repo.ui.status(_(b'marked working directory as topic namespace: %s\n')
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1897 % tns)
8861e33f3bb2 topic: setting current repo namespace with debug-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6238
diff changeset
1898
6238
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
1899 @command(b'debug-topic-namespaces', [])
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
1900 def debugtopicnamespaces(ui, repo, **opts):
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
1901 """list repository namespaces"""
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
1902 for tns in repo.topic_namespaces:
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
1903 ui.write(b'%s\n' % (tns,))
6bbd16579f0f topic: list namespaces with debug-namespaces
Anton Shestakov <av6@dwimlabs.net>
parents: 6237
diff changeset
1904
6739
c94690f59bea topic: allow selecting a specific tns value in debug-default-topic-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6738
diff changeset
1905 @command(b'debug-default-topic-namespace', [
c94690f59bea topic: allow selecting a specific tns value in debug-default-topic-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6738
diff changeset
1906 (b'', b'none', True, b'find changesets with topic-namespace=none'),
c94690f59bea topic: allow selecting a specific tns value in debug-default-topic-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6738
diff changeset
1907 (b'', b'default', False, b'find changesets with topic-namespace=default'),
6740
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1908 (b'', b'clear', False, b'remove topic namespace from commit extras'),
6739
c94690f59bea topic: allow selecting a specific tns value in debug-default-topic-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6738
diff changeset
1909 ] + commands.formatteropts)
6738
cf37748874f4 topic: add a simple debug command to list changesets with problematic tns
Anton Shestakov <av6@dwimlabs.net>
parents: 6737
diff changeset
1910 def debugdefaulttns(ui, repo, **opts):
cf37748874f4 topic: add a simple debug command to list changesets with problematic tns
Anton Shestakov <av6@dwimlabs.net>
parents: 6737
diff changeset
1911 """list changesets with the default topic namespace in commit extras"""
cf37748874f4 topic: add a simple debug command to list changesets with problematic tns
Anton Shestakov <av6@dwimlabs.net>
parents: 6737
diff changeset
1912 opts = pycompat.byteskwargs(opts)
6739
c94690f59bea topic: allow selecting a specific tns value in debug-default-topic-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6738
diff changeset
1913 condition = []
c94690f59bea topic: allow selecting a specific tns value in debug-default-topic-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6738
diff changeset
1914 if opts[b'none']:
c94690f59bea topic: allow selecting a specific tns value in debug-default-topic-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6738
diff changeset
1915 condition += [b'extra("topic-namespace", "none")']
c94690f59bea topic: allow selecting a specific tns value in debug-default-topic-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6738
diff changeset
1916 if opts[b'default']:
c94690f59bea topic: allow selecting a specific tns value in debug-default-topic-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6738
diff changeset
1917 condition += [b'extra("topic-namespace", "default")']
c94690f59bea topic: allow selecting a specific tns value in debug-default-topic-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6738
diff changeset
1918 if not condition:
c94690f59bea topic: allow selecting a specific tns value in debug-default-topic-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6738
diff changeset
1919 condition = [b'none()']
c94690f59bea topic: allow selecting a specific tns value in debug-default-topic-namespace
Anton Shestakov <av6@dwimlabs.net>
parents: 6738
diff changeset
1920 revs = repo.revs(b'not public() and not obsolete() and (%lr)', condition)
6740
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1921 if opts[b'clear']:
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1922 with repo.wlock(), repo.lock(), repo.transaction(b'debug-default-topic-namespace'):
6749
107c5af631a7 topic: make debug-default-topic-namespace --clear slightly smarter
Anton Shestakov <av6@dwimlabs.net>
parents: 6743
diff changeset
1923 successors = {}
6740
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1924 for rev in revs:
6749
107c5af631a7 topic: make debug-default-topic-namespace --clear slightly smarter
Anton Shestakov <av6@dwimlabs.net>
parents: 6743
diff changeset
1925 _clear_tns_extras(ui, repo, rev, successors)
107c5af631a7 topic: make debug-default-topic-namespace --clear slightly smarter
Anton Shestakov <av6@dwimlabs.net>
parents: 6743
diff changeset
1926 scmutil.cleanupnodes(repo, successors, b'debug-default-topic-namespace')
6740
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1927 return
6738
cf37748874f4 topic: add a simple debug command to list changesets with problematic tns
Anton Shestakov <av6@dwimlabs.net>
parents: 6737
diff changeset
1928 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
cf37748874f4 topic: add a simple debug command to list changesets with problematic tns
Anton Shestakov <av6@dwimlabs.net>
parents: 6737
diff changeset
1929 logcmdutil.displayrevs(ui, repo, revs, displayer, None)
cf37748874f4 topic: add a simple debug command to list changesets with problematic tns
Anton Shestakov <av6@dwimlabs.net>
parents: 6737
diff changeset
1930
6749
107c5af631a7 topic: make debug-default-topic-namespace --clear slightly smarter
Anton Shestakov <av6@dwimlabs.net>
parents: 6743
diff changeset
1931 def _clear_tns_extras(ui, repo, rev, successors):
6740
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1932 ctx = repo[rev]
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1933
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1934 if len(ctx.parents()) > 1:
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1935 # ctx.files() isn't reliable for merges, so fall back to the
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1936 # slower repo.status() method
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1937 st = ctx.p1().status(ctx)
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1938 files = set(st.modified) | set(st.added) | set(st.removed)
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1939 else:
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1940 files = set(ctx.files())
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1941
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1942 def filectxfn(repo, unused, path):
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1943 try:
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1944 return ctx[path]
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1945 except error.ManifestLookupError:
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1946 return None
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1947
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1948 extra = ctx.extra().copy()
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1949 del extra[b'topic-namespace']
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1950
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1951 p1 = ctx.p1().node()
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1952 p2 = ctx.p2().node()
6749
107c5af631a7 topic: make debug-default-topic-namespace --clear slightly smarter
Anton Shestakov <av6@dwimlabs.net>
parents: 6743
diff changeset
1953 if p1 in successors:
107c5af631a7 topic: make debug-default-topic-namespace --clear slightly smarter
Anton Shestakov <av6@dwimlabs.net>
parents: 6743
diff changeset
1954 p1 = successors[p1][0]
107c5af631a7 topic: make debug-default-topic-namespace --clear slightly smarter
Anton Shestakov <av6@dwimlabs.net>
parents: 6743
diff changeset
1955 if p2 in successors:
107c5af631a7 topic: make debug-default-topic-namespace --clear slightly smarter
Anton Shestakov <av6@dwimlabs.net>
parents: 6743
diff changeset
1956 p2 = successors[p2][0]
6740
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1957 mc = context.memctx(repo,
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1958 (p1, p2),
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1959 ctx.description(),
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1960 files,
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1961 filectxfn,
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1962 user=ctx.user(),
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1963 date=ctx.date(),
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1964 extra=extra)
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1965
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1966 overrides = {(b'phases', b'new-commit'): ctx.phase()}
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1967 with repo.ui.configoverride(overrides, b'debug-default-topic-namespace'):
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1968 newnode = repo.commitctx(mc)
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1969
6749
107c5af631a7 topic: make debug-default-topic-namespace --clear slightly smarter
Anton Shestakov <av6@dwimlabs.net>
parents: 6743
diff changeset
1970 successors[ctx.node()] = (newnode,)
6740
d959abd665fd topic: teach debug-default-topic-namespace how to clean commit extras
Anton Shestakov <av6@dwimlabs.net>
parents: 6739
diff changeset
1971
6236
7ad8107d953a topic: introduce topic namespaces concept starting with simple parsing
Anton Shestakov <av6@dwimlabs.net>
parents: 6206
diff changeset
1972 @command(b'debug-parse-fqbn', commands.formatteropts, _(b'FQBN'), optionalrepo=True)
7ad8107d953a topic: introduce topic namespaces concept starting with simple parsing
Anton Shestakov <av6@dwimlabs.net>
parents: 6206
diff changeset
1973 def debugparsefqbn(ui, repo, fqbn, **opts):
7ad8107d953a topic: introduce topic namespaces concept starting with simple parsing
Anton Shestakov <av6@dwimlabs.net>
parents: 6206
diff changeset
1974 """parse branch//namespace/topic string into its components"""
7ad8107d953a topic: introduce topic namespaces concept starting with simple parsing
Anton Shestakov <av6@dwimlabs.net>
parents: 6206
diff changeset
1975 branch, tns, topic = common.parsefqbn(fqbn)
7ad8107d953a topic: introduce topic namespaces concept starting with simple parsing
Anton Shestakov <av6@dwimlabs.net>
parents: 6206
diff changeset
1976 opts = pycompat.byteskwargs(opts)
7ad8107d953a topic: introduce topic namespaces concept starting with simple parsing
Anton Shestakov <av6@dwimlabs.net>
parents: 6206
diff changeset
1977 fm = ui.formatter(b'debug-parse-namespace', opts)
7ad8107d953a topic: introduce topic namespaces concept starting with simple parsing
Anton Shestakov <av6@dwimlabs.net>
parents: 6206
diff changeset
1978 fm.startitem()
7ad8107d953a topic: introduce topic namespaces concept starting with simple parsing
Anton Shestakov <av6@dwimlabs.net>
parents: 6206
diff changeset
1979 fm.write(b'branch', b'branch: %s\n', branch)
7ad8107d953a topic: introduce topic namespaces concept starting with simple parsing
Anton Shestakov <av6@dwimlabs.net>
parents: 6206
diff changeset
1980 fm.write(b'topic_namespace', b'namespace: %s\n', tns)
7ad8107d953a topic: introduce topic namespaces concept starting with simple parsing
Anton Shestakov <av6@dwimlabs.net>
parents: 6206
diff changeset
1981 fm.write(b'topic', b'topic: %s\n', topic)
7ad8107d953a topic: introduce topic namespaces concept starting with simple parsing
Anton Shestakov <av6@dwimlabs.net>
parents: 6206
diff changeset
1982 fm.end()
6237
0b9042408809 topic: formatting branch, namespace and topic into fully qualified branch name
Anton Shestakov <av6@dwimlabs.net>
parents: 6236
diff changeset
1983
0b9042408809 topic: formatting branch, namespace and topic into fully qualified branch name
Anton Shestakov <av6@dwimlabs.net>
parents: 6236
diff changeset
1984 @command(b'debug-format-fqbn', [
0b9042408809 topic: formatting branch, namespace and topic into fully qualified branch name
Anton Shestakov <av6@dwimlabs.net>
parents: 6236
diff changeset
1985 (b'b', b'branch', b'', b'branch'),
0b9042408809 topic: formatting branch, namespace and topic into fully qualified branch name
Anton Shestakov <av6@dwimlabs.net>
parents: 6236
diff changeset
1986 (b'n', b'topic-namespace', b'', b'topic namespace'),
0b9042408809 topic: formatting branch, namespace and topic into fully qualified branch name
Anton Shestakov <av6@dwimlabs.net>
parents: 6236
diff changeset
1987 (b't', b'topic', b'', b'topic'),
6266
213db29a19e9 topic: ability to shorten branch//namespace/topic strings when possible
Anton Shestakov <av6@dwimlabs.net>
parents: 6245
diff changeset
1988 (b's', b'short', False, b'short format'),
6237
0b9042408809 topic: formatting branch, namespace and topic into fully qualified branch name
Anton Shestakov <av6@dwimlabs.net>
parents: 6236
diff changeset
1989 ], optionalrepo=True)
0b9042408809 topic: formatting branch, namespace and topic into fully qualified branch name
Anton Shestakov <av6@dwimlabs.net>
parents: 6236
diff changeset
1990 def debugformatfqbn(ui, repo, **opts):
0b9042408809 topic: formatting branch, namespace and topic into fully qualified branch name
Anton Shestakov <av6@dwimlabs.net>
parents: 6236
diff changeset
1991 """format branch, namespace and topic into branch//namespace/topic string"""
6266
213db29a19e9 topic: ability to shorten branch//namespace/topic strings when possible
Anton Shestakov <av6@dwimlabs.net>
parents: 6245
diff changeset
1992 short = common.formatfqbn(opts.get('branch'), opts.get('topic_namespace'), opts.get('topic'), opts.get('short'))
6237
0b9042408809 topic: formatting branch, namespace and topic into fully qualified branch name
Anton Shestakov <av6@dwimlabs.net>
parents: 6236
diff changeset
1993 ui.write(b'%s\n' % short)