annotate hgext/histedit.py @ 48694:5c940f9ba3e4

dagop: don't import nullrev from .node twice See 59fa3890d40a. Differential Revision: https://phab.mercurial-scm.org/D12120
author Anton Shestakov <av6@dwimlabs.net>
date Mon, 31 Jan 2022 18:04:11 +0300
parents f1162b125991
children df56e6bd37f6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
1 # histedit.py - interactive history editing for mercurial
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
2 #
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
3 # Copyright 2009 Augie Fackler <raf@durin42.com>
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
4 #
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
5 # This software may be used and distributed according to the terms of the
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
6 # GNU General Public License version 2 or any later version.
17131
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
7 """interactive history editing
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
8
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
9 With this extension installed, Mercurial gains one new command: histedit. Usage
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
10 is as follows, assuming the following history::
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
11
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
12 @ 3[tip] 7c2fd3b9020c 2009-04-27 18:04 -0500 durin42
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
13 | Add delta
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
14 |
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
15 o 2 030b686bedc4 2009-04-27 18:04 -0500 durin42
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
16 | Add gamma
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
17 |
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
18 o 1 c561b4e977df 2009-04-27 18:04 -0500 durin42
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
19 | Add beta
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
20 |
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
21 o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
22 Add alpha
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
23
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
24 If you were to run ``hg histedit c561b4e977df``, you would see the following
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
25 file open in your editor::
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
26
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
27 pick c561b4e977df Add beta
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
28 pick 030b686bedc4 Add gamma
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
29 pick 7c2fd3b9020c Add delta
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
30
18322
e819c12a8bd0 histedit: correct changeset IDs in online help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17771
diff changeset
31 # Edit history between c561b4e977df and 7c2fd3b9020c
17131
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
32 #
20503
23dc77874191 histedit: clarify description of fold command
Adrian Zgorzałek <adek@fb.com>
parents: 20071
diff changeset
33 # Commits are listed from least to most recent
23dc77874191 histedit: clarify description of fold command
Adrian Zgorzałek <adek@fb.com>
parents: 20071
diff changeset
34 #
17131
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
35 # Commands:
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
36 # p, pick = use commit
46104
6f8a94bbfba1 histedit: adjust comment describing `edit` action for clarity
Augie Fackler <augie@google.com>
parents: 46103
diff changeset
37 # e, edit = use commit, but allow edits before making new commit
20511
5840da876235 histedit: shorten new fold message
Matt Mackall <mpm@selenic.com>
parents: 20503
diff changeset
38 # f, fold = use commit, but combine it with the one above
31056
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
39 # r, roll = like fold, but discard this commit's description and date
17131
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
40 # d, drop = remove commit from history
26100
5706d130ec16 histedit: improve discoverability of edit commit message
timeless@mozdev.org
parents: 26098
diff changeset
41 # m, mess = edit commit message without changing commit content
34489
270e344a6c74 histedit: removing the experimental config 'histeditng'
Saurabh Singh <singhsrb@fb.com>
parents: 34475
diff changeset
42 # b, base = checkout changeset and apply further changesets from there
17131
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
43 #
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
44
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
45 In this file, lines beginning with ``#`` are ignored. You must specify a rule
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
46 for each revision in your history. For example, if you had meant to add gamma
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
47 before beta, and then wanted to add delta in the same revision as beta, you
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
48 would reorganize the file to look like this::
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
49
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
50 pick 030b686bedc4 Add gamma
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
51 pick c561b4e977df Add beta
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
52 fold 7c2fd3b9020c Add delta
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
53
18322
e819c12a8bd0 histedit: correct changeset IDs in online help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17771
diff changeset
54 # Edit history between c561b4e977df and 7c2fd3b9020c
17131
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
55 #
20503
23dc77874191 histedit: clarify description of fold command
Adrian Zgorzałek <adek@fb.com>
parents: 20071
diff changeset
56 # Commits are listed from least to most recent
23dc77874191 histedit: clarify description of fold command
Adrian Zgorzałek <adek@fb.com>
parents: 20071
diff changeset
57 #
17131
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
58 # Commands:
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
59 # p, pick = use commit
46104
6f8a94bbfba1 histedit: adjust comment describing `edit` action for clarity
Augie Fackler <augie@google.com>
parents: 46103
diff changeset
60 # e, edit = use commit, but allow edits before making new commit
20511
5840da876235 histedit: shorten new fold message
Matt Mackall <mpm@selenic.com>
parents: 20503
diff changeset
61 # f, fold = use commit, but combine it with the one above
31056
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
62 # r, roll = like fold, but discard this commit's description and date
17131
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
63 # d, drop = remove commit from history
26100
5706d130ec16 histedit: improve discoverability of edit commit message
timeless@mozdev.org
parents: 26098
diff changeset
64 # m, mess = edit commit message without changing commit content
34489
270e344a6c74 histedit: removing the experimental config 'histeditng'
Saurabh Singh <singhsrb@fb.com>
parents: 34475
diff changeset
65 # b, base = checkout changeset and apply further changesets from there
17131
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
66 #
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
67
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
68 At which point you close the editor and ``histedit`` starts working. When you
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
69 specify a ``fold`` operation, ``histedit`` will open an editor when it folds
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
70 those revisions together, offering you a chance to clean up the commit message::
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
71
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
72 Add beta
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
73 ***
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
74 Add delta
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
75
31055
f1b63ec4b987 histedit: improve documentation and behaviour of dates
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 30983
diff changeset
76 Edit the commit message to your liking, then close the editor. The date used
f1b63ec4b987 histedit: improve documentation and behaviour of dates
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 30983
diff changeset
77 for the commit will be the later of the two commits' dates. For this example,
f1b63ec4b987 histedit: improve documentation and behaviour of dates
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 30983
diff changeset
78 let's assume that the commit message was changed to ``Add beta and delta.``
f1b63ec4b987 histedit: improve documentation and behaviour of dates
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 30983
diff changeset
79 After histedit has run and had a chance to remove any old or temporary
f1b63ec4b987 histedit: improve documentation and behaviour of dates
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 30983
diff changeset
80 revisions it needed, the history looks like this::
17131
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
81
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
82 @ 2[tip] 989b4d060121 2009-04-27 18:04 -0500 durin42
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
83 | Add beta and delta.
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
84 |
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
85 o 1 081603921c3f 2009-04-27 18:04 -0500 durin42
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
86 | Add gamma
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
87 |
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
88 o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
89 Add alpha
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
90
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
91 Note that ``histedit`` does *not* remove any revisions (even its own temporary
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
92 ones) until after it has completed all the editing operations, so it will
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
93 probably perform several strip operations when it's done. For the above example,
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
94 it had to run strip twice. Strip can be slow depending on a variety of factors,
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
95 so you might need to be a little patient. You can choose to keep the original
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
96 revisions by passing the ``--keep`` flag.
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
97
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
98 The ``edit`` operation will drop you back to a command prompt,
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
99 allowing you to edit files freely, or even use ``hg record`` to commit
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
100 some changes as a separate commit. When you're done, any remaining
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
101 uncommitted changes will be committed as well. When done, run ``hg
31055
f1b63ec4b987 histedit: improve documentation and behaviour of dates
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 30983
diff changeset
102 histedit --continue`` to finish this step. If there are uncommitted
f1b63ec4b987 histedit: improve documentation and behaviour of dates
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 30983
diff changeset
103 changes, you'll be prompted for a new commit message, but the default
f1b63ec4b987 histedit: improve documentation and behaviour of dates
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 30983
diff changeset
104 commit message will be the original message for the ``edit`` ed
f1b63ec4b987 histedit: improve documentation and behaviour of dates
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 30983
diff changeset
105 revision, and the date of the original commit will be preserved.
17131
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
106
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
107 The ``message`` operation will give you a chance to revise a commit
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
108 message without changing the contents. It's a shortcut for doing
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
109 ``edit`` immediately followed by `hg histedit --continue``.
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
110
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
111 If ``histedit`` encounters a conflict when moving a revision (while
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
112 handling ``pick`` or ``fold``), it'll stop in a similar manner to
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
113 ``edit`` with the difference that it won't prompt you for a commit
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
114 message when done. If you decide at this point that you don't like how
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
115 much work it will be to rearrange history, or that you made a mistake,
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
116 you can use ``hg histedit --abort`` to abandon the new changes you
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
117 have made and return to the state before you attempted to edit your
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
118 history.
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
119
18323
7648b87e76db histedit: correct the number of added revisions in online help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18322
diff changeset
120 If we clone the histedit-ed example repository above and add four more
7648b87e76db histedit: correct the number of added revisions in online help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18322
diff changeset
121 changes, such that we have the following history::
17131
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
122
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
123 @ 6[tip] 038383181893 2009-04-27 18:04 -0500 stefan
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
124 | Add theta
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
125 |
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
126 o 5 140988835471 2009-04-27 18:04 -0500 stefan
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
127 | Add eta
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
128 |
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
129 o 4 122930637314 2009-04-27 18:04 -0500 stefan
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
130 | Add zeta
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
131 |
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
132 o 3 836302820282 2009-04-27 18:04 -0500 stefan
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
133 | Add epsilon
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
134 |
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
135 o 2 989b4d060121 2009-04-27 18:04 -0500 durin42
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
136 | Add beta and delta.
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
137 |
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
138 o 1 081603921c3f 2009-04-27 18:04 -0500 durin42
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
139 | Add gamma
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
140 |
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
141 o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
142 Add alpha
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
143
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
144 If you run ``hg histedit --outgoing`` on the clone then it is the same
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
145 as running ``hg histedit 836302820282``. If you need plan to push to a
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
146 repository that Mercurial does not detect to be related to the source
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
147 repo, you can add a ``--force`` option.
24199
4047982904f8 histedit: add a config allowing changing histedit rule line length limit
Mateusz Kwapich <mitrandir@fb.com>
parents: 24196
diff changeset
148
27414
6602a7b9deec histedit: delete to drop
Mateusz Kwapich <mitrandir@fb.com>
parents: 27407
diff changeset
149 Config
6602a7b9deec histedit: delete to drop
Mateusz Kwapich <mitrandir@fb.com>
parents: 27407
diff changeset
150 ------
6602a7b9deec histedit: delete to drop
Mateusz Kwapich <mitrandir@fb.com>
parents: 27407
diff changeset
151
24199
4047982904f8 histedit: add a config allowing changing histedit rule line length limit
Mateusz Kwapich <mitrandir@fb.com>
parents: 24196
diff changeset
152 Histedit rule lines are truncated to 80 characters by default. You
26171
49c1424424de histedit: fix English (en-US)
timeless@mozdev.org
parents: 26100
diff changeset
153 can customize this behavior by setting a different length in your
24869
95a67d687903 histedit: fix reST syntax problem of example code in help document
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24831
diff changeset
154 configuration file::
24199
4047982904f8 histedit: add a config allowing changing histedit rule line length limit
Mateusz Kwapich <mitrandir@fb.com>
parents: 24196
diff changeset
155
24869
95a67d687903 histedit: fix reST syntax problem of example code in help document
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24831
diff changeset
156 [histedit]
95a67d687903 histedit: fix reST syntax problem of example code in help document
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24831
diff changeset
157 linelen = 120 # truncate rule lines at 120 characters
27262
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27217
diff changeset
158
41509
11c076786d56 histedit: add templating support to histedit's rule file generation
Augie Fackler <augie@google.com>
parents: 41399
diff changeset
159 The summary of a change can be customized as well::
11c076786d56 histedit: add templating support to histedit's rule file generation
Augie Fackler <augie@google.com>
parents: 41399
diff changeset
160
11c076786d56 histedit: add templating support to histedit's rule file generation
Augie Fackler <augie@google.com>
parents: 41399
diff changeset
161 [histedit]
11c076786d56 histedit: add templating support to histedit's rule file generation
Augie Fackler <augie@google.com>
parents: 41399
diff changeset
162 summary-template = '{rev} {bookmarks} {desc|firstline}'
11c076786d56 histedit: add templating support to histedit's rule file generation
Augie Fackler <augie@google.com>
parents: 41399
diff changeset
163
11c076786d56 histedit: add templating support to histedit's rule file generation
Augie Fackler <augie@google.com>
parents: 41399
diff changeset
164 The customized summary should be kept short enough that rule lines
11c076786d56 histedit: add templating support to histedit's rule file generation
Augie Fackler <augie@google.com>
parents: 41399
diff changeset
165 will fit in the configured line length. See above if that requires
11c076786d56 histedit: add templating support to histedit's rule file generation
Augie Fackler <augie@google.com>
parents: 41399
diff changeset
166 customization.
11c076786d56 histedit: add templating support to histedit's rule file generation
Augie Fackler <augie@google.com>
parents: 41399
diff changeset
167
27262
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27217
diff changeset
168 ``hg histedit`` attempts to automatically choose an appropriate base
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27217
diff changeset
169 revision to use. To change which base revision is used, define a
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27217
diff changeset
170 revset in your configuration file::
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27217
diff changeset
171
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27217
diff changeset
172 [histedit]
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27217
diff changeset
173 defaultrev = only(.) & draft()
27414
6602a7b9deec histedit: delete to drop
Mateusz Kwapich <mitrandir@fb.com>
parents: 27407
diff changeset
174
6602a7b9deec histedit: delete to drop
Mateusz Kwapich <mitrandir@fb.com>
parents: 27407
diff changeset
175 By default each edited revision needs to be present in histedit commands.
6602a7b9deec histedit: delete to drop
Mateusz Kwapich <mitrandir@fb.com>
parents: 27407
diff changeset
176 To remove revision you need to use ``drop`` operation. You can configure
27957
c54f017fcd52 doc: prevent literal text block from being treated as non-literal one
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27956
diff changeset
177 the drop to be implicit for missing commits by adding::
27414
6602a7b9deec histedit: delete to drop
Mateusz Kwapich <mitrandir@fb.com>
parents: 27407
diff changeset
178
6602a7b9deec histedit: delete to drop
Mateusz Kwapich <mitrandir@fb.com>
parents: 27407
diff changeset
179 [histedit]
6602a7b9deec histedit: delete to drop
Mateusz Kwapich <mitrandir@fb.com>
parents: 27407
diff changeset
180 dropmissing = True
6602a7b9deec histedit: delete to drop
Mateusz Kwapich <mitrandir@fb.com>
parents: 27407
diff changeset
181
31513
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
182 By default, histedit will close the transaction after each action. For
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
183 performance purposes, you can configure histedit to use a single transaction
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
184 across the entire histedit. WARNING: This setting introduces a significant risk
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
185 of losing the work you've done in a histedit if the histedit aborts
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
186 unexpectedly::
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
187
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
188 [histedit]
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
189 singletransaction = True
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
190
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
191 """
17131
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
192
29126
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
193 from __future__ import absolute_import
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
194
40652
291080871f50 histedit: conditionalize the imports of 'fcntl' and 'termios'
Matt Harbison <matt_harbison@yahoo.com>
parents: 40602
diff changeset
195 # chistedit dependencies that are not available everywhere
291080871f50 histedit: conditionalize the imports of 'fcntl' and 'termios'
Matt Harbison <matt_harbison@yahoo.com>
parents: 40602
diff changeset
196 try:
291080871f50 histedit: conditionalize the imports of 'fcntl' and 'termios'
Matt Harbison <matt_harbison@yahoo.com>
parents: 40602
diff changeset
197 import fcntl
291080871f50 histedit: conditionalize the imports of 'fcntl' and 'termios'
Matt Harbison <matt_harbison@yahoo.com>
parents: 40602
diff changeset
198 import termios
291080871f50 histedit: conditionalize the imports of 'fcntl' and 'termios'
Matt Harbison <matt_harbison@yahoo.com>
parents: 40602
diff changeset
199 except ImportError:
291080871f50 histedit: conditionalize the imports of 'fcntl' and 'termios'
Matt Harbison <matt_harbison@yahoo.com>
parents: 40602
diff changeset
200 fcntl = None
291080871f50 histedit: conditionalize the imports of 'fcntl' and 'termios'
Matt Harbison <matt_harbison@yahoo.com>
parents: 40602
diff changeset
201 termios = None
291080871f50 histedit: conditionalize the imports of 'fcntl' and 'termios'
Matt Harbison <matt_harbison@yahoo.com>
parents: 40602
diff changeset
202
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
203 import functools
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
204 import os
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
205 import struct
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29126
diff changeset
206
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29126
diff changeset
207 from mercurial.i18n import _
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
208 from mercurial.pycompat import (
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
209 getattr,
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
210 open,
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
211 )
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
212 from mercurial.node import (
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
213 bin,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
214 hex,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
215 short,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
216 )
29126
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
217 from mercurial import (
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
218 bundle2,
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
219 cmdutil,
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
220 context,
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
221 copies,
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
222 destutil,
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
223 discovery,
43368
d8215ff082da py3: make chistedit render
Martin von Zweigbergk <martinvonz@google.com>
parents: 43228
diff changeset
224 encoding,
29126
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
225 error,
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
226 exchange,
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
227 extensions,
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
228 hg,
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
229 logcmdutil,
29126
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
230 merge as mergemod,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44661
diff changeset
231 mergestate as mergestatemod,
32057
e5ffc91a2276 histedit: make check for unresolved conflicts explicit (issue5545)
Siddharth Agarwal <sid0@fb.com>
parents: 31638
diff changeset
232 mergeutil,
29126
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
233 obsolete,
34999
c4b769bc86da py3: handle keyword arguments in hgext/histedit.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34917
diff changeset
234 pycompat,
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32327
diff changeset
235 registrar,
29126
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
236 repair,
43933
bde97bee321f histedit: use rewriteutil.precheck() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43793
diff changeset
237 rewriteutil,
29126
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
238 scmutil,
38506
18f348e035fb histedit: add a stateobj variable to histeditstate class
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38505
diff changeset
239 state as statemod,
29126
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
240 util,
7dd5d19c9773 py3: make hgext/hisedit.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28592
diff changeset
241 )
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37016
diff changeset
242 from mercurial.utils import (
41213
704a3aa3dc0a histedit: add rewrite.update-timestamp support to fold and mess
Taapas Agrawal <taapas2897@gmail.com>
parents: 41212
diff changeset
243 dateutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37016
diff changeset
244 stringutil,
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46396
diff changeset
245 urlutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37016
diff changeset
246 )
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
247
29324
b501579147f1 py3: conditionalize cPickle import by adding in util
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29214
diff changeset
248 pickle = util.pickle
17147
80e861511e2b histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 17131
diff changeset
249 cmdtable = {}
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32327
diff changeset
250 command = registrar.command(cmdtable)
17147
80e861511e2b histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 17131
diff changeset
251
34470
6567002ae87e configitems: register the 'histedit.defaultrev' config
Boris Feld <boris.feld@octobus.net>
parents: 34029
diff changeset
252 configtable = {}
6567002ae87e configitems: register the 'histedit.defaultrev' config
Boris Feld <boris.feld@octobus.net>
parents: 34029
diff changeset
253 configitem = registrar.configitem(configtable)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
254 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
255 b'experimental',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
256 b'histedit.autoverb',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
257 default=False,
34474
b068a87e951d configitems: register the 'experimental.histedit.autoverb' config
Boris Feld <boris.feld@octobus.net>
parents: 34473
diff changeset
258 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
259 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
260 b'histedit',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
261 b'defaultrev',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
262 default=None,
34470
6567002ae87e configitems: register the 'histedit.defaultrev' config
Boris Feld <boris.feld@octobus.net>
parents: 34029
diff changeset
263 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
264 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
265 b'histedit',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
266 b'dropmissing',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
267 default=False,
34471
1e37cb4da6f8 configitems: register the 'histedit.dropmissing' config
Boris Feld <boris.feld@octobus.net>
parents: 34470
diff changeset
268 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
269 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
270 b'histedit',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
271 b'linelen',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
272 default=80,
34473
a746472c3d09 configitems: register the 'histedit.singletransaction' config
Boris Feld <boris.feld@octobus.net>
parents: 34472
diff changeset
273 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
274 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
275 b'histedit',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
276 b'singletransaction',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
277 default=False,
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
278 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
279 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
280 b'ui',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
281 b'interface.histedit',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
282 default=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
283 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
284 configitem(b'histedit', b'summary-template', default=b'{rev} {desc|firstline}')
48233
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
285 # TODO: Teach the text-based histedit interface to respect this config option
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
286 # before we make it non-experimental.
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
287 configitem(
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
288 b'histedit', b'later-commits-first', default=False, experimental=True
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
289 )
34470
6567002ae87e configitems: register the 'histedit.defaultrev' config
Boris Feld <boris.feld@octobus.net>
parents: 34029
diff changeset
290
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29820
diff changeset
291 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 25149
diff changeset
292 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 25149
diff changeset
293 # be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 25149
diff changeset
294 # leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
295 testedwith = b'ships-with-hg-core'
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
296
27675
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
297 actiontable = {}
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
298 primaryactions = set()
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
299 secondaryactions = set()
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
300 tertiaryactions = set()
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
301 internalactions = set()
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
302
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
303
28592
cdbd9c0c0775 histedit: add a hint about enabled dropmissing to histedit edit comment
Mateusz Kwapich <mitrandir@fb.com>
parents: 28550
diff changeset
304 def geteditcomment(ui, first, last):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
305 """construct the editor comment
27673
d93d340dc6ee histedit: replace editcomment with a function
timeless <timeless@mozdev.org>
parents: 27630
diff changeset
306 The comment includes::
d93d340dc6ee histedit: replace editcomment with a function
timeless <timeless@mozdev.org>
parents: 27630
diff changeset
307 - an intro
27674
78d86664e3a2 histedit: prefer edit commit, edit message, use commit
timeless <timeless@mozdev.org>
parents: 27673
diff changeset
308 - sorted primary commands
78d86664e3a2 histedit: prefer edit commit, edit message, use commit
timeless <timeless@mozdev.org>
parents: 27673
diff changeset
309 - sorted short commands
27675
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
310 - sorted long commands
28592
cdbd9c0c0775 histedit: add a hint about enabled dropmissing to histedit edit comment
Mateusz Kwapich <mitrandir@fb.com>
parents: 28550
diff changeset
311 - additional hints
27673
d93d340dc6ee histedit: replace editcomment with a function
timeless <timeless@mozdev.org>
parents: 27630
diff changeset
312
d93d340dc6ee histedit: replace editcomment with a function
timeless <timeless@mozdev.org>
parents: 27630
diff changeset
313 Commands are only included once.
d93d340dc6ee histedit: replace editcomment with a function
timeless <timeless@mozdev.org>
parents: 27630
diff changeset
314 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
315 intro = _(
44611
8fca7e8449a8 histedit: add missing b prefix to a string
Kyle Lippincott <spectral@google.com>
parents: 44429
diff changeset
316 b"""Edit history between %s and %s
27673
d93d340dc6ee histedit: replace editcomment with a function
timeless <timeless@mozdev.org>
parents: 27630
diff changeset
317
d93d340dc6ee histedit: replace editcomment with a function
timeless <timeless@mozdev.org>
parents: 27630
diff changeset
318 Commits are listed from least to most recent
d93d340dc6ee histedit: replace editcomment with a function
timeless <timeless@mozdev.org>
parents: 27630
diff changeset
319
28396
5490b04e6132 histedit: adds hint how to reorder changesets at editor (issue3766)
liscju <piotr.listkiewicz@gmail.com>
parents: 28340
diff changeset
320 You can reorder changesets by reordering the lines
5490b04e6132 histedit: adds hint how to reorder changesets at editor (issue3766)
liscju <piotr.listkiewicz@gmail.com>
parents: 28340
diff changeset
321
27675
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
322 Commands:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
323 """
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
324 )
27675
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
325 actions = []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
326
27675
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
327 def addverb(v):
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
328 a = actiontable[v]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
329 lines = a.message.split(b"\n")
27675
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
330 if len(a.verbs):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
331 v = b', '.join(sorted(a.verbs, key=lambda v: len(v)))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
332 actions.append(b" %s = %s" % (v, lines[0]))
43995
801b8d314791 histedit: avoid using a list comprehension to fill a list with fixed values
Matt Harbison <matt_harbison@yahoo.com>
parents: 43933
diff changeset
333 actions.extend([b' %s'] * (len(lines) - 1))
27675
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
334
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
335 for v in (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
336 sorted(primaryactions)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
337 + sorted(secondaryactions)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
338 + sorted(tertiaryactions)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
339 ):
27675
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
340 addverb(v)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
341 actions.append(b'')
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
342
28592
cdbd9c0c0775 histedit: add a hint about enabled dropmissing to histedit edit comment
Mateusz Kwapich <mitrandir@fb.com>
parents: 28550
diff changeset
343 hints = []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
344 if ui.configbool(b'histedit', b'dropmissing'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
345 hints.append(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
346 b"Deleting a changeset from the list "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
347 b"will DISCARD it from the edited history!"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
348 )
28592
cdbd9c0c0775 histedit: add a hint about enabled dropmissing to histedit edit comment
Mateusz Kwapich <mitrandir@fb.com>
parents: 28550
diff changeset
349
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
350 lines = (intro % (first, last)).split(b'\n') + actions + hints
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
351
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
352 return b''.join([b'# %s\n' % l if l else b'#\n' for l in lines])
27673
d93d340dc6ee histedit: replace editcomment with a function
timeless <timeless@mozdev.org>
parents: 27630
diff changeset
353
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
354
22976
886711722db6 histedit: add histedit state class
David Soria Parra <davidsp@fb.com>
parents: 22952
diff changeset
355 class histeditstate(object):
41165
a3a24ad10efb histedit: drop unused constructor arguments (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41151
diff changeset
356 def __init__(self, repo):
22976
886711722db6 histedit: add histedit state class
David Soria Parra <davidsp@fb.com>
parents: 22952
diff changeset
357 self.repo = repo
41165
a3a24ad10efb histedit: drop unused constructor arguments (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41151
diff changeset
358 self.actions = None
a3a24ad10efb histedit: drop unused constructor arguments (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41151
diff changeset
359 self.keep = None
a3a24ad10efb histedit: drop unused constructor arguments (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41151
diff changeset
360 self.topmost = None
a3a24ad10efb histedit: drop unused constructor arguments (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41151
diff changeset
361 self.parentctxnode = None
a3a24ad10efb histedit: drop unused constructor arguments (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41151
diff changeset
362 self.lock = None
a3a24ad10efb histedit: drop unused constructor arguments (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41151
diff changeset
363 self.wlock = None
24757
7b59f16174c5 histedit: store backup file before histedit
Durham Goode <durham@fb.com>
parents: 24756
diff changeset
364 self.backupfile = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
365 self.stateobj = statemod.cmdstate(repo, b'histedit-state')
41165
a3a24ad10efb histedit: drop unused constructor arguments (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41151
diff changeset
366 self.replacements = []
22976
886711722db6 histedit: add histedit state class
David Soria Parra <davidsp@fb.com>
parents: 22952
diff changeset
367
22983
a3a981563ce8 histedit: read state from histeditstate
David Soria Parra <davidsp@fb.com>
parents: 22982
diff changeset
368 def read(self):
22986
7b93b49286d0 histedit: update docstring on histeditstate.read()
Augie Fackler <raf@durin42.com>
parents: 22985
diff changeset
369 """Load histedit state from disk and set fields appropriately."""
38507
03e7ec8180f0 histedit: use self.stateobj to check whether interrupted histedit exists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38506
diff changeset
370 if not self.stateobj.exists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
371 cmdutil.wrongtooltocontinue(self.repo, _(b'histedit'))
22983
a3a981563ce8 histedit: read state from histeditstate
David Soria Parra <davidsp@fb.com>
parents: 22982
diff changeset
372
38507
03e7ec8180f0 histedit: use self.stateobj to check whether interrupted histedit exists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38506
diff changeset
373 data = self._read()
38505
c6a2ce82e60b histedit: factor out logic of processing state data in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38504
diff changeset
374
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
375 self.parentctxnode = data[b'parentctxnode']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
376 actions = parserules(data[b'rules'], self)
38505
c6a2ce82e60b histedit: factor out logic of processing state data in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38504
diff changeset
377 self.actions = actions
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
378 self.keep = data[b'keep']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
379 self.topmost = data[b'topmost']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
380 self.replacements = data[b'replacements']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
381 self.backupfile = data[b'backupfile']
38505
c6a2ce82e60b histedit: factor out logic of processing state data in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38504
diff changeset
382
38507
03e7ec8180f0 histedit: use self.stateobj to check whether interrupted histedit exists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38506
diff changeset
383 def _read(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
384 fp = self.repo.vfs.read(b'histedit-state')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
385 if fp.startswith(b'v1\n'):
27527
dbfaf361c062 histedit: only use pickle if not using the modern save format
Bryan O'Sullivan <bos@serpentine.com>
parents: 27451
diff changeset
386 data = self._load()
dbfaf361c062 histedit: only use pickle if not using the modern save format
Bryan O'Sullivan <bos@serpentine.com>
parents: 27451
diff changeset
387 parentctxnode, rules, keep, topmost, replacements, backupfile = data
dbfaf361c062 histedit: only use pickle if not using the modern save format
Bryan O'Sullivan <bos@serpentine.com>
parents: 27451
diff changeset
388 else:
38505
c6a2ce82e60b histedit: factor out logic of processing state data in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38504
diff changeset
389 data = pickle.loads(fp)
24756
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
390 parentctxnode, rules, keep, topmost, replacements = data
24757
7b59f16174c5 histedit: store backup file before histedit
Durham Goode <durham@fb.com>
parents: 24756
diff changeset
391 backupfile = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
392 rules = b"\n".join([b"%s %s" % (verb, rest) for [verb, rest] in rules])
22983
a3a981563ce8 histedit: read state from histeditstate
David Soria Parra <davidsp@fb.com>
parents: 22982
diff changeset
393
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
394 return {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
395 b'parentctxnode': parentctxnode,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
396 b"rules": rules,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
397 b"keep": keep,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
398 b"topmost": topmost,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
399 b"replacements": replacements,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
400 b"backupfile": backupfile,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
401 }
22983
a3a981563ce8 histedit: read state from histeditstate
David Soria Parra <davidsp@fb.com>
parents: 22982
diff changeset
402
31511
fa8aaff2001a histedit: add transaction support to writing the state file
Durham Goode <durham@fb.com>
parents: 31459
diff changeset
403 def write(self, tr=None):
fa8aaff2001a histedit: add transaction support to writing the state file
Durham Goode <durham@fb.com>
parents: 31459
diff changeset
404 if tr:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
405 tr.addfilegenerator(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
406 b'histedit-state',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
407 (b'histedit-state',),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
408 self._write,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
409 location=b'plain',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
410 )
31511
fa8aaff2001a histedit: add transaction support to writing the state file
Durham Goode <durham@fb.com>
parents: 31459
diff changeset
411 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
412 with self.repo.vfs(b"histedit-state", b"w") as f:
31511
fa8aaff2001a histedit: add transaction support to writing the state file
Durham Goode <durham@fb.com>
parents: 31459
diff changeset
413 self._write(f)
fa8aaff2001a histedit: add transaction support to writing the state file
Durham Goode <durham@fb.com>
parents: 31459
diff changeset
414
fa8aaff2001a histedit: add transaction support to writing the state file
Durham Goode <durham@fb.com>
parents: 31459
diff changeset
415 def _write(self, fp):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
416 fp.write(b'v1\n')
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
417 fp.write(b'%s\n' % hex(self.parentctxnode))
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
418 fp.write(b'%s\n' % hex(self.topmost))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
419 fp.write(b'%s\n' % (b'True' if self.keep else b'False'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
420 fp.write(b'%d\n' % len(self.actions))
27208
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
421 for action in self.actions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
422 fp.write(b'%s\n' % action.tostate())
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
423 fp.write(b'%d\n' % len(self.replacements))
24756
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
424 for replacement in self.replacements:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
425 fp.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
426 b'%s%s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
427 % (
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
428 hex(replacement[0]),
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
429 b''.join(hex(r) for r in replacement[1]),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
430 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
431 )
24958
a920abf5a592 histedit: fix serializing of None backupfile
Durham Goode <durham@fb.com>
parents: 24920
diff changeset
432 backupfile = self.backupfile
a920abf5a592 histedit: fix serializing of None backupfile
Durham Goode <durham@fb.com>
parents: 24920
diff changeset
433 if not backupfile:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
434 backupfile = b''
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
435 fp.write(b'%s\n' % backupfile)
22976
886711722db6 histedit: add histedit state class
David Soria Parra <davidsp@fb.com>
parents: 22952
diff changeset
436
24756
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
437 def _load(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
438 fp = self.repo.vfs(b'histedit-state', b'r')
24756
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
439 lines = [l[:-1] for l in fp.readlines()]
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
440
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
441 index = 0
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
442 lines[index] # version number
24756
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
443 index += 1
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
444
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
445 parentctxnode = bin(lines[index])
24756
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
446 index += 1
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
447
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
448 topmost = bin(lines[index])
24756
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
449 index += 1
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
450
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
451 keep = lines[index] == b'True'
24756
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
452 index += 1
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
453
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
454 # Rules
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
455 rules = []
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
456 rulelen = int(lines[index])
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
457 index += 1
38783
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38738
diff changeset
458 for i in pycompat.xrange(rulelen):
24810
f5416657e661 histedit: change state format to allow non-hash lines
Durham Goode <durham@fb.com>
parents: 24774
diff changeset
459 ruleaction = lines[index]
f5416657e661 histedit: change state format to allow non-hash lines
Durham Goode <durham@fb.com>
parents: 24774
diff changeset
460 index += 1
24756
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
461 rule = lines[index]
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
462 index += 1
24810
f5416657e661 histedit: change state format to allow non-hash lines
Durham Goode <durham@fb.com>
parents: 24774
diff changeset
463 rules.append((ruleaction, rule))
24756
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
464
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
465 # Replacements
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
466 replacements = []
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
467 replacementlen = int(lines[index])
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
468 index += 1
38783
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38738
diff changeset
469 for i in pycompat.xrange(replacementlen):
24756
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
470 replacement = lines[index]
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
471 original = bin(replacement[:40])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
472 succ = [
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
473 bin(replacement[i : i + 40])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
474 for i in range(40, len(replacement), 40)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
475 ]
24756
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
476 replacements.append((original, succ))
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
477 index += 1
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
478
24757
7b59f16174c5 histedit: store backup file before histedit
Durham Goode <durham@fb.com>
parents: 24756
diff changeset
479 backupfile = lines[index]
7b59f16174c5 histedit: store backup file before histedit
Durham Goode <durham@fb.com>
parents: 24756
diff changeset
480 index += 1
7b59f16174c5 histedit: store backup file before histedit
Durham Goode <durham@fb.com>
parents: 24756
diff changeset
481
24756
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
482 fp.close()
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
483
24757
7b59f16174c5 histedit: store backup file before histedit
Durham Goode <durham@fb.com>
parents: 24756
diff changeset
484 return parentctxnode, rules, keep, topmost, replacements, backupfile
24756
d71c2da01d0d histedit: replace pickle with custom serialization
Durham Goode <durham@fb.com>
parents: 24626
diff changeset
485
22978
d4e764521249 histedit: add clear method to remove state
David Soria Parra <davidsp@fb.com>
parents: 22977
diff changeset
486 def clear(self):
26583
49b568a4e539 histedit: check presence of statefile before deleting it
Christian Delahousse <cdelahousse@fb.com>
parents: 26582
diff changeset
487 if self.inprogress():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
488 self.repo.vfs.unlink(b'histedit-state')
22978
d4e764521249 histedit: add clear method to remove state
David Soria Parra <davidsp@fb.com>
parents: 22977
diff changeset
489
26582
42b908673866 histedit: add inprogress method to state class
Christian Delahousse <cdelahousse@fb.com>
parents: 26335
diff changeset
490 def inprogress(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
491 return self.repo.vfs.exists(b'histedit-state')
26582
42b908673866 histedit: add inprogress method to state class
Christian Delahousse <cdelahousse@fb.com>
parents: 26335
diff changeset
492
27200
62b9a87a365e histedit: add actions property to histedit state
Mateusz Kwapich <mitrandir@fb.com>
parents: 27171
diff changeset
493
24765
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
494 class histeditaction(object):
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
495 def __init__(self, state, node):
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
496 self.state = state
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
497 self.repo = state.repo
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
498 self.node = node
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
499
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
500 @classmethod
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
501 def fromrule(cls, state, rule):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
502 """Parses the given rule, returning an instance of the histeditaction."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
503 ruleid = rule.strip().split(b' ', 1)[0]
37106
3d3cff1f6bde histedit: make histedit's commands accept revsets (issue5746)
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 37084
diff changeset
504 # ruleid can be anything from rev numbers, hashes, "bookmarks" etc
3d3cff1f6bde histedit: make histedit's commands accept revsets (issue5746)
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 37084
diff changeset
505 # Check for validation of rule ids and get the rulehash
27547
1cbfeb1dc5aa histedit: handle exceptions from node.bin in fromrule
timeless <timeless@mozdev.org>
parents: 27546
diff changeset
506 try:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
507 rev = bin(ruleid)
36238
f574cc00831a node: make bin() be a wrapper instead of just an alias
Augie Fackler <augie@google.com>
parents: 36175
diff changeset
508 except TypeError:
37106
3d3cff1f6bde histedit: make histedit's commands accept revsets (issue5746)
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 37084
diff changeset
509 try:
3d3cff1f6bde histedit: make histedit's commands accept revsets (issue5746)
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 37084
diff changeset
510 _ctx = scmutil.revsingle(state.repo, ruleid)
3d3cff1f6bde histedit: make histedit's commands accept revsets (issue5746)
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 37084
diff changeset
511 rulehash = _ctx.hex()
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
512 rev = bin(rulehash)
37106
3d3cff1f6bde histedit: make histedit's commands accept revsets (issue5746)
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 37084
diff changeset
513 except error.RepoLookupError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
514 raise error.ParseError(_(b"invalid changeset %s") % ruleid)
27547
1cbfeb1dc5aa histedit: handle exceptions from node.bin in fromrule
timeless <timeless@mozdev.org>
parents: 27546
diff changeset
515 return cls(state, rev)
27202
2226cd4f32ed histedit: add verify() to histeditaction
Mateusz Kwapich <mitrandir@fb.com>
parents: 27201
diff changeset
516
29879
b566c5992e07 histedit: move constraint verification to the 'action.verify' method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29878
diff changeset
517 def verify(self, prev, expected, seen):
47062
f38bf44e077f black: make codebase compatible with black v21.4b2 and v20.8b1
Kyle Lippincott <spectral@google.com>
parents: 46941
diff changeset
518 """Verifies semantic correctness of the rule"""
27202
2226cd4f32ed histedit: add verify() to histeditaction
Mateusz Kwapich <mitrandir@fb.com>
parents: 27201
diff changeset
519 repo = self.repo
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
520 ha = hex(self.node)
37678
5f8f013e7d52 scmutil: rename resolvepartialhexnodeid() to resolvehexnodeidprefix()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37506
diff changeset
521 self.node = scmutil.resolvehexnodeidprefix(repo, ha)
37506
c4131138eadb histedit: look up partial nodeid as partial nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37505
diff changeset
522 if self.node is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
523 raise error.ParseError(_(b'unknown changeset %s listed') % ha[:12])
37505
966061b8826d histedit: drop unnecessary check for "self.node is not None"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37314
diff changeset
524 self._verifynodeconstraints(prev, expected, seen)
29879
b566c5992e07 histedit: move constraint verification to the 'action.verify' method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29878
diff changeset
525
29880
a485ec066867 histedt: use inheritance to override the constraints in 'base'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29879
diff changeset
526 def _verifynodeconstraints(self, prev, expected, seen):
a485ec066867 histedt: use inheritance to override the constraints in 'base'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29879
diff changeset
527 # by default command need a node in the edited list
a485ec066867 histedt: use inheritance to override the constraints in 'base'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29879
diff changeset
528 if self.node not in expected:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
529 raise error.ParseError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
530 _(b'%s "%s" changeset was not a candidate')
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
531 % (self.verb, short(self.node)),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
532 hint=_(b'only use listed changesets'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
533 )
29880
a485ec066867 histedt: use inheritance to override the constraints in 'base'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29879
diff changeset
534 # and only one command per node
a485ec066867 histedt: use inheritance to override the constraints in 'base'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29879
diff changeset
535 if self.node in seen:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
536 raise error.ParseError(
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
537 _(b'duplicated command for changeset %s') % short(self.node)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
538 )
24765
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
539
29466
a0efbfbba7b5 histedit: remove unneeded initial parameter
Sean Farley <sean@farley.io>
parents: 29465
diff changeset
540 def torule(self):
27203
b6a0f0895a25 histedit: add torule method to histedit action objects
Mateusz Kwapich <mitrandir@fb.com>
parents: 27202
diff changeset
541 """build a histedit rule line for an action
b6a0f0895a25 histedit: add torule method to histedit action objects
Mateusz Kwapich <mitrandir@fb.com>
parents: 27202
diff changeset
542
b6a0f0895a25 histedit: add torule method to histedit action objects
Mateusz Kwapich <mitrandir@fb.com>
parents: 27202
diff changeset
543 by default lines are in the form:
b6a0f0895a25 histedit: add torule method to histedit action objects
Mateusz Kwapich <mitrandir@fb.com>
parents: 27202
diff changeset
544 <hash> <rev> <summary>
b6a0f0895a25 histedit: add torule method to histedit action objects
Mateusz Kwapich <mitrandir@fb.com>
parents: 27202
diff changeset
545 """
b6a0f0895a25 histedit: add torule method to histedit action objects
Mateusz Kwapich <mitrandir@fb.com>
parents: 27202
diff changeset
546 ctx = self.repo[self.node]
41509
11c076786d56 histedit: add templating support to histedit's rule file generation
Augie Fackler <augie@google.com>
parents: 41399
diff changeset
547 ui = self.repo.ui
45858
62983988bbf5 histedit: disable color while rendering template for use in plan
Martin von Zweigbergk <martinvonz@google.com>
parents: 45857
diff changeset
548 # We don't want color codes in the commit message template, so
62983988bbf5 histedit: disable color while rendering template for use in plan
Martin von Zweigbergk <martinvonz@google.com>
parents: 45857
diff changeset
549 # disable the label() template function while we render it.
62983988bbf5 histedit: disable color while rendering template for use in plan
Martin von Zweigbergk <martinvonz@google.com>
parents: 45857
diff changeset
550 with ui.configoverride(
62983988bbf5 histedit: disable color while rendering template for use in plan
Martin von Zweigbergk <martinvonz@google.com>
parents: 45857
diff changeset
551 {(b'templatealias', b'label(l,x)'): b"x"}, b'histedit'
62983988bbf5 histedit: disable color while rendering template for use in plan
Martin von Zweigbergk <martinvonz@google.com>
parents: 45857
diff changeset
552 ):
45857
ec6ba70be853 tests: show how `hg histedit` can put color codes in histedit plan
Martin von Zweigbergk <martinvonz@google.com>
parents: 45791
diff changeset
553 summary = cmdutil.rendertemplate(
ec6ba70be853 tests: show how `hg histedit` can put color codes in histedit plan
Martin von Zweigbergk <martinvonz@google.com>
parents: 45791
diff changeset
554 ctx, ui.config(b'histedit', b'summary-template')
ec6ba70be853 tests: show how `hg histedit` can put color codes in histedit plan
Martin von Zweigbergk <martinvonz@google.com>
parents: 45791
diff changeset
555 )
45893
f4065c3f09b8 histedit: don't crash if commit message is empty
Martin von Zweigbergk <martinvonz@google.com>
parents: 45858
diff changeset
556 # Handle the fact that `''.splitlines() => []`
f4065c3f09b8 histedit: don't crash if commit message is empty
Martin von Zweigbergk <martinvonz@google.com>
parents: 45858
diff changeset
557 summary = summary.splitlines()[0] if summary else b''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
558 line = b'%s %s %s' % (self.verb, ctx, summary)
27203
b6a0f0895a25 histedit: add torule method to histedit action objects
Mateusz Kwapich <mitrandir@fb.com>
parents: 27202
diff changeset
559 # trim to 75 columns by default so it's not stupidly wide in my editor
b6a0f0895a25 histedit: add torule method to histedit action objects
Mateusz Kwapich <mitrandir@fb.com>
parents: 27202
diff changeset
560 # (the 5 more are left for verb)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
561 maxlen = self.repo.ui.configint(b'histedit', b'linelen')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
562 maxlen = max(maxlen, 22) # avoid truncating hash
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37016
diff changeset
563 return stringutil.ellipsis(line, maxlen)
27203
b6a0f0895a25 histedit: add torule method to histedit action objects
Mateusz Kwapich <mitrandir@fb.com>
parents: 27202
diff changeset
564
27206
7a523b6d5265 histedit: add tostate method to histedit action
Mateusz Kwapich <mitrandir@fb.com>
parents: 27205
diff changeset
565 def tostate(self):
7a523b6d5265 histedit: add tostate method to histedit action
Mateusz Kwapich <mitrandir@fb.com>
parents: 27205
diff changeset
566 """Print an action in format used by histedit state files
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45893
diff changeset
567 (the first line is a verb, the remainder is the second)
27206
7a523b6d5265 histedit: add tostate method to histedit action
Mateusz Kwapich <mitrandir@fb.com>
parents: 27205
diff changeset
568 """
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
569 return b"%s\n%s" % (self.verb, hex(self.node))
27206
7a523b6d5265 histedit: add tostate method to histedit action
Mateusz Kwapich <mitrandir@fb.com>
parents: 27205
diff changeset
570
24765
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
571 def run(self):
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
572 """Runs the action. The default behavior is simply apply the action's
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
573 rulectx onto the current parentctx."""
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
574 self.applychange()
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
575 self.continuedirty()
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
576 return self.continueclean()
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
577
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
578 def applychange(self):
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
579 """Applies the changes from this action's rulectx onto the current
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
580 parentctx, but does not commit them."""
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
581 repo = self.repo
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
582 rulectx = repo[self.node]
47437
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 47435
diff changeset
583 with repo.ui.silent():
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 47435
diff changeset
584 hg.update(repo, self.state.parentctxnode, quietempty=True)
24765
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
585 stats = applychanges(repo.ui, repo, rulectx, {})
35390
7b73bf1a48d4 histedit: preserve active branch while histediting
Boris Feld <boris.feld@octobus.net>
parents: 34917
diff changeset
586 repo.dirstate.setbranch(rulectx.branch())
37125
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37108
diff changeset
587 if stats.unresolvedcount:
27629
e7ff83b2bcfe histedit: list action when intervention is required
timeless <timeless@mozdev.org>
parents: 27627
diff changeset
588 raise error.InterventionRequired(
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
589 _(b'Fix up the change (%s %s)') % (self.verb, short(self.node)),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
590 hint=_(b'hg histedit --continue to resume'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
591 )
24765
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
592
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
593 def continuedirty(self):
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
594 """Continues the action when changes have been applied to the working
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
595 copy. The default behavior is to commit the dirty changes."""
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
596 repo = self.repo
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
597 rulectx = repo[self.node]
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
598
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
599 editor = self.commiteditor()
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
600 commit = commitfuncfor(repo, rulectx)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
601 if repo.ui.configbool(b'rewrite', b'update-timestamp'):
41213
704a3aa3dc0a histedit: add rewrite.update-timestamp support to fold and mess
Taapas Agrawal <taapas2897@gmail.com>
parents: 41212
diff changeset
602 date = dateutil.makedate()
704a3aa3dc0a histedit: add rewrite.update-timestamp support to fold and mess
Taapas Agrawal <taapas2897@gmail.com>
parents: 41212
diff changeset
603 else:
704a3aa3dc0a histedit: add rewrite.update-timestamp support to fold and mess
Taapas Agrawal <taapas2897@gmail.com>
parents: 41212
diff changeset
604 date = rulectx.date()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
605 commit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
606 text=rulectx.description(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
607 user=rulectx.user(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
608 date=date,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
609 extra=rulectx.extra(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
610 editor=editor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
611 )
24765
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
612
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
613 def commiteditor(self):
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
614 """The editor to be used to edit the commit message."""
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
615 return False
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
616
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
617 def continueclean(self):
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
618 """Continues the action when the working copy is clean. The default
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
619 behavior is to accept the current commit as the new version of the
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
620 rulectx."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
621 ctx = self.repo[b'.']
24765
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
622 if ctx.node() == self.state.parentctxnode:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
623 self.repo.ui.warn(
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
624 _(b'%s: skipping changeset (no changes)\n') % short(self.node)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
625 )
24765
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
626 return ctx, [(self.node, tuple())]
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
627 if ctx.node() == self.node:
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
628 # Nothing changed
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
629 return ctx, []
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
630 return ctx, [(self.node, (ctx.node(),))]
bdf84cc2115b histedit: add a new histeditaction class
Durham Goode <durham@fb.com>
parents: 24764
diff changeset
631
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
632
18436
b38c10502af9 histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18370
diff changeset
633 def commitfuncfor(repo, src):
b38c10502af9 histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18370
diff changeset
634 """Build a commit function for the replacement of <src>
b38c10502af9 histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18370
diff changeset
635
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18609
diff changeset
636 This function ensure we apply the same treatment to all changesets.
18436
b38c10502af9 histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18370
diff changeset
637
18437
358c23e8f1c6 histedit: record histedit source (issue3681)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18436
diff changeset
638 - Add a 'histedit_source' entry in extra.
18436
b38c10502af9 histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18370
diff changeset
639
25450
7e36c3000ead histedit: copyedit docstring wording problem I noticed while here
Augie Fackler <augie@google.com>
parents: 25412
diff changeset
640 Note that fold has its own separated logic because its handling is a bit
18436
b38c10502af9 histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18370
diff changeset
641 different and not easily factored out of the fold method.
b38c10502af9 histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18370
diff changeset
642 """
18440
35513c59f376 histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18437
diff changeset
643 phasemin = src.phase()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
644
18436
b38c10502af9 histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18370
diff changeset
645 def commitfunc(**kwargs):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
646 overrides = {(b'phases', b'new-commit'): phasemin}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
647 with repo.ui.configoverride(overrides, b'histedit'):
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43376
diff changeset
648 extra = kwargs.get('extra', {}).copy()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
649 extra[b'histedit_source'] = src.hex()
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43376
diff changeset
650 kwargs['extra'] = extra
18440
35513c59f376 histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18437
diff changeset
651 return repo.commit(**kwargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
652
18436
b38c10502af9 histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18370
diff changeset
653 return commitfunc
b38c10502af9 histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18370
diff changeset
654
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
655
17647
d34ba4991188 histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17645
diff changeset
656 def applychanges(ui, repo, ctx, opts):
d34ba4991188 histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17645
diff changeset
657 """Merge changeset from ctx (only) in the current working directory"""
45375
8c466bcb0879 revert: remove dangerous `parents` argument from `cmdutil.revert()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 45019
diff changeset
658 if ctx.p1().node() == repo.dirstate.p1():
26171
49c1424424de histedit: fix English (en-US)
timeless@mozdev.org
parents: 26100
diff changeset
659 # edits are "in place" we do not need to make any merge,
27603
8a87627d263a histedit: fix comment in applychanges
timeless <timeless@mozdev.org>
parents: 27600
diff changeset
660 # just applies changes on parent for editing
47437
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 47435
diff changeset
661 with ui.silent():
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 47435
diff changeset
662 cmdutil.revert(ui, repo, ctx, all=True)
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 47435
diff changeset
663 stats = mergemod.updateresult(0, 0, 0, 0)
17647
d34ba4991188 histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17645
diff changeset
664 else:
d34ba4991188 histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17645
diff changeset
665 try:
d34ba4991188 histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17645
diff changeset
666 # ui.forcemerge is an internal variable, do not document
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
667 repo.ui.setconfig(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
668 b'ui', b'forcemerge', opts.get(b'tool', b''), b'histedit'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
669 )
48591
f1162b125991 histedit: attempt to make merge labels more helpful
Martin von Zweigbergk <martinvonz@google.com>
parents: 48371
diff changeset
670 stats = mergemod.graft(
f1162b125991 histedit: attempt to make merge labels more helpful
Martin von Zweigbergk <martinvonz@google.com>
parents: 48371
diff changeset
671 repo,
f1162b125991 histedit: attempt to make merge labels more helpful
Martin von Zweigbergk <martinvonz@google.com>
parents: 48371
diff changeset
672 ctx,
f1162b125991 histedit: attempt to make merge labels more helpful
Martin von Zweigbergk <martinvonz@google.com>
parents: 48371
diff changeset
673 labels=[
f1162b125991 histedit: attempt to make merge labels more helpful
Martin von Zweigbergk <martinvonz@google.com>
parents: 48371
diff changeset
674 b'already edited',
f1162b125991 histedit: attempt to make merge labels more helpful
Martin von Zweigbergk <martinvonz@google.com>
parents: 48371
diff changeset
675 b'current change',
f1162b125991 histedit: attempt to make merge labels more helpful
Martin von Zweigbergk <martinvonz@google.com>
parents: 48371
diff changeset
676 b'parent of current change',
f1162b125991 histedit: attempt to make merge labels more helpful
Martin von Zweigbergk <martinvonz@google.com>
parents: 48371
diff changeset
677 ],
f1162b125991 histedit: attempt to make merge labels more helpful
Martin von Zweigbergk <martinvonz@google.com>
parents: 48371
diff changeset
678 )
17647
d34ba4991188 histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17645
diff changeset
679 finally:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
680 repo.ui.setconfig(b'ui', b'forcemerge', b'', b'histedit')
17647
d34ba4991188 histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17645
diff changeset
681 return stats
17407
31c123a2f273 histedit: factored out diff/patch logic
Leah Xue <leahxue@fb.com>
parents: 17340
diff changeset
682
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
683
36403
10de411d7207 histedit: rename variables so they have "ctx" in them
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36238
diff changeset
684 def collapse(repo, firstctx, lastctx, commitopts, skipprompt=False):
17644
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
685 """collapse the set of revisions from first to last as new one.
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
686
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
687 Expected commit options are:
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
688 - message
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
689 - date
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
690 - username
17738
b8424c92ba2b spelling: fix minor spell checker issues
Mads Kiilerich <mads@kiilerich.com>
parents: 17666
diff changeset
691 Commit message is edited in all cases.
17644
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
692
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
693 This function works in memory."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
694 ctxs = list(repo.set(b'%d::%d', firstctx.rev(), lastctx.rev()))
17644
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
695 if not ctxs:
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
696 return None
25452
43906060a3f4 histedit: abort rather than edit a public changeset (issue4704)
Augie Fackler <augie@google.com>
parents: 25450
diff changeset
697 for c in ctxs:
43906060a3f4 histedit: abort rather than edit a public changeset (issue4704)
Augie Fackler <augie@google.com>
parents: 25450
diff changeset
698 if not c.mutable():
27545
a67d2e059a51 histedit: use parse-error exception for parsing
timeless <timeless@mozdev.org>
parents: 27543
diff changeset
699 raise error.ParseError(
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
700 _(b"cannot fold into public change %s") % short(c.node())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
701 )
41397
0bd56c291359 cleanup: use p1() and p2() instead of parents()[0] and parents()[1]
Martin von Zweigbergk <martinvonz@google.com>
parents: 41223
diff changeset
702 base = firstctx.p1()
17644
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
703
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
704 # commit a new version of the old changeset, including the update
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
705 # collect all files which might be affected
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
706 files = set()
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
707 for ctx in ctxs:
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
708 files.update(ctx.files())
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
709
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
710 # Recompute copies (avoid recording a -> b -> a)
36403
10de411d7207 histedit: rename variables so they have "ctx" in them
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36238
diff changeset
711 copied = copies.pathcopies(base, lastctx)
17644
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
712
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
713 # prune files which were reverted by the updates
36403
10de411d7207 histedit: rename variables so they have "ctx" in them
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36238
diff changeset
714 files = [f for f in files if not cmdutil.samefile(f, lastctx, base)]
17644
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
715 # commit version of these files as defined by head
36403
10de411d7207 histedit: rename variables so they have "ctx" in them
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36238
diff changeset
716 headmf = lastctx.manifest()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
717
17644
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
718 def filectxfn(repo, ctx, path):
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
719 if path in headmf:
36403
10de411d7207 histedit: rename variables so they have "ctx" in them
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36238
diff changeset
720 fctx = lastctx[path]
17644
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
721 flags = fctx.flags()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
722 mctx = context.memfilectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
723 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
724 ctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
725 fctx.path(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
726 fctx.data(),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
727 islink=b'l' in flags,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
728 isexec=b'x' in flags,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
729 copysource=copied.get(path),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
730 )
17644
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
731 return mctx
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22280
diff changeset
732 return None
17644
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
733
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
734 if commitopts.get(b'message'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
735 message = commitopts[b'message']
17644
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
736 else:
36403
10de411d7207 histedit: rename variables so they have "ctx" in them
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36238
diff changeset
737 message = firstctx.description()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
738 user = commitopts.get(b'user')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
739 date = commitopts.get(b'date')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
740 extra = commitopts.get(b'extra')
17644
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
741
36403
10de411d7207 histedit: rename variables so they have "ctx" in them
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36238
diff changeset
742 parents = (firstctx.p1().node(), firstctx.p2().node())
22152
d2a5986cb89d histedit: add "roll" command to fold commit data and drop message (issue4256)
Mike Edgar <adgar@google.com>
parents: 22059
diff changeset
743 editor = None
24828
5045a003260b histedit: fix rollup prompting for a commit message (issue4606)
Durham Goode <durham@fb.com>
parents: 24810
diff changeset
744 if not skipprompt:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
745 editor = cmdutil.getcommiteditor(edit=True, editform=b'histedit.fold')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
746 new = context.memctx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
747 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
748 parents=parents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
749 text=message,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
750 files=files,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
751 filectxfn=filectxfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
752 user=user,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
753 date=date,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
754 extra=extra,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
755 editor=editor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
756 )
17644
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
757 return repo.commitctx(new)
9ae073f10572 histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17643
diff changeset
758
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
759
26981
cda2e980281e histedit: extracts _isdirtywc function
liscju <piotr.listkiewicz@gmail.com>
parents: 26798
diff changeset
760 def _isdirtywc(repo):
cda2e980281e histedit: extracts _isdirtywc function
liscju <piotr.listkiewicz@gmail.com>
parents: 26798
diff changeset
761 return repo[None].dirty(missing=True)
cda2e980281e histedit: extracts _isdirtywc function
liscju <piotr.listkiewicz@gmail.com>
parents: 26798
diff changeset
762
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
763
27084
383f10b67fd6 histedit: add abortdirty function
Mateusz Kwapich <mitrandir@fb.com>
parents: 27083
diff changeset
764 def abortdirty():
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
765 raise error.StateError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
766 _(b'working copy has pending changes'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
767 hint=_(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
768 b'amend, commit, or revert them and run histedit '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
769 b'--continue, or abort with histedit --abort'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
770 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
771 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
772
27084
383f10b67fd6 histedit: add abortdirty function
Mateusz Kwapich <mitrandir@fb.com>
parents: 27083
diff changeset
773
27675
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
774 def action(verbs, message, priority=False, internal=False):
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
775 def wrap(cls):
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
776 assert not priority or not internal
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
777 verb = verbs[0]
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
778 if priority:
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
779 primaryactions.add(verb)
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
780 elif internal:
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
781 internalactions.add(verb)
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
782 elif len(verbs) > 1:
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
783 secondaryactions.add(verb)
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
784 else:
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
785 tertiaryactions.add(verb)
27201
dcb536d2e138 histedit: add addhisteditaction decorator
Mateusz Kwapich <mitrandir@fb.com>
parents: 27200
diff changeset
786
27675
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
787 cls.verb = verb
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
788 cls.verbs = verbs
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
789 cls.message = message
27201
dcb536d2e138 histedit: add addhisteditaction decorator
Mateusz Kwapich <mitrandir@fb.com>
parents: 27200
diff changeset
790 for verb in verbs:
dcb536d2e138 histedit: add addhisteditaction decorator
Mateusz Kwapich <mitrandir@fb.com>
parents: 27200
diff changeset
791 actiontable[verb] = cls
dcb536d2e138 histedit: add addhisteditaction decorator
Mateusz Kwapich <mitrandir@fb.com>
parents: 27200
diff changeset
792 return cls
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
793
27201
dcb536d2e138 histedit: add addhisteditaction decorator
Mateusz Kwapich <mitrandir@fb.com>
parents: 27200
diff changeset
794 return wrap
dcb536d2e138 histedit: add addhisteditaction decorator
Mateusz Kwapich <mitrandir@fb.com>
parents: 27200
diff changeset
795
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
796
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
797 @action([b'pick', b'p'], _(b'use commit'), priority=True)
24767
477e76936b1d histedit: convert pick action into a class
Durham Goode <durham@fb.com>
parents: 24766
diff changeset
798 class pick(histeditaction):
477e76936b1d histedit: convert pick action into a class
Durham Goode <durham@fb.com>
parents: 24766
diff changeset
799 def run(self):
477e76936b1d histedit: convert pick action into a class
Durham Goode <durham@fb.com>
parents: 24766
diff changeset
800 rulectx = self.repo[self.node]
41397
0bd56c291359 cleanup: use p1() and p2() instead of parents()[0] and parents()[1]
Martin von Zweigbergk <martinvonz@google.com>
parents: 41223
diff changeset
801 if rulectx.p1().node() == self.state.parentctxnode:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
802 self.repo.ui.debug(b'node %s unchanged\n' % short(self.node))
24767
477e76936b1d histedit: convert pick action into a class
Durham Goode <durham@fb.com>
parents: 24766
diff changeset
803 return rulectx, []
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
804
24767
477e76936b1d histedit: convert pick action into a class
Durham Goode <durham@fb.com>
parents: 24766
diff changeset
805 return super(pick, self).run()
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
806
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
807
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
808 @action(
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
809 [b'edit', b'e'],
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
810 _(b'use commit, but allow edits before making new commit'),
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
811 priority=True,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
812 )
24770
facdb20e60e9 histedit: convert edit action into a class
Durham Goode <durham@fb.com>
parents: 24769
diff changeset
813 class edit(histeditaction):
facdb20e60e9 histedit: convert edit action into a class
Durham Goode <durham@fb.com>
parents: 24769
diff changeset
814 def run(self):
facdb20e60e9 histedit: convert edit action into a class
Durham Goode <durham@fb.com>
parents: 24769
diff changeset
815 repo = self.repo
facdb20e60e9 histedit: convert edit action into a class
Durham Goode <durham@fb.com>
parents: 24769
diff changeset
816 rulectx = repo[self.node]
27407
bf4d5d8dc2aa histedit: omit useless message from update (edit)
timeless <timeless@mozdev.org>
parents: 27406
diff changeset
817 hg.update(repo, self.state.parentctxnode, quietempty=True)
24770
facdb20e60e9 histedit: convert edit action into a class
Durham Goode <durham@fb.com>
parents: 24769
diff changeset
818 applychanges(repo.ui, repo, rulectx, {})
46103
3f82a915ab2a histedit: tweak `edit` message to try and guide users to our workflow
Augie Fackler <augie@google.com>
parents: 45942
diff changeset
819 hint = _(b'to edit %s, `hg histedit --continue` after making changes')
24770
facdb20e60e9 histedit: convert edit action into a class
Durham Goode <durham@fb.com>
parents: 24769
diff changeset
820 raise error.InterventionRequired(
46103
3f82a915ab2a histedit: tweak `edit` message to try and guide users to our workflow
Augie Fackler <augie@google.com>
parents: 45942
diff changeset
821 _(b'Editing (%s), commit as needed now to split the change')
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
822 % short(self.node),
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
823 hint=hint % short(self.node),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
824 )
24770
facdb20e60e9 histedit: convert edit action into a class
Durham Goode <durham@fb.com>
parents: 24769
diff changeset
825
facdb20e60e9 histedit: convert edit action into a class
Durham Goode <durham@fb.com>
parents: 24769
diff changeset
826 def commiteditor(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
827 return cmdutil.getcommiteditor(edit=True, editform=b'histedit.edit')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
828
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
829
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
830 @action([b'fold', b'f'], _(b'use commit, but combine it with the one above'))
24771
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
831 class fold(histeditaction):
29879
b566c5992e07 histedit: move constraint verification to the 'action.verify' method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29878
diff changeset
832 def verify(self, prev, expected, seen):
47062
f38bf44e077f black: make codebase compatible with black v21.4b2 and v20.8b1
Kyle Lippincott <spectral@google.com>
parents: 46941
diff changeset
833 """Verifies semantic correctness of the fold rule"""
29879
b566c5992e07 histedit: move constraint verification to the 'action.verify' method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29878
diff changeset
834 super(fold, self).verify(prev, expected, seen)
27542
bf0900d3819c histedit: check fold of public change during verify
timeless <timeless@mozdev.org>
parents: 27541
diff changeset
835 repo = self.repo
bf0900d3819c histedit: check fold of public change during verify
timeless <timeless@mozdev.org>
parents: 27541
diff changeset
836 if not prev:
41397
0bd56c291359 cleanup: use p1() and p2() instead of parents()[0] and parents()[1]
Martin von Zweigbergk <martinvonz@google.com>
parents: 41223
diff changeset
837 c = repo[self.node].p1()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
838 elif not prev.verb in (b'pick', b'base'):
27542
bf0900d3819c histedit: check fold of public change during verify
timeless <timeless@mozdev.org>
parents: 27541
diff changeset
839 return
bf0900d3819c histedit: check fold of public change during verify
timeless <timeless@mozdev.org>
parents: 27541
diff changeset
840 else:
bf0900d3819c histedit: check fold of public change during verify
timeless <timeless@mozdev.org>
parents: 27541
diff changeset
841 c = repo[prev.node]
bf0900d3819c histedit: check fold of public change during verify
timeless <timeless@mozdev.org>
parents: 27541
diff changeset
842 if not c.mutable():
27545
a67d2e059a51 histedit: use parse-error exception for parsing
timeless <timeless@mozdev.org>
parents: 27543
diff changeset
843 raise error.ParseError(
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
844 _(b"cannot fold into public change %s") % short(c.node())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
845 )
27542
bf0900d3819c histedit: check fold of public change during verify
timeless <timeless@mozdev.org>
parents: 27541
diff changeset
846
24771
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
847 def continuedirty(self):
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
848 repo = self.repo
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
849 rulectx = repo[self.node]
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
850
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
851 commit = commitfuncfor(repo, rulectx)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
852 commit(
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
853 text=b'fold-temp-revision %s' % short(self.node),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
854 user=rulectx.user(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
855 date=rulectx.date(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
856 extra=rulectx.extra(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
857 )
24771
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
858
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
859 def continueclean(self):
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
860 repo = self.repo
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
861 ctx = repo[b'.']
24771
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
862 rulectx = repo[self.node]
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
863 parentctxnode = self.state.parentctxnode
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
864 if ctx.node() == parentctxnode:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
865 repo.ui.warn(_(b'%s: empty changeset\n') % short(self.node))
24771
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
866 return ctx, [(self.node, (parentctxnode,))]
22152
d2a5986cb89d histedit: add "roll" command to fold commit data and drop message (issue4256)
Mike Edgar <adgar@google.com>
parents: 22059
diff changeset
867
24771
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
868 parentctx = repo[parentctxnode]
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44441
diff changeset
869 newcommits = {
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
870 c.node()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
871 for c in repo.set(b'(%d::. - %d)', parentctx.rev(), parentctx.rev())
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44441
diff changeset
872 }
24771
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
873 if not newcommits:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
874 repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
875 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
876 b'%s: cannot fold - working copy is not a '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
877 b'descendant of previous commit %s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
878 )
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
879 % (short(self.node), short(parentctxnode))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
880 )
24771
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
881 return ctx, [(self.node, (ctx.node(),))]
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
882
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
883 middlecommits = newcommits.copy()
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
884 middlecommits.discard(ctx.node())
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
885
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
886 return self.finishfold(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
887 repo.ui, repo, parentctx, rulectx, ctx.node(), middlecommits
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
888 )
24771
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
889
24773
090da03361c5 histedit: improve roll action integration with fold
Durham Goode <durham@fb.com>
parents: 24772
diff changeset
890 def skipprompt(self):
26246
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
891 """Returns true if the rule should skip the message editor.
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
892
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
893 For example, 'fold' wants to show an editor, but 'rollup'
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
894 doesn't want to.
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
895 """
24773
090da03361c5 histedit: improve roll action integration with fold
Durham Goode <durham@fb.com>
parents: 24772
diff changeset
896 return False
24772
8f6494eb16eb histedit: move finishfold into fold class
Durham Goode <durham@fb.com>
parents: 24771
diff changeset
897
26246
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
898 def mergedescs(self):
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
899 """Returns true if the rule should merge messages of multiple changes.
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
900
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
901 This exists mainly so that 'rollup' rules can be a subclass of
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
902 'fold'.
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
903 """
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
904 return True
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
905
31056
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
906 def firstdate(self):
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
907 """Returns true if the rule should preserve the date of the first
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
908 change.
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
909
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
910 This exists mainly so that 'rollup' rules can be a subclass of
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
911 'fold'.
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
912 """
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
913 return False
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
914
24773
090da03361c5 histedit: improve roll action integration with fold
Durham Goode <durham@fb.com>
parents: 24772
diff changeset
915 def finishfold(self, ui, repo, ctx, oldctx, newnode, internalchanges):
45577
5c8230ca37f2 merge: replace calls to hg.updaterepo() by merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45450
diff changeset
916 mergemod.update(ctx.p1())
24772
8f6494eb16eb histedit: move finishfold into fold class
Durham Goode <durham@fb.com>
parents: 24771
diff changeset
917 ### prepare new commit data
24773
090da03361c5 histedit: improve roll action integration with fold
Durham Goode <durham@fb.com>
parents: 24772
diff changeset
918 commitopts = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
919 commitopts[b'user'] = ctx.user()
24772
8f6494eb16eb histedit: move finishfold into fold class
Durham Goode <durham@fb.com>
parents: 24771
diff changeset
920 # commit message
26246
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
921 if not self.mergedescs():
24772
8f6494eb16eb histedit: move finishfold into fold class
Durham Goode <durham@fb.com>
parents: 24771
diff changeset
922 newmessage = ctx.description()
8f6494eb16eb histedit: move finishfold into fold class
Durham Goode <durham@fb.com>
parents: 24771
diff changeset
923 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
924 newmessage = (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
925 b'\n***\n'.join(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
926 [ctx.description()]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
927 + [repo[r].description() for r in internalchanges]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
928 + [oldctx.description()]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
929 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
930 + b'\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
931 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
932 commitopts[b'message'] = newmessage
24772
8f6494eb16eb histedit: move finishfold into fold class
Durham Goode <durham@fb.com>
parents: 24771
diff changeset
933 # date
31056
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
934 if self.firstdate():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
935 commitopts[b'date'] = ctx.date()
31056
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
936 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
937 commitopts[b'date'] = max(ctx.date(), oldctx.date())
41213
704a3aa3dc0a histedit: add rewrite.update-timestamp support to fold and mess
Taapas Agrawal <taapas2897@gmail.com>
parents: 41212
diff changeset
938 # if date is to be updated to current
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
939 if ui.configbool(b'rewrite', b'update-timestamp'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
940 commitopts[b'date'] = dateutil.makedate()
41213
704a3aa3dc0a histedit: add rewrite.update-timestamp support to fold and mess
Taapas Agrawal <taapas2897@gmail.com>
parents: 41212
diff changeset
941
24772
8f6494eb16eb histedit: move finishfold into fold class
Durham Goode <durham@fb.com>
parents: 24771
diff changeset
942 extra = ctx.extra().copy()
8f6494eb16eb histedit: move finishfold into fold class
Durham Goode <durham@fb.com>
parents: 24771
diff changeset
943 # histedit_source
8f6494eb16eb histedit: move finishfold into fold class
Durham Goode <durham@fb.com>
parents: 24771
diff changeset
944 # note: ctx is likely a temporary commit but that the best we can do
8f6494eb16eb histedit: move finishfold into fold class
Durham Goode <durham@fb.com>
parents: 24771
diff changeset
945 # here. This is sufficient to solve issue3681 anyway.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
946 extra[b'histedit_source'] = b'%s,%s' % (ctx.hex(), oldctx.hex())
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
947 commitopts[b'extra'] = extra
31459
f84fbd27b6d3 histedit: get rid of ui.backupconfig
Jun Wu <quark@fb.com>
parents: 31329
diff changeset
948 phasemin = max(ctx.phase(), oldctx.phase())
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
949 overrides = {(b'phases', b'new-commit'): phasemin}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
950 with repo.ui.configoverride(overrides, b'histedit'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
951 n = collapse(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
952 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
953 ctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
954 repo[newnode],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
955 commitopts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
956 skipprompt=self.skipprompt(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
957 )
24772
8f6494eb16eb histedit: move finishfold into fold class
Durham Goode <durham@fb.com>
parents: 24771
diff changeset
958 if n is None:
8f6494eb16eb histedit: move finishfold into fold class
Durham Goode <durham@fb.com>
parents: 24771
diff changeset
959 return ctx, []
45577
5c8230ca37f2 merge: replace calls to hg.updaterepo() by merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45450
diff changeset
960 mergemod.update(repo[n])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
961 replacements = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
962 (oldctx.node(), (newnode,)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
963 (ctx.node(), (n,)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
964 (newnode, (n,)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
965 ]
24772
8f6494eb16eb histedit: move finishfold into fold class
Durham Goode <durham@fb.com>
parents: 24771
diff changeset
966 for ich in internalchanges:
8f6494eb16eb histedit: move finishfold into fold class
Durham Goode <durham@fb.com>
parents: 24771
diff changeset
967 replacements.append((ich, (n,)))
8f6494eb16eb histedit: move finishfold into fold class
Durham Goode <durham@fb.com>
parents: 24771
diff changeset
968 return repo[n], replacements
24771
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
969
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
970
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
971 @action(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
972 [b'base', b'b'],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
973 _(b'checkout changeset and apply further changesets from there'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
974 )
27085
d50ff8f4891f histedit: add an experimental base action
Mateusz Kwapich <mitrandir@fb.com>
parents: 27084
diff changeset
975 class base(histeditaction):
d50ff8f4891f histedit: add an experimental base action
Mateusz Kwapich <mitrandir@fb.com>
parents: 27084
diff changeset
976 def run(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
977 if self.repo[b'.'].node() != self.node:
44270
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
978 mergemod.clean_update(self.repo[self.node])
27085
d50ff8f4891f histedit: add an experimental base action
Mateusz Kwapich <mitrandir@fb.com>
parents: 27084
diff changeset
979 return self.continueclean()
d50ff8f4891f histedit: add an experimental base action
Mateusz Kwapich <mitrandir@fb.com>
parents: 27084
diff changeset
980
d50ff8f4891f histedit: add an experimental base action
Mateusz Kwapich <mitrandir@fb.com>
parents: 27084
diff changeset
981 def continuedirty(self):
d50ff8f4891f histedit: add an experimental base action
Mateusz Kwapich <mitrandir@fb.com>
parents: 27084
diff changeset
982 abortdirty()
d50ff8f4891f histedit: add an experimental base action
Mateusz Kwapich <mitrandir@fb.com>
parents: 27084
diff changeset
983
d50ff8f4891f histedit: add an experimental base action
Mateusz Kwapich <mitrandir@fb.com>
parents: 27084
diff changeset
984 def continueclean(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
985 basectx = self.repo[b'.']
27085
d50ff8f4891f histedit: add an experimental base action
Mateusz Kwapich <mitrandir@fb.com>
parents: 27084
diff changeset
986 return basectx, []
d50ff8f4891f histedit: add an experimental base action
Mateusz Kwapich <mitrandir@fb.com>
parents: 27084
diff changeset
987
29880
a485ec066867 histedt: use inheritance to override the constraints in 'base'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29879
diff changeset
988 def _verifynodeconstraints(self, prev, expected, seen):
a485ec066867 histedt: use inheritance to override the constraints in 'base'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29879
diff changeset
989 # base can only be use with a node not in the edited set
a485ec066867 histedt: use inheritance to override the constraints in 'base'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29879
diff changeset
990 if self.node in expected:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
991 msg = _(b'%s "%s" changeset was an edited list candidate')
29887
6d66200bff3b histedit: correct output of error when 'base' is from the edit list
Augie Fackler <augie@google.com>
parents: 29881
diff changeset
992 raise error.ParseError(
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
993 msg % (self.verb, short(self.node)),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
994 hint=_(b'base must only use unlisted changesets'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
995 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
996
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
997
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
998 @action(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
999 [b'_multifold'],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1000 _(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1001 """fold subclass used for when multiple folds happen in a row
26246
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
1002
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
1003 We only want to fire the editor for the folded message once when
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
1004 (say) four changes are folded down into a single change. This is
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
1005 similar to rollup, but we should preserve both messages so that
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
1006 when the last fold operation runs we can show the user all the
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
1007 commit messages in their editor.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1008 """
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1009 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1010 internal=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1011 )
27675
d073f4c70575 histedit: replace @addhisteditaction with @action
timeless <timeless@mozdev.org>
parents: 27674
diff changeset
1012 class _multifold(fold):
26246
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
1013 def skipprompt(self):
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
1014 return True
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
1015
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1016
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1017 @action(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1018 [b"roll", b"r"],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1019 _(b"like fold, but discard this commit's description and date"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1020 )
24771
3133e246c912 histedit: convert fold/roll actions into a class
Durham Goode <durham@fb.com>
parents: 24770
diff changeset
1021 class rollup(fold):
26246
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
1022 def mergedescs(self):
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
1023 return False
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
1024
24773
090da03361c5 histedit: improve roll action integration with fold
Durham Goode <durham@fb.com>
parents: 24772
diff changeset
1025 def skipprompt(self):
090da03361c5 histedit: improve roll action integration with fold
Durham Goode <durham@fb.com>
parents: 24772
diff changeset
1026 return True
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
1027
31056
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
1028 def firstdate(self):
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
1029 return True
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
1030
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1031
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1032 @action([b"drop", b"d"], _(b'remove commit from history'))
24768
342671704344 histedit: convert drop action into a class
Durham Goode <durham@fb.com>
parents: 24767
diff changeset
1033 class drop(histeditaction):
342671704344 histedit: convert drop action into a class
Durham Goode <durham@fb.com>
parents: 24767
diff changeset
1034 def run(self):
342671704344 histedit: convert drop action into a class
Durham Goode <durham@fb.com>
parents: 24767
diff changeset
1035 parentctx = self.repo[self.state.parentctxnode]
342671704344 histedit: convert drop action into a class
Durham Goode <durham@fb.com>
parents: 24767
diff changeset
1036 return parentctx, [(self.node, tuple())]
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
1037
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1038
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1039 @action(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1040 [b"mess", b"m"],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1041 _(b'edit commit message without changing commit content'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1042 priority=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1043 )
24769
e875b94dc94c histedit: convert message action into a class
Durham Goode <durham@fb.com>
parents: 24768
diff changeset
1044 class message(histeditaction):
e875b94dc94c histedit: convert message action into a class
Durham Goode <durham@fb.com>
parents: 24768
diff changeset
1045 def commiteditor(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1046 return cmdutil.getcommiteditor(edit=True, editform=b'histedit.mess')
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
1047
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1048
26335
6c93834d7d66 histedit: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26246
diff changeset
1049 def findoutgoing(ui, repo, remote=None, force=False, opts=None):
19021
26b41a902195 histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19020
diff changeset
1050 """utility function to find the first outgoing changeset
26b41a902195 histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19020
diff changeset
1051
26171
49c1424424de histedit: fix English (en-US)
timeless@mozdev.org
parents: 26100
diff changeset
1052 Used by initialization code"""
26335
6c93834d7d66 histedit: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26246
diff changeset
1053 if opts is None:
6c93834d7d66 histedit: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26246
diff changeset
1054 opts = {}
46941
d689d48527ea histedit: use `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
1055 path = urlutil.get_unique_push_path(b'histedit', repo, ui, remote)
d689d48527ea histedit: use `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
1056 dest = path.pushloc or path.loc
d689d48527ea histedit: use `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
1057
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46396
diff changeset
1058 ui.status(_(b'comparing with %s\n') % urlutil.hidepassword(dest))
19021
26b41a902195 histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19020
diff changeset
1059
46941
d689d48527ea histedit: use `get_unique_push_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
1060 revs, checkout = hg.addbranchrevs(repo, repo, (path.branch, []), None)
19021
26b41a902195 histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19020
diff changeset
1061 other = hg.peer(repo, opts, dest)
26b41a902195 histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19020
diff changeset
1062
26b41a902195 histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19020
diff changeset
1063 if revs:
26b41a902195 histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19020
diff changeset
1064 revs = [repo.lookup(rev) for rev in revs]
26b41a902195 histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19020
diff changeset
1065
26b41a902195 histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19020
diff changeset
1066 outgoing = discovery.findcommonoutgoing(repo, other, revs, force=force)
26b41a902195 histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19020
diff changeset
1067 if not outgoing.missing:
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
1068 raise error.StateError(_(b'no outgoing ancestors'))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1069 roots = list(repo.revs(b"roots(%ln)", outgoing.missing))
40029
e2697acd9381 cleanup: some Yoda conditions, this patch removes
Martin von Zweigbergk <martinvonz@google.com>
parents: 39914
diff changeset
1070 if len(roots) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1071 msg = _(b'there are ambiguous outgoing revisions')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1072 hint = _(b"see 'hg help histedit' for more detail")
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
1073 raise error.StateError(msg, hint=hint)
37314
8474005fcfe2 histedit: avoid repo.lookup() for converting revnum to nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37268
diff changeset
1074 return repo[roots[0]].node()
19021
26b41a902195 histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19020
diff changeset
1075
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1076
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1077 # Curses Support
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1078 try:
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1079 import curses
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1080 except ImportError:
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1081 curses = None
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1082
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1083 KEY_LIST = [b'pick', b'edit', b'fold', b'drop', b'mess', b'roll']
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1084 ACTION_LABELS = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1085 b'fold': b'^fold',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1086 b'roll': b'^roll',
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1087 }
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1088
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1089 COLOR_HELP, COLOR_SELECTED, COLOR_OK, COLOR_WARN, COLOR_CURRENT = 1, 2, 3, 4, 5
42089
16692aa3472b chistedit: add basic colours to diff view
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 42088
diff changeset
1090 COLOR_DIFF_ADD_LINE, COLOR_DIFF_DEL_LINE, COLOR_DIFF_OFFSET = 6, 7, 8
43663
1d29da62af76 histedit: define new colour pairs for roll action
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43662
diff changeset
1091 COLOR_ROLL, COLOR_ROLL_CURRENT, COLOR_ROLL_SELECTED = 9, 10, 11
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1092
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1093 E_QUIT, E_HISTEDIT = 1, 2
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1094 E_PAGEDOWN, E_PAGEUP, E_LINEUP, E_LINEDOWN, E_RESIZE = 3, 4, 5, 6, 7
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1095 MODE_INIT, MODE_PATCH, MODE_RULES, MODE_HELP = 0, 1, 2, 3
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1096
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1097 KEYTABLE = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1098 b'global': {
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1099 b'h': b'next-action',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1100 b'KEY_RIGHT': b'next-action',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1101 b'l': b'prev-action',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1102 b'KEY_LEFT': b'prev-action',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1103 b'q': b'quit',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1104 b'c': b'histedit',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1105 b'C': b'histedit',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1106 b'v': b'showpatch',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1107 b'?': b'help',
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1108 },
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1109 MODE_RULES: {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1110 b'd': b'action-drop',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1111 b'e': b'action-edit',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1112 b'f': b'action-fold',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1113 b'm': b'action-mess',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1114 b'p': b'action-pick',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1115 b'r': b'action-roll',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1116 b' ': b'select',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1117 b'j': b'down',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1118 b'k': b'up',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1119 b'KEY_DOWN': b'down',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1120 b'KEY_UP': b'up',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1121 b'J': b'move-down',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1122 b'K': b'move-up',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1123 b'KEY_NPAGE': b'move-down',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1124 b'KEY_PPAGE': b'move-up',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1125 b'0': b'goto', # Used for 0..9
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1126 },
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1127 MODE_PATCH: {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1128 b' ': b'page-down',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1129 b'KEY_NPAGE': b'page-down',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1130 b'KEY_PPAGE': b'page-up',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1131 b'j': b'line-down',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1132 b'k': b'line-up',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1133 b'KEY_DOWN': b'line-down',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1134 b'KEY_UP': b'line-up',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1135 b'J': b'down',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1136 b'K': b'up',
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1137 },
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1138 MODE_HELP: {},
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1139 }
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1140
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1141
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1142 def screen_size():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1143 return struct.unpack(b'hh', fcntl.ioctl(1, termios.TIOCGWINSZ, b' '))
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1144
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1145
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1146 class histeditrule(object):
44567
ad5a10f49dfa chistedit: support histedit.summary-template in curses histedit plan
Kyle Lippincott <spectral@google.com>
parents: 44452
diff changeset
1147 def __init__(self, ui, ctx, pos, action=b'pick'):
ad5a10f49dfa chistedit: support histedit.summary-template in curses histedit plan
Kyle Lippincott <spectral@google.com>
parents: 44452
diff changeset
1148 self.ui = ui
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1149 self.ctx = ctx
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1150 self.action = action
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1151 self.origpos = pos
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1152 self.pos = pos
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1153 self.conflicts = []
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1154
43368
d8215ff082da py3: make chistedit render
Martin von Zweigbergk <martinvonz@google.com>
parents: 43228
diff changeset
1155 def __bytes__(self):
43662
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1156 # Example display of several histeditrules:
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1157 #
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1158 # #10 pick 316392:06a16c25c053 add option to skip tests
43662
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1159 # #11 ^roll 316393:71313c964cc5 <RED>oops a fixup commit</RED>
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1160 # #12 pick 316394:ab31f3973b0d include mfbt for mozilla-config.h
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1161 # #13 ^fold 316395:14ce5803f4c3 fix warnings
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1162 #
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1163 # The carets point to the changeset being folded into ("roll this
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1164 # changeset into the changeset above").
43662
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1165 return b'%s%s' % (self.prefix, self.desc)
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1166
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1167 __str__ = encoding.strmethod(__bytes__)
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1168
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1169 @property
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1170 def prefix(self):
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1171 # Some actions ('fold' and 'roll') combine a patch with a
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1172 # previous one. Add a marker showing which patch they apply
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1173 # to.
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1174 action = ACTION_LABELS.get(self.action, self.action)
43662
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1175
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1176 h = self.ctx.hex()[0:12]
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1177 r = self.ctx.rev()
43662
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1178
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1179 return b"#%s %s %d:%s " % (
43368
d8215ff082da py3: make chistedit render
Martin von Zweigbergk <martinvonz@google.com>
parents: 43228
diff changeset
1180 (b'%d' % self.origpos).ljust(2),
d8215ff082da py3: make chistedit render
Martin von Zweigbergk <martinvonz@google.com>
parents: 43228
diff changeset
1181 action.ljust(6),
d8215ff082da py3: make chistedit render
Martin von Zweigbergk <martinvonz@google.com>
parents: 43228
diff changeset
1182 r,
d8215ff082da py3: make chistedit render
Martin von Zweigbergk <martinvonz@google.com>
parents: 43228
diff changeset
1183 h,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1184 )
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1185
45450
47d10ade5bc4 histedit: cache description line
Martin von Zweigbergk <martinvonz@google.com>
parents: 45375
diff changeset
1186 @util.propertycache
43662
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1187 def desc(self):
45791
1f9736eb0e65 histedit: drop fallback to empty string from rendertemplate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
1188 summary = cmdutil.rendertemplate(
1f9736eb0e65 histedit: drop fallback to empty string from rendertemplate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
1189 self.ctx, self.ui.config(b'histedit', b'summary-template')
44567
ad5a10f49dfa chistedit: support histedit.summary-template in curses histedit plan
Kyle Lippincott <spectral@google.com>
parents: 44452
diff changeset
1190 )
ad5a10f49dfa chistedit: support histedit.summary-template in curses histedit plan
Kyle Lippincott <spectral@google.com>
parents: 44452
diff changeset
1191 if summary:
ad5a10f49dfa chistedit: support histedit.summary-template in curses histedit plan
Kyle Lippincott <spectral@google.com>
parents: 44452
diff changeset
1192 return summary
43662
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1193 # This is split off from the prefix property so that we can
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1194 # separately make the description for 'roll' red (since it
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1195 # will get discarded).
4323a32c7afe histeditrule: split __bytes__ property into prefix and desc
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43569
diff changeset
1196 return self.ctx.description().splitlines()[0].strip()
43368
d8215ff082da py3: make chistedit render
Martin von Zweigbergk <martinvonz@google.com>
parents: 43228
diff changeset
1197
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1198 def checkconflicts(self, other):
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1199 if other.pos > self.pos and other.origpos <= self.origpos:
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1200 if set(other.ctx.files()) & set(self.ctx.files()) != set():
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1201 self.conflicts.append(other)
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1202 return self.conflicts
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1203
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1204 if other in self.conflicts:
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1205 self.conflicts.remove(other)
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1206 return self.conflicts
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1207
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1208
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1209 def makecommands(rules):
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1210 """Returns a list of commands consumable by histedit --commands based on
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1211 our list of rules"""
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1212 commands = []
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1213 for rules in rules:
43371
85ab79bc7dab py3: avoid another b''.format() in chistedit
Martin von Zweigbergk <martinvonz@google.com>
parents: 43370
diff changeset
1214 commands.append(b'%s %s\n' % (rules.action, rules.ctx))
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1215 return commands
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1216
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1217
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1218 def addln(win, y, x, line, color=None):
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1219 """Add a line to the given window left padding but 100% filled with
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1220 whitespace characters, so that the color appears on the whole line"""
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1221 maxy, maxx = win.getmaxyx()
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1222 length = maxx - 1 - x
43368
d8215ff082da py3: make chistedit render
Martin von Zweigbergk <martinvonz@google.com>
parents: 43228
diff changeset
1223 line = bytes(line).ljust(length)[:length]
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1224 if y < 0:
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1225 y = maxy + y
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1226 if x < 0:
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1227 x = maxx + x
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1228 if color:
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1229 win.addstr(y, x, line, color)
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1230 else:
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1231 win.addstr(y, x, line)
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1232
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1233
42233
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1234 def _trunc_head(line, n):
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1235 if len(line) <= n:
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1236 return line
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1237 return b'> ' + line[-(n - 2) :]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1238
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1239
42233
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1240 def _trunc_tail(line, n):
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1241 if len(line) <= n:
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1242 return line
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1243 return line[: n - 2] + b' >'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1244
42233
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1245
48200
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1246 class _chistedit_state(object):
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1247 def __init__(
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1248 self,
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1249 repo,
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1250 rules,
48202
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1251 stdscr,
48200
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1252 ):
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1253 self.repo = repo
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1254 self.rules = rules
48202
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1255 self.stdscr = stdscr
48233
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1256 self.later_on_top = repo.ui.configbool(
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1257 b'histedit', b'later-commits-first'
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1258 )
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1259 # The current item in display order, initialized to point to the top
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1260 # of the screen.
48200
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1261 self.pos = 0
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1262 self.selected = None
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1263 self.mode = (MODE_INIT, MODE_INIT)
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1264 self.page_height = None
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1265 self.modes = {
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1266 MODE_RULES: {
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1267 b'line_offset': 0,
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1268 },
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1269 MODE_PATCH: {
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1270 b'line_offset': 0,
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1271 },
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1272 }
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1273
48201
8ac61257c807 chistedit: move rendercommit() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48200
diff changeset
1274 def render_commit(self, win):
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1275 """Renders the commit window that shows the log of the current selected
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1276 commit"""
48233
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1277 rule = self.rules[self.display_pos_to_rule_pos(self.pos)]
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1278
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1279 ctx = rule.ctx
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1280 win.box()
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1281
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1282 maxy, maxx = win.getmaxyx()
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1283 length = maxx - 3
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1284
43376
b27cf9f52194 histedit: restore hex nodeids to be 12 digits long
Martin von Zweigbergk <martinvonz@google.com>
parents: 43373
diff changeset
1285 line = b"changeset: %d:%s" % (ctx.rev(), ctx.hex()[:12])
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1286 win.addstr(1, 1, line[:length])
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1287
43368
d8215ff082da py3: make chistedit render
Martin von Zweigbergk <martinvonz@google.com>
parents: 43228
diff changeset
1288 line = b"user: %s" % ctx.user()
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1289 win.addstr(2, 1, line[:length])
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1290
48201
8ac61257c807 chistedit: move rendercommit() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48200
diff changeset
1291 bms = self.repo.nodebookmarks(ctx.node())
43368
d8215ff082da py3: make chistedit render
Martin von Zweigbergk <martinvonz@google.com>
parents: 43228
diff changeset
1292 line = b"bookmark: %s" % b' '.join(bms)
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1293 win.addstr(3, 1, line[:length])
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1294
43368
d8215ff082da py3: make chistedit render
Martin von Zweigbergk <martinvonz@google.com>
parents: 43228
diff changeset
1295 line = b"summary: %s" % (ctx.description().splitlines()[0])
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1296 win.addstr(4, 1, line[:length])
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1297
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1298 line = b"files: "
42233
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1299 win.addstr(5, 1, line)
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1300 fnx = 1 + len(line)
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1301 fnmaxx = length - fnx + 1
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1302 y = 5
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1303 fnmaxn = maxy - (1 + y) - 1
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1304 files = ctx.files()
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1305 for i, line1 in enumerate(files):
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1306 if len(files) > fnmaxn and i == fnmaxn - 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1307 win.addstr(y, fnx, _trunc_tail(b','.join(files[i:]), fnmaxx))
42233
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1308 y = y + 1
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1309 break
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1310 win.addstr(y, fnx, _trunc_head(line1, fnmaxx))
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1311 y = y + 1
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1312
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1313 conflicts = rule.conflicts
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1314 if len(conflicts) > 0:
43376
b27cf9f52194 histedit: restore hex nodeids to be 12 digits long
Martin von Zweigbergk <martinvonz@google.com>
parents: 43373
diff changeset
1315 conflictstr = b','.join(map(lambda r: r.ctx.hex()[:12], conflicts))
43368
d8215ff082da py3: make chistedit render
Martin von Zweigbergk <martinvonz@google.com>
parents: 43228
diff changeset
1316 conflictstr = b"changed files overlap with %s" % conflictstr
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1317 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1318 conflictstr = b'no overlap'
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1319
42233
4ad191041be2 histedit: Show file names in multiple line format
Yu Feng <rainwoodman@gmail.com>
parents: 42160
diff changeset
1320 win.addstr(y, 1, conflictstr[:length])
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1321 win.noutrefresh()
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1322
48202
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1323 def helplines(self):
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1324 if self.mode[0] == MODE_PATCH:
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1325 help = b"""\
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1326 ?: help, k/up: line up, j/down: line down, v: stop viewing patch
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1327 pgup: prev page, space/pgdn: next page, c: commit, q: abort
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1328 """
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1329 else:
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1330 help = b"""\
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1331 ?: help, k/up: move up, j/down: move down, space: select, v: view patch
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1332 d: drop, e: edit, f: fold, m: mess, p: pick, r: roll
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1333 pgup/K: move patch up, pgdn/J: move patch down, c: commit, q: abort
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1334 """
48371
9503e15dc588 chistedit: explain which order the commits are presented in
Martin von Zweigbergk <martinvonz@google.com>
parents: 48233
diff changeset
1335 if self.later_on_top:
9503e15dc588 chistedit: explain which order the commits are presented in
Martin von Zweigbergk <martinvonz@google.com>
parents: 48233
diff changeset
1336 help += b"Newer commits are shown above older commits.\n"
9503e15dc588 chistedit: explain which order the commits are presented in
Martin von Zweigbergk <martinvonz@google.com>
parents: 48233
diff changeset
1337 else:
9503e15dc588 chistedit: explain which order the commits are presented in
Martin von Zweigbergk <martinvonz@google.com>
parents: 48233
diff changeset
1338 help += b"Older commits are shown above newer commits.\n"
48202
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1339 return help.splitlines()
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1340
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1341 def render_help(self, win):
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1342 maxy, maxx = win.getmaxyx()
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1343 for y, line in enumerate(self.helplines()):
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1344 if y >= maxy:
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1345 break
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1346 addln(win, y, 0, line, curses.color_pair(COLOR_HELP))
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1347 win.noutrefresh()
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1348
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1349 def layout(self):
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1350 maxy, maxx = self.stdscr.getmaxyx()
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1351 helplen = len(self.helplines())
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1352 mainlen = maxy - helplen - 12
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1353 if mainlen < 1:
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1354 raise error.Abort(
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1355 _(b"terminal dimensions %d by %d too small for curses histedit")
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1356 % (maxy, maxx),
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1357 hint=_(
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1358 b"enlarge your terminal or use --config ui.interface=text"
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1359 ),
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1360 )
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1361 return {
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1362 b'commit': (12, maxx),
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1363 b'help': (helplen, maxx),
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1364 b'main': (mainlen, maxx),
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1365 }
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1366
48233
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1367 def display_pos_to_rule_pos(self, display_pos):
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1368 """Converts a position in display order to rule order.
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1369
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1370 The `display_pos` is the order from the top in display order, not
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1371 considering which items are currently visible on the screen. Thus,
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1372 `display_pos=0` is the item at the top (possibly after scrolling to
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1373 the top)
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1374 """
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1375 if self.later_on_top:
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1376 return len(self.rules) - 1 - display_pos
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1377 else:
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1378 return display_pos
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1379
48203
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1380 def render_rules(self, rulesscr):
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1381 start = self.modes[MODE_RULES][b'line_offset']
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1382
48214
1895027c5051 chistedit: remove some local variable and access state on self instead
Martin von Zweigbergk <martinvonz@google.com>
parents: 48213
diff changeset
1383 conflicts = [r.ctx for r in self.rules if r.conflicts]
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1384 if len(conflicts) > 0:
43370
7f56b0cbd245 py3: render message about conflicts in chistedit code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43369
diff changeset
1385 line = b"potential conflict in %s" % b','.join(
7f56b0cbd245 py3: render message about conflicts in chistedit code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43369
diff changeset
1386 map(pycompat.bytestr, conflicts)
7f56b0cbd245 py3: render message about conflicts in chistedit code
Martin von Zweigbergk <martinvonz@google.com>
parents: 43369
diff changeset
1387 )
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1388 addln(rulesscr, -1, 0, line, curses.color_pair(COLOR_WARN))
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1389
48233
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1390 for display_pos in range(start, len(self.rules)):
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1391 y = display_pos - start
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1392 if y < 0 or y >= self.page_height:
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1393 continue
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1394 rule_pos = self.display_pos_to_rule_pos(display_pos)
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1395 rule = self.rules[rule_pos]
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1396 if len(rule.conflicts) > 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1397 rulesscr.addstr(y, 0, b" ", curses.color_pair(COLOR_WARN))
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1398 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1399 rulesscr.addstr(y, 0, b" ", curses.COLOR_BLACK)
43664
bde66eb4051d histedit: render a rolled up description using the proper roll colours
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43663
diff changeset
1400
48233
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1401 if display_pos == self.selected:
43664
bde66eb4051d histedit: render a rolled up description using the proper roll colours
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43663
diff changeset
1402 rollcolor = COLOR_ROLL_SELECTED
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1403 addln(rulesscr, y, 2, rule, curses.color_pair(COLOR_SELECTED))
48233
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1404 elif display_pos == self.pos:
43664
bde66eb4051d histedit: render a rolled up description using the proper roll colours
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43663
diff changeset
1405 rollcolor = COLOR_ROLL_CURRENT
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1406 addln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1407 rulesscr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1408 y,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1409 2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1410 rule,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1411 curses.color_pair(COLOR_CURRENT) | curses.A_BOLD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1412 )
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1413 else:
43664
bde66eb4051d histedit: render a rolled up description using the proper roll colours
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43663
diff changeset
1414 rollcolor = COLOR_ROLL
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1415 addln(rulesscr, y, 2, rule)
43664
bde66eb4051d histedit: render a rolled up description using the proper roll colours
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43663
diff changeset
1416
bde66eb4051d histedit: render a rolled up description using the proper roll colours
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43663
diff changeset
1417 if rule.action == b'roll':
bde66eb4051d histedit: render a rolled up description using the proper roll colours
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43663
diff changeset
1418 rulesscr.addstr(
bde66eb4051d histedit: render a rolled up description using the proper roll colours
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43663
diff changeset
1419 y,
bde66eb4051d histedit: render a rolled up description using the proper roll colours
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43663
diff changeset
1420 2 + len(rule.prefix),
bde66eb4051d histedit: render a rolled up description using the proper roll colours
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43663
diff changeset
1421 rule.desc,
bde66eb4051d histedit: render a rolled up description using the proper roll colours
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43663
diff changeset
1422 curses.color_pair(rollcolor),
bde66eb4051d histedit: render a rolled up description using the proper roll colours
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43663
diff changeset
1423 )
bde66eb4051d histedit: render a rolled up description using the proper roll colours
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 43663
diff changeset
1424
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1425 rulesscr.noutrefresh()
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1426
48204
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1427 def render_string(self, win, output, diffcolors=False):
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1428 maxy, maxx = win.getmaxyx()
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1429 length = min(maxy - 1, len(output))
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1430 for y in range(0, length):
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1431 line = output[y]
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1432 if diffcolors:
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1433 if line and line[0] == b'+':
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1434 win.addstr(
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1435 y, 0, line, curses.color_pair(COLOR_DIFF_ADD_LINE)
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1436 )
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1437 elif line and line[0] == b'-':
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1438 win.addstr(
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1439 y, 0, line, curses.color_pair(COLOR_DIFF_DEL_LINE)
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1440 )
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1441 elif line.startswith(b'@@ '):
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1442 win.addstr(y, 0, line, curses.color_pair(COLOR_DIFF_OFFSET))
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1443 else:
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1444 win.addstr(y, 0, line)
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1445 else:
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1446 win.addstr(y, 0, line)
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1447 win.noutrefresh()
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1448
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1449 def render_patch(self, win):
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1450 start = self.modes[MODE_PATCH][b'line_offset']
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1451 content = self.modes[MODE_PATCH][b'patchcontents']
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1452 self.render_string(win, content[start:], diffcolors=True)
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1453
48205
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1454 def event(self, ch):
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1455 """Change state based on the current character input
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1456
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1457 This takes the current state and based on the current character input from
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1458 the user we change the state.
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1459 """
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1460 oldpos = self.pos
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1461
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1462 if ch in (curses.KEY_RESIZE, b"KEY_RESIZE"):
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1463 return E_RESIZE
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1464
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1465 lookup_ch = ch
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1466 if ch is not None and b'0' <= ch <= b'9':
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1467 lookup_ch = b'0'
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1468
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1469 curmode, prevmode = self.mode
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1470 action = KEYTABLE[curmode].get(
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1471 lookup_ch, KEYTABLE[b'global'].get(lookup_ch)
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1472 )
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1473 if action is None:
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1474 return
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1475 if action in (b'down', b'move-down'):
48214
1895027c5051 chistedit: remove some local variable and access state on self instead
Martin von Zweigbergk <martinvonz@google.com>
parents: 48213
diff changeset
1476 newpos = min(oldpos + 1, len(self.rules) - 1)
48207
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1477 self.move_cursor(oldpos, newpos)
48214
1895027c5051 chistedit: remove some local variable and access state on self instead
Martin von Zweigbergk <martinvonz@google.com>
parents: 48213
diff changeset
1478 if self.selected is not None or action == b'move-down':
48210
0444956ecbcf chistedit: move swap() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48209
diff changeset
1479 self.swap(oldpos, newpos)
48205
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1480 elif action in (b'up', b'move-up'):
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1481 newpos = max(0, oldpos - 1)
48207
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1482 self.move_cursor(oldpos, newpos)
48214
1895027c5051 chistedit: remove some local variable and access state on self instead
Martin von Zweigbergk <martinvonz@google.com>
parents: 48213
diff changeset
1483 if self.selected is not None or action == b'move-up':
48210
0444956ecbcf chistedit: move swap() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48209
diff changeset
1484 self.swap(oldpos, newpos)
48205
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1485 elif action == b'next-action':
48212
7913f533592d chistedit: move cycleaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48211
diff changeset
1486 self.cycle_action(oldpos, next=True)
48205
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1487 elif action == b'prev-action':
48212
7913f533592d chistedit: move cycleaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48211
diff changeset
1488 self.cycle_action(oldpos, next=False)
48205
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1489 elif action == b'select':
48214
1895027c5051 chistedit: remove some local variable and access state on self instead
Martin von Zweigbergk <martinvonz@google.com>
parents: 48213
diff changeset
1490 self.selected = oldpos if self.selected is None else None
1895027c5051 chistedit: remove some local variable and access state on self instead
Martin von Zweigbergk <martinvonz@google.com>
parents: 48213
diff changeset
1491 self.make_selection(self.selected)
1895027c5051 chistedit: remove some local variable and access state on self instead
Martin von Zweigbergk <martinvonz@google.com>
parents: 48213
diff changeset
1492 elif action == b'goto' and int(ch) < len(self.rules) <= 10:
1895027c5051 chistedit: remove some local variable and access state on self instead
Martin von Zweigbergk <martinvonz@google.com>
parents: 48213
diff changeset
1493 newrule = next((r for r in self.rules if r.origpos == int(ch)))
48207
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1494 self.move_cursor(oldpos, newrule.pos)
48214
1895027c5051 chistedit: remove some local variable and access state on self instead
Martin von Zweigbergk <martinvonz@google.com>
parents: 48213
diff changeset
1495 if self.selected is not None:
48210
0444956ecbcf chistedit: move swap() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48209
diff changeset
1496 self.swap(oldpos, newrule.pos)
48205
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1497 elif action.startswith(b'action-'):
48211
141aafac446c chistedit: move changeaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48210
diff changeset
1498 self.change_action(oldpos, action[7:])
48205
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1499 elif action == b'showpatch':
48208
7d2464b6e30b chistedit: move changemode() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48207
diff changeset
1500 self.change_mode(MODE_PATCH if curmode != MODE_PATCH else prevmode)
48205
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1501 elif action == b'help':
48208
7d2464b6e30b chistedit: move changemode() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48207
diff changeset
1502 self.change_mode(MODE_HELP if curmode != MODE_HELP else prevmode)
48205
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1503 elif action == b'quit':
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1504 return E_QUIT
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1505 elif action == b'histedit':
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1506 return E_HISTEDIT
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1507 elif action == b'page-down':
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1508 return E_PAGEDOWN
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1509 elif action == b'page-up':
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1510 return E_PAGEUP
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1511 elif action == b'line-down':
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1512 return E_LINEDOWN
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1513 elif action == b'line-up':
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1514 return E_LINEUP
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1515
48206
c7690fabce5f chistedit: move patchcontents() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48205
diff changeset
1516 def patch_contents(self):
c7690fabce5f chistedit: move patchcontents() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48205
diff changeset
1517 repo = self.repo
48233
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1518 rule = self.rules[self.display_pos_to_rule_pos(self.pos)]
48206
c7690fabce5f chistedit: move patchcontents() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48205
diff changeset
1519 displayer = logcmdutil.changesetdisplayer(
c7690fabce5f chistedit: move patchcontents() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48205
diff changeset
1520 repo.ui,
c7690fabce5f chistedit: move patchcontents() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48205
diff changeset
1521 repo,
c7690fabce5f chistedit: move patchcontents() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48205
diff changeset
1522 {b"patch": True, b"template": b"status"},
c7690fabce5f chistedit: move patchcontents() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48205
diff changeset
1523 buffered=True,
c7690fabce5f chistedit: move patchcontents() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48205
diff changeset
1524 )
c7690fabce5f chistedit: move patchcontents() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48205
diff changeset
1525 overrides = {(b'ui', b'verbose'): True}
c7690fabce5f chistedit: move patchcontents() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48205
diff changeset
1526 with repo.ui.configoverride(overrides, source=b'histedit'):
c7690fabce5f chistedit: move patchcontents() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48205
diff changeset
1527 displayer.show(rule.ctx)
c7690fabce5f chistedit: move patchcontents() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48205
diff changeset
1528 displayer.close()
c7690fabce5f chistedit: move patchcontents() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48205
diff changeset
1529 return displayer.hunk[rule.ctx.rev()].splitlines()
c7690fabce5f chistedit: move patchcontents() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48205
diff changeset
1530
48207
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1531 def move_cursor(self, oldpos, newpos):
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1532 """Change the rule/changeset that the cursor is pointing to, regardless of
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1533 current mode (you can switch between patches from the view patch window)."""
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1534 self.pos = newpos
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1535
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1536 mode, _ = self.mode
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1537 if mode == MODE_RULES:
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1538 # Scroll through the list by updating the view for MODE_RULES, so that
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1539 # even if we are not currently viewing the rules, switching back will
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1540 # result in the cursor's rule being visible.
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1541 modestate = self.modes[MODE_RULES]
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1542 if newpos < modestate[b'line_offset']:
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1543 modestate[b'line_offset'] = newpos
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1544 elif newpos > modestate[b'line_offset'] + self.page_height - 1:
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1545 modestate[b'line_offset'] = newpos - self.page_height + 1
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1546
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1547 # Reset the patch view region to the top of the new patch.
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1548 self.modes[MODE_PATCH][b'line_offset'] = 0
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1549
48208
7d2464b6e30b chistedit: move changemode() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48207
diff changeset
1550 def change_mode(self, mode):
7d2464b6e30b chistedit: move changemode() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48207
diff changeset
1551 curmode, _ = self.mode
7d2464b6e30b chistedit: move changemode() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48207
diff changeset
1552 self.mode = (mode, curmode)
7d2464b6e30b chistedit: move changemode() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48207
diff changeset
1553 if mode == MODE_PATCH:
7d2464b6e30b chistedit: move changemode() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48207
diff changeset
1554 self.modes[MODE_PATCH][b'patchcontents'] = self.patch_contents()
7d2464b6e30b chistedit: move changemode() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48207
diff changeset
1555
48209
0f498e03b016 chistedit: move makeselection() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48208
diff changeset
1556 def make_selection(self, pos):
0f498e03b016 chistedit: move makeselection() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48208
diff changeset
1557 self.selected = pos
0f498e03b016 chistedit: move makeselection() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48208
diff changeset
1558
48210
0444956ecbcf chistedit: move swap() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48209
diff changeset
1559 def swap(self, oldpos, newpos):
0444956ecbcf chistedit: move swap() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48209
diff changeset
1560 """Swap two positions and calculate necessary conflicts in
0444956ecbcf chistedit: move swap() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48209
diff changeset
1561 O(|newpos-oldpos|) time"""
48233
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1562 old_rule_pos = self.display_pos_to_rule_pos(oldpos)
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1563 new_rule_pos = self.display_pos_to_rule_pos(newpos)
48210
0444956ecbcf chistedit: move swap() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48209
diff changeset
1564
0444956ecbcf chistedit: move swap() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48209
diff changeset
1565 rules = self.rules
48233
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1566 assert 0 <= old_rule_pos < len(rules) and 0 <= new_rule_pos < len(rules)
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1567
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1568 rules[old_rule_pos], rules[new_rule_pos] = (
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1569 rules[new_rule_pos],
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1570 rules[old_rule_pos],
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1571 )
48210
0444956ecbcf chistedit: move swap() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48209
diff changeset
1572
0444956ecbcf chistedit: move swap() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48209
diff changeset
1573 # TODO: swap should not know about histeditrule's internals
48233
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1574 rules[new_rule_pos].pos = new_rule_pos
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1575 rules[old_rule_pos].pos = old_rule_pos
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1576
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1577 start = min(old_rule_pos, new_rule_pos)
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1578 end = max(old_rule_pos, new_rule_pos)
48210
0444956ecbcf chistedit: move swap() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48209
diff changeset
1579 for r in pycompat.xrange(start, end + 1):
48233
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1580 rules[new_rule_pos].checkconflicts(rules[r])
c820866c52f9 chistedit: add option to show order of commits in opposite order
Martin von Zweigbergk <martinvonz@google.com>
parents: 48215
diff changeset
1581 rules[old_rule_pos].checkconflicts(rules[r])
48210
0444956ecbcf chistedit: move swap() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48209
diff changeset
1582
0444956ecbcf chistedit: move swap() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48209
diff changeset
1583 if self.selected:
0444956ecbcf chistedit: move swap() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48209
diff changeset
1584 self.make_selection(newpos)
0444956ecbcf chistedit: move swap() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48209
diff changeset
1585
48211
141aafac446c chistedit: move changeaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48210
diff changeset
1586 def change_action(self, pos, action):
141aafac446c chistedit: move changeaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48210
diff changeset
1587 """Change the action state on the given position to the new action"""
48214
1895027c5051 chistedit: remove some local variable and access state on self instead
Martin von Zweigbergk <martinvonz@google.com>
parents: 48213
diff changeset
1588 assert 0 <= pos < len(self.rules)
1895027c5051 chistedit: remove some local variable and access state on self instead
Martin von Zweigbergk <martinvonz@google.com>
parents: 48213
diff changeset
1589 self.rules[pos].action = action
48211
141aafac446c chistedit: move changeaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48210
diff changeset
1590
48212
7913f533592d chistedit: move cycleaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48211
diff changeset
1591 def cycle_action(self, pos, next=False):
7913f533592d chistedit: move cycleaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48211
diff changeset
1592 """Changes the action state the next or the previous action from
7913f533592d chistedit: move cycleaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48211
diff changeset
1593 the action list"""
48214
1895027c5051 chistedit: remove some local variable and access state on self instead
Martin von Zweigbergk <martinvonz@google.com>
parents: 48213
diff changeset
1594 assert 0 <= pos < len(self.rules)
1895027c5051 chistedit: remove some local variable and access state on self instead
Martin von Zweigbergk <martinvonz@google.com>
parents: 48213
diff changeset
1595 current = self.rules[pos].action
48212
7913f533592d chistedit: move cycleaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48211
diff changeset
1596
7913f533592d chistedit: move cycleaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48211
diff changeset
1597 assert current in KEY_LIST
7913f533592d chistedit: move cycleaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48211
diff changeset
1598
7913f533592d chistedit: move cycleaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48211
diff changeset
1599 index = KEY_LIST.index(current)
7913f533592d chistedit: move cycleaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48211
diff changeset
1600 if next:
7913f533592d chistedit: move cycleaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48211
diff changeset
1601 index += 1
7913f533592d chistedit: move cycleaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48211
diff changeset
1602 else:
7913f533592d chistedit: move cycleaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48211
diff changeset
1603 index -= 1
7913f533592d chistedit: move cycleaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48211
diff changeset
1604 self.change_action(pos, KEY_LIST[index % len(KEY_LIST)])
7913f533592d chistedit: move cycleaction() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48211
diff changeset
1605
48213
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1606 def change_view(self, delta, unit):
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1607 """Change the region of whatever is being viewed (a patch or the list of
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1608 changesets). 'delta' is an amount (+/- 1) and 'unit' is 'page' or 'line'."""
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1609 mode, _ = self.mode
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1610 if mode != MODE_PATCH:
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1611 return
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1612 mode_state = self.modes[mode]
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1613 num_lines = len(mode_state[b'patchcontents'])
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1614 page_height = self.page_height
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1615 unit = page_height if unit == b'page' else 1
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1616 num_pages = 1 + (num_lines - 1) // page_height
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1617 max_offset = (num_pages - 1) * page_height
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1618 newline = mode_state[b'line_offset'] + delta * unit
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1619 mode_state[b'line_offset'] = max(0, min(max_offset, newline))
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1620
48203
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1621
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1622 def _chisteditmain(repo, rules, stdscr):
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1623 try:
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1624 curses.use_default_colors()
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1625 except curses.error:
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1626 pass
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1627
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1628 # initialize color pattern
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1629 curses.init_pair(COLOR_HELP, curses.COLOR_WHITE, curses.COLOR_BLUE)
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1630 curses.init_pair(COLOR_SELECTED, curses.COLOR_BLACK, curses.COLOR_WHITE)
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1631 curses.init_pair(COLOR_WARN, curses.COLOR_BLACK, curses.COLOR_YELLOW)
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1632 curses.init_pair(COLOR_OK, curses.COLOR_BLACK, curses.COLOR_GREEN)
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1633 curses.init_pair(COLOR_CURRENT, curses.COLOR_WHITE, curses.COLOR_MAGENTA)
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1634 curses.init_pair(COLOR_DIFF_ADD_LINE, curses.COLOR_GREEN, -1)
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1635 curses.init_pair(COLOR_DIFF_DEL_LINE, curses.COLOR_RED, -1)
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1636 curses.init_pair(COLOR_DIFF_OFFSET, curses.COLOR_MAGENTA, -1)
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1637 curses.init_pair(COLOR_ROLL, curses.COLOR_RED, -1)
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1638 curses.init_pair(
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1639 COLOR_ROLL_CURRENT, curses.COLOR_BLACK, curses.COLOR_MAGENTA
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1640 )
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1641 curses.init_pair(COLOR_ROLL_SELECTED, curses.COLOR_RED, curses.COLOR_WHITE)
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1642
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1643 # don't display the cursor
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1644 try:
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1645 curses.curs_set(0)
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1646 except curses.error:
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1647 pass
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1648
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1649 def drawvertwin(size, y, x):
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1650 win = curses.newwin(size[0], size[1], y, x)
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1651 y += size[0]
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1652 return win, y, x
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1653
48202
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1654 state = _chistedit_state(repo, rules, stdscr)
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1655
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1656 # eventloop
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1657 ch = None
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1658 stdscr.clear()
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1659 stdscr.refresh()
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1660 while True:
48200
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1661 oldmode, unused = state.mode
46396
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1662 if oldmode == MODE_INIT:
48208
7d2464b6e30b chistedit: move changemode() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48207
diff changeset
1663 state.change_mode(MODE_RULES)
48205
3fdeb657602f chistedit: move event() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48204
diff changeset
1664 e = state.event(ch)
46396
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1665
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1666 if e == E_QUIT:
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1667 return False
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1668 if e == E_HISTEDIT:
48200
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1669 return state.rules
46396
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1670 else:
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1671 if e == E_RESIZE:
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1672 size = screen_size()
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1673 if size != stdscr.getmaxyx():
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1674 curses.resizeterm(*size)
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1675
48202
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1676 sizes = state.layout()
48200
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1677 curmode, unused = state.mode
46396
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1678 if curmode != oldmode:
48200
b6fc7d188f68 chistedit: move view state from a dict to a custom class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
1679 state.page_height = sizes[b'main'][0]
46396
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1680 # Adjust the view to fit the current screen size.
48207
fb30ad66a572 chistedit: move movecursor() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48206
diff changeset
1681 state.move_cursor(state.pos, state.pos)
46396
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1682
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1683 # Pack the windows against the top, each pane spread across the
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1684 # full width of the screen.
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1685 y, x = (0, 0)
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1686 helpwin, y, x = drawvertwin(sizes[b'help'], y, x)
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1687 mainwin, y, x = drawvertwin(sizes[b'main'], y, x)
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1688 commitwin, y, x = drawvertwin(sizes[b'commit'], y, x)
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1689
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1690 if e in (E_PAGEDOWN, E_PAGEUP, E_LINEDOWN, E_LINEUP):
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1691 if e == E_PAGEDOWN:
48213
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1692 state.change_view(+1, b'page')
46396
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1693 elif e == E_PAGEUP:
48213
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1694 state.change_view(-1, b'page')
46396
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1695 elif e == E_LINEDOWN:
48213
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1696 state.change_view(+1, b'line')
46396
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1697 elif e == E_LINEUP:
48213
1302905b2d49 chistedit: move changeview() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48212
diff changeset
1698 state.change_view(-1, b'line')
46396
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1699
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1700 # start rendering
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1701 commitwin.erase()
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1702 helpwin.erase()
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1703 mainwin.erase()
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1704 if curmode == MODE_PATCH:
48204
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1705 state.render_patch(mainwin)
46396
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1706 elif curmode == MODE_HELP:
48204
33ece8857efa chistedit: move renderpatch() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48203
diff changeset
1707 state.render_string(mainwin, __doc__.strip().splitlines())
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1708 else:
48203
8dd2422b0109 chistedit: move renderrules() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48202
diff changeset
1709 state.render_rules(mainwin)
48201
8ac61257c807 chistedit: move rendercommit() onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48200
diff changeset
1710 state.render_commit(commitwin)
48202
9006eafa0942 chistedit: move layout() and dependencies onto state class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48201
diff changeset
1711 state.render_help(helpwin)
46396
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1712 curses.doupdate()
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1713 # done rendering
11ce2977572f histedit: rip out mysterious catch-all ignore curses.error handler
Augie Fackler <augie@google.com>
parents: 46395
diff changeset
1714 ch = encoding.strtolocal(stdscr.getkey())
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1715
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1716
44402
9b8e13a038db histedit: py3 fixes for curses mode
Steve Fink <sfink@mozilla.com>
parents: 43995
diff changeset
1717 def _chistedit(ui, repo, freeargs, opts):
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1718 """interactively edit changeset history via a curses interface
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1719
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1720 Provides a ncurses interface to histedit. Press ? in chistedit mode
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1721 to see an extensive help. Requires python-curses to be installed."""
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1722
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1723 if curses is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1724 raise error.Abort(_(b"Python curses library required"))
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1725
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1726 # disable color
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1727 ui._colormode = None
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1728
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1729 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1730 keep = opts.get(b'keep')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1731 revs = opts.get(b'rev', [])[:]
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1732 cmdutil.checkunfinished(repo)
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1733 cmdutil.bailifchanged(repo)
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1734
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1735 revs.extend(freeargs)
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1736 if not revs:
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1737 defaultrev = destutil.desthistedit(ui, repo)
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1738 if defaultrev is not None:
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1739 revs.append(defaultrev)
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1740 if len(revs) != 1:
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
1741 raise error.InputError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1742 _(b'histedit requires exactly one ancestor revision')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1743 )
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1744
48116
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48054
diff changeset
1745 rr = list(repo.set(b'roots(%ld)', logcmdutil.revrange(repo, revs)))
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1746 if len(rr) != 1:
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
1747 raise error.InputError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1748 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1749 b'The specified revisions must have '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1750 b'exactly one common root'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1751 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1752 )
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1753 root = rr[0].node()
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1754
41399
5cb8158a61f7 cleanup: use p1() instead of parents() when we only need the first parent
Martin von Zweigbergk <martinvonz@google.com>
parents: 41397
diff changeset
1755 topmost = repo.dirstate.p1()
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1756 revs = between(repo, root, topmost, keep)
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1757 if not revs:
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
1758 raise error.InputError(
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
1759 _(b'%s is not an ancestor of working directory') % short(root)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1760 )
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1761
48215
d8cff8564f5a chistedit: rename a confusingly named variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 48214
diff changeset
1762 rules = []
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1763 for i, r in enumerate(revs):
48215
d8cff8564f5a chistedit: rename a confusingly named variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 48214
diff changeset
1764 rules.append(histeditrule(ui, repo[r], i))
45011
1bab6b61b62b curses: do not initialize LC_ALL to user settings (issue6358)
Manuel Jacob <me@manueljacob.de>
parents: 44661
diff changeset
1765 with util.with_lc_ctype():
48215
d8cff8564f5a chistedit: rename a confusingly named variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 48214
diff changeset
1766 rc = curses.wrapper(functools.partial(_chisteditmain, repo, rules))
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1767 curses.echo()
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1768 curses.endwin()
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1769 if rc is False:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1770 ui.write(_(b"histedit aborted\n"))
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1771 return 0
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1772 if type(rc) is list:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1773 ui.status(_(b"performing changes\n"))
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1774 rules = makecommands(rc)
43372
66a0c5faed1e py3: open chistedit file in binary mode using vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 43371
diff changeset
1775 with repo.vfs(b'chistedit', b'w+') as fp:
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1776 for r in rules:
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1777 fp.write(r)
44402
9b8e13a038db histedit: py3 fixes for curses mode
Steve Fink <sfink@mozilla.com>
parents: 43995
diff changeset
1778 opts[b'commands'] = fp.name
9b8e13a038db histedit: py3 fixes for curses mode
Steve Fink <sfink@mozilla.com>
parents: 43995
diff changeset
1779 return _texthistedit(ui, repo, freeargs, opts)
40602
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1780 except KeyboardInterrupt:
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1781 pass
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1782 return -1
c36175456350 histedit: import chistedit curses UI from hg-experimental
Augie Fackler <augie@google.com>
parents: 40366
diff changeset
1783
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1784
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1785 @command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1786 b'histedit',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1787 [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1788 (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1789 b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1790 b'commands',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1791 b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1792 _(b'read history edits from the specified file'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1793 _(b'FILE'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1794 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1795 (b'c', b'continue', False, _(b'continue an edit already in progress')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1796 (b'', b'edit-plan', False, _(b'edit remaining actions list')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1797 (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1798 b'k',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1799 b'keep',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1800 False,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1801 _(b"don't strip old nodes after edit is complete"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1802 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1803 (b'', b'abort', False, _(b'abort an edit in progress')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1804 (b'o', b'outgoing', False, _(b'changesets not found in destination')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1805 (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1806 b'f',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1807 b'force',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1808 False,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1809 _(b'force outgoing even for unrelated repositories'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1810 ),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1811 (b'r', b'rev', [], _(b'first revision to be edited'), _(b'REV')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1812 ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1813 + cmdutil.formatteropts,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1814 _(b"[OPTIONS] ([ANCESTOR] | --outgoing [URL])"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1815 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1816 )
19020
12c06686d371 histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19018
diff changeset
1817 def histedit(ui, repo, *freeargs, **opts):
17131
4fb2d3d16743 histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents: 17130
diff changeset
1818 """interactively edit changeset history
19621
11de0651d3b6 histedit: add description about basic histedit function to command help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19519
diff changeset
1819
27713
fb2c77ba577a histedit: explain basics of histedit commands
timeless <timeless@mozdev.org>
parents: 27712
diff changeset
1820 This command lets you edit a linear series of changesets (up to
fb2c77ba577a histedit: explain basics of histedit commands
timeless <timeless@mozdev.org>
parents: 27712
diff changeset
1821 and including the working directory, which should be clean).
27956
f3eb98b8fe12 doc: prevent non-literal text block from being treated as literal one
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27955
diff changeset
1822 You can:
27713
fb2c77ba577a histedit: explain basics of histedit commands
timeless <timeless@mozdev.org>
parents: 27712
diff changeset
1823
fb2c77ba577a histedit: explain basics of histedit commands
timeless <timeless@mozdev.org>
parents: 27712
diff changeset
1824 - `pick` to [re]order a changeset
fb2c77ba577a histedit: explain basics of histedit commands
timeless <timeless@mozdev.org>
parents: 27712
diff changeset
1825
fb2c77ba577a histedit: explain basics of histedit commands
timeless <timeless@mozdev.org>
parents: 27712
diff changeset
1826 - `drop` to omit changeset
fb2c77ba577a histedit: explain basics of histedit commands
timeless <timeless@mozdev.org>
parents: 27712
diff changeset
1827
fb2c77ba577a histedit: explain basics of histedit commands
timeless <timeless@mozdev.org>
parents: 27712
diff changeset
1828 - `mess` to reword the changeset commit message
fb2c77ba577a histedit: explain basics of histedit commands
timeless <timeless@mozdev.org>
parents: 27712
diff changeset
1829
31055
f1b63ec4b987 histedit: improve documentation and behaviour of dates
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 30983
diff changeset
1830 - `fold` to combine it with the preceding changeset (using the later date)
27713
fb2c77ba577a histedit: explain basics of histedit commands
timeless <timeless@mozdev.org>
parents: 27712
diff changeset
1831
31056
37ab9e20991c histedit: modify rollup to discard date from the rollup commit (issue4820)
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 31055
diff changeset
1832 - `roll` like fold, but discarding this commit's description and date
27713
fb2c77ba577a histedit: explain basics of histedit commands
timeless <timeless@mozdev.org>
parents: 27712
diff changeset
1833
31055
f1b63ec4b987 histedit: improve documentation and behaviour of dates
Ben Schmidt <insightfuls@users.noreply.github.com>
parents: 30983
diff changeset
1834 - `edit` to edit this changeset (preserving date)
19622
3d0ece7523c8 histedit: add description about "histedit --outgoing" to command help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19621
diff changeset
1835
34489
270e344a6c74 histedit: removing the experimental config 'histeditng'
Saurabh Singh <singhsrb@fb.com>
parents: 34475
diff changeset
1836 - `base` to checkout changeset and apply further changesets from there
270e344a6c74 histedit: removing the experimental config 'histeditng'
Saurabh Singh <singhsrb@fb.com>
parents: 34475
diff changeset
1837
27972
92a61d7618ac histedit: fix typo in documentation
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 27958
diff changeset
1838 There are a number of ways to select the root changeset:
27714
bbb61a8314c3 histedit: clarify modes
timeless <timeless@mozdev.org>
parents: 27713
diff changeset
1839
bbb61a8314c3 histedit: clarify modes
timeless <timeless@mozdev.org>
parents: 27713
diff changeset
1840 - Specify ANCESTOR directly
27262
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27217
diff changeset
1841
27714
bbb61a8314c3 histedit: clarify modes
timeless <timeless@mozdev.org>
parents: 27713
diff changeset
1842 - Use --outgoing -- it will be the first linear changeset not
28077
27ae22a4f9f9 doc: describe full help document hierarchy to create a valid link in HTML
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28004
diff changeset
1843 included in destination. (See :hg:`help config.paths.default-push`)
27714
bbb61a8314c3 histedit: clarify modes
timeless <timeless@mozdev.org>
parents: 27713
diff changeset
1844
bbb61a8314c3 histedit: clarify modes
timeless <timeless@mozdev.org>
parents: 27713
diff changeset
1845 - Otherwise, the value from the "histedit.defaultrev" config option
bbb61a8314c3 histedit: clarify modes
timeless <timeless@mozdev.org>
parents: 27713
diff changeset
1846 is used as a revset to select the base revision when ANCESTOR is not
bbb61a8314c3 histedit: clarify modes
timeless <timeless@mozdev.org>
parents: 27713
diff changeset
1847 specified. The first revision returned by the revset is used. By
bbb61a8314c3 histedit: clarify modes
timeless <timeless@mozdev.org>
parents: 27713
diff changeset
1848 default, this selects the editable history that is unique to the
bbb61a8314c3 histedit: clarify modes
timeless <timeless@mozdev.org>
parents: 27713
diff changeset
1849 ancestry of the working directory.
19842
1aaefba2a3a9 histedit: add more detailed help about "--outgoing"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19841
diff changeset
1850
27630
9358124b4a65 histedit: hide --outgoing warnings
timeless <timeless@mozdev.org>
parents: 27629
diff changeset
1851 .. container:: verbose
19842
1aaefba2a3a9 histedit: add more detailed help about "--outgoing"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19841
diff changeset
1852
27630
9358124b4a65 histedit: hide --outgoing warnings
timeless <timeless@mozdev.org>
parents: 27629
diff changeset
1853 If you use --outgoing, this command will abort if there are ambiguous
9358124b4a65 histedit: hide --outgoing warnings
timeless <timeless@mozdev.org>
parents: 27629
diff changeset
1854 outgoing revisions. For example, if there are multiple branches
9358124b4a65 histedit: hide --outgoing warnings
timeless <timeless@mozdev.org>
parents: 27629
diff changeset
1855 containing outgoing revisions.
9358124b4a65 histedit: hide --outgoing warnings
timeless <timeless@mozdev.org>
parents: 27629
diff changeset
1856
9358124b4a65 histedit: hide --outgoing warnings
timeless <timeless@mozdev.org>
parents: 27629
diff changeset
1857 Use "min(outgoing() and ::.)" or similar revset specification
9358124b4a65 histedit: hide --outgoing warnings
timeless <timeless@mozdev.org>
parents: 27629
diff changeset
1858 instead of --outgoing to specify edit target revision exactly in
9358124b4a65 histedit: hide --outgoing warnings
timeless <timeless@mozdev.org>
parents: 27629
diff changeset
1859 such ambiguous situation. See :hg:`help revsets` for detail about
9358124b4a65 histedit: hide --outgoing warnings
timeless <timeless@mozdev.org>
parents: 27629
diff changeset
1860 selecting revisions.
19972
1e13a5a9c66e histedit: add description about exit code
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19852
diff changeset
1861
27145
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1862 .. container:: verbose
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1863
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1864 Examples:
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1865
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1866 - A number of changes have been made.
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1867 Revision 3 is no longer needed.
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1868
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1869 Start history editing from revision 3::
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1870
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1871 hg histedit -r 3
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1872
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1873 An editor opens, containing the list of revisions,
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1874 with specific actions specified::
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1875
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1876 pick 5339bf82f0ca 3 Zworgle the foobar
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1877 pick 8ef592ce7cc4 4 Bedazzle the zerlog
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1878 pick 0a9639fcda9d 5 Morgify the cromulancy
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1879
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1880 Additional information about the possible actions
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1881 to take appears below the list of revisions.
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1882
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1883 To remove revision 3 from the history,
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1884 its action (at the beginning of the relevant line)
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1885 is changed to 'drop'::
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1886
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1887 drop 5339bf82f0ca 3 Zworgle the foobar
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1888 pick 8ef592ce7cc4 4 Bedazzle the zerlog
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1889 pick 0a9639fcda9d 5 Morgify the cromulancy
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1890
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1891 - A number of changes have been made.
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1892 Revision 2 and 4 need to be swapped.
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1893
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1894 Start history editing from revision 2::
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1895
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1896 hg histedit -r 2
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1897
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1898 An editor opens, containing the list of revisions,
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1899 with specific actions specified::
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1900
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1901 pick 252a1af424ad 2 Blorb a morgwazzle
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1902 pick 5339bf82f0ca 3 Zworgle the foobar
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1903 pick 8ef592ce7cc4 4 Bedazzle the zerlog
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1904
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1905 To swap revision 2 and 4, its lines are swapped
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1906 in the editor::
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1907
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1908 pick 8ef592ce7cc4 4 Bedazzle the zerlog
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1909 pick 5339bf82f0ca 3 Zworgle the foobar
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1910 pick 252a1af424ad 2 Blorb a morgwazzle
3a2fd83182fb histedit: add examples
Mathias De Maré <mathias.demare@gmail.com>
parents: 27086
diff changeset
1911
19972
1e13a5a9c66e histedit: add description about exit code
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19852
diff changeset
1912 Returns 0 on success, 1 if user intervention is required (not only
1e13a5a9c66e histedit: add description about exit code
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19852
diff changeset
1913 for intentional "edit" command, but also for resolving unexpected
1e13a5a9c66e histedit: add description about exit code
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19852
diff changeset
1914 conflicts).
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
1915 """
44402
9b8e13a038db histedit: py3 fixes for curses mode
Steve Fink <sfink@mozilla.com>
parents: 43995
diff changeset
1916 opts = pycompat.byteskwargs(opts)
9b8e13a038db histedit: py3 fixes for curses mode
Steve Fink <sfink@mozilla.com>
parents: 43995
diff changeset
1917
41175
9bc7ec924234 histedit: fix --continue and --abort when curses is enabled
Augie Fackler <augie@google.com>
parents: 41166
diff changeset
1918 # kludge: _chistedit only works for starting an edit, not aborting
9bc7ec924234 histedit: fix --continue and --abort when curses is enabled
Augie Fackler <augie@google.com>
parents: 41166
diff changeset
1919 # or continuing, so fall back to regular _texthistedit for those
9bc7ec924234 histedit: fix --continue and --abort when curses is enabled
Augie Fackler <augie@google.com>
parents: 41166
diff changeset
1920 # operations.
44429
24a3a9f7ea77 histedit: fix formatting after D8150
Martin von Zweigbergk <martinvonz@google.com>
parents: 44402
diff changeset
1921 if ui.interface(b'histedit') == b'curses' and _getgoal(opts) == goalnew:
44402
9b8e13a038db histedit: py3 fixes for curses mode
Steve Fink <sfink@mozilla.com>
parents: 43995
diff changeset
1922 return _chistedit(ui, repo, freeargs, opts)
9b8e13a038db histedit: py3 fixes for curses mode
Steve Fink <sfink@mozilla.com>
parents: 43995
diff changeset
1923 return _texthistedit(ui, repo, freeargs, opts)
9b8e13a038db histedit: py3 fixes for curses mode
Steve Fink <sfink@mozilla.com>
parents: 43995
diff changeset
1924
9b8e13a038db histedit: py3 fixes for curses mode
Steve Fink <sfink@mozilla.com>
parents: 43995
diff changeset
1925
9b8e13a038db histedit: py3 fixes for curses mode
Steve Fink <sfink@mozilla.com>
parents: 43995
diff changeset
1926 def _texthistedit(ui, repo, freeargs, opts):
22984
e0b5f5e3afe8 histedit: move locks into state
David Soria Parra <davidsp@fb.com>
parents: 22983
diff changeset
1927 state = histeditstate(repo)
41166
9365b8cb90e0 histedit: use context manager for locks
Martin von Zweigbergk <martinvonz@google.com>
parents: 41165
diff changeset
1928 with repo.wlock() as wlock, repo.lock() as lock:
9365b8cb90e0 histedit: use context manager for locks
Martin von Zweigbergk <martinvonz@google.com>
parents: 41165
diff changeset
1929 state.wlock = wlock
9365b8cb90e0 histedit: use context manager for locks
Martin von Zweigbergk <martinvonz@google.com>
parents: 41165
diff changeset
1930 state.lock = lock
44402
9b8e13a038db histedit: py3 fixes for curses mode
Steve Fink <sfink@mozilla.com>
parents: 43995
diff changeset
1931 _histedit(ui, repo, state, freeargs, opts)
20071
4778f398ec83 histedit: hold wlock and lock while in progress
Siddharth Agarwal <sid0@fb.com>
parents: 19972
diff changeset
1932
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1933
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1934 goalcontinue = b'continue'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1935 goalabort = b'abort'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1936 goaleditplan = b'edit-plan'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1937 goalnew = b'new'
28144
ed6d650b7cb7 histedit: change string literals to constants in goal naming
Kostia Balytskyi <ikostia@fb.com>
parents: 28134
diff changeset
1938
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1939
28134
df206e030c59 histedit: break _histedit function into smaller pieces
Kostia Balytskyi <ikostia@fb.com>
parents: 28133
diff changeset
1940 def _getgoal(opts):
41223
32ef47b3c91c histedit: fix call to _getgoal() by adding a byteskwargs() wrapper
Augie Fackler <augie@google.com>
parents: 41213
diff changeset
1941 if opts.get(b'continue'):
28144
ed6d650b7cb7 histedit: change string literals to constants in goal naming
Kostia Balytskyi <ikostia@fb.com>
parents: 28134
diff changeset
1942 return goalcontinue
41223
32ef47b3c91c histedit: fix call to _getgoal() by adding a byteskwargs() wrapper
Augie Fackler <augie@google.com>
parents: 41213
diff changeset
1943 if opts.get(b'abort'):
28144
ed6d650b7cb7 histedit: change string literals to constants in goal naming
Kostia Balytskyi <ikostia@fb.com>
parents: 28134
diff changeset
1944 return goalabort
41223
32ef47b3c91c histedit: fix call to _getgoal() by adding a byteskwargs() wrapper
Augie Fackler <augie@google.com>
parents: 41213
diff changeset
1945 if opts.get(b'edit_plan'):
28144
ed6d650b7cb7 histedit: change string literals to constants in goal naming
Kostia Balytskyi <ikostia@fb.com>
parents: 28134
diff changeset
1946 return goaleditplan
ed6d650b7cb7 histedit: change string literals to constants in goal naming
Kostia Balytskyi <ikostia@fb.com>
parents: 28134
diff changeset
1947 return goalnew
28134
df206e030c59 histedit: break _histedit function into smaller pieces
Kostia Balytskyi <ikostia@fb.com>
parents: 28133
diff changeset
1948
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1949
30262
bc5d0e6fd9f3 histedit: use ui.fin to read commands from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 30025
diff changeset
1950 def _readfile(ui, path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1951 if path == b'-':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1952 with ui.timeblockedsection(b'histedit'):
30983
d4825798818b histedit: log the time taken to read in the commands list
Simon Farnsworth <simonfar@fb.com>
parents: 30848
diff changeset
1953 return ui.fin.read()
28550
e2b9145e35d8 histedit: do not close stdin
Jun Wu <quark@fb.com>
parents: 28519
diff changeset
1954 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1955 with open(path, b'rb') as f:
28550
e2b9145e35d8 histedit: do not close stdin
Jun Wu <quark@fb.com>
parents: 28519
diff changeset
1956 return f.read()
e2b9145e35d8 histedit: do not close stdin
Jun Wu <quark@fb.com>
parents: 28519
diff changeset
1957
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1958
48053
6256c7525222 histedit: remove redundant checks for unfinished histedit state
Martin von Zweigbergk <martinvonz@google.com>
parents: 47437
diff changeset
1959 def _validateargs(ui, repo, freeargs, opts, goal, rules, revs):
27169
dd214130a4f6 histedit: improve grammar for _histedit comment
timeless <timeless@mozdev.org>
parents: 27154
diff changeset
1960 # TODO only abort if we try to histedit mq patches, not just
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
1961 # blanket if mq patches are applied somewhere
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
1962 mq = getattr(repo, 'mq', None)
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
1963 if mq and mq.applied:
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
1964 raise error.StateError(_(b'source has mq patches applied'))
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
1965
19020
12c06686d371 histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19018
diff changeset
1966 # basic argument incompatibility processing
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1967 outg = opts.get(b'outgoing')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1968 editplan = opts.get(b'edit_plan')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1969 abort = opts.get(b'abort')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1970 force = opts.get(b'force')
19020
12c06686d371 histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19018
diff changeset
1971 if force and not outg:
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
1972 raise error.InputError(_(b'--force only allowed with --outgoing'))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1973 if goal == b'continue':
25149
3f0744eeaeaf cleanup: use __builtins__.any instead of util.any
Augie Fackler <augie@google.com>
parents: 24959
diff changeset
1974 if any((outg, abort, revs, freeargs, rules, editplan)):
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
1975 raise error.InputError(_(b'no arguments allowed with --continue'))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1976 elif goal == b'abort':
25149
3f0744eeaeaf cleanup: use __builtins__.any instead of util.any
Augie Fackler <augie@google.com>
parents: 24959
diff changeset
1977 if any((outg, revs, freeargs, rules, editplan)):
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
1978 raise error.InputError(_(b'no arguments allowed with --abort'))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1979 elif goal == b'edit-plan':
25149
3f0744eeaeaf cleanup: use __builtins__.any instead of util.any
Augie Fackler <augie@google.com>
parents: 24959
diff changeset
1980 if any((outg, revs, freeargs)):
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
1981 raise error.InputError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
1982 _(b'only --commands argument allowed with --edit-plan')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1983 )
19020
12c06686d371 histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19018
diff changeset
1984 else:
12c06686d371 histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19018
diff changeset
1985 if outg:
12c06686d371 histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19018
diff changeset
1986 if revs:
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
1987 raise error.InputError(
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
1988 _(b'no revisions allowed with --outgoing')
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
1989 )
19020
12c06686d371 histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19018
diff changeset
1990 if len(freeargs) > 1:
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
1991 raise error.InputError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1992 _(b'only one repo argument allowed with --outgoing')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
1993 )
19020
12c06686d371 histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19018
diff changeset
1994 else:
19021
26b41a902195 histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19020
diff changeset
1995 revs.extend(freeargs)
24009
00d331763442 histedit: allow configuring default behavior
Durham Goode <durham@fb.com>
parents: 24002
diff changeset
1996 if len(revs) == 0:
27262
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27217
diff changeset
1997 defaultrev = destutil.desthistedit(ui, repo)
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27217
diff changeset
1998 if defaultrev is not None:
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27217
diff changeset
1999 revs.append(defaultrev)
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27217
diff changeset
2000
19021
26b41a902195 histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19020
diff changeset
2001 if len(revs) != 1:
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
2002 raise error.InputError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2003 _(b'histedit requires exactly one ancestor revision')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2004 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2005
19020
12c06686d371 histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19018
diff changeset
2006
44402
9b8e13a038db histedit: py3 fixes for curses mode
Steve Fink <sfink@mozilla.com>
parents: 43995
diff changeset
2007 def _histedit(ui, repo, state, freeargs, opts):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2008 fm = ui.formatter(b'histedit', opts)
35126
a9cc233de513 histedit: add support to output nodechanges using formatter
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34999
diff changeset
2009 fm.startitem()
28134
df206e030c59 histedit: break _histedit function into smaller pieces
Kostia Balytskyi <ikostia@fb.com>
parents: 28133
diff changeset
2010 goal = _getgoal(opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2011 revs = opts.get(b'rev', [])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2012 nobackup = not ui.configbool(b'rewrite', b'backup-bundle')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2013 rules = opts.get(b'commands', b'')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2014 state.keep = opts.get(b'keep', False)
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
2015
48053
6256c7525222 histedit: remove redundant checks for unfinished histedit state
Martin von Zweigbergk <martinvonz@google.com>
parents: 47437
diff changeset
2016 _validateargs(ui, repo, freeargs, opts, goal, rules, revs)
22977
29ae3b190ec5 histedit: use state object where necessary
David Soria Parra <davidsp@fb.com>
parents: 22976
diff changeset
2017
41103
86f0ed7ac688 histedit: add warning message on editing tagged commits (issue4017)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 40652
diff changeset
2018 hastags = False
86f0ed7ac688 histedit: add warning message on editing tagged commits (issue4017)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 40652
diff changeset
2019 if revs:
48116
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48054
diff changeset
2020 revs = logcmdutil.revrange(repo, revs)
41103
86f0ed7ac688 histedit: add warning message on editing tagged commits (issue4017)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 40652
diff changeset
2021 ctxs = [repo[rev] for rev in revs]
86f0ed7ac688 histedit: add warning message on editing tagged commits (issue4017)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 40652
diff changeset
2022 for ctx in ctxs:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2023 tags = [tag for tag in ctx.tags() if tag != b'tip']
41103
86f0ed7ac688 histedit: add warning message on editing tagged commits (issue4017)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 40652
diff changeset
2024 if not hastags:
86f0ed7ac688 histedit: add warning message on editing tagged commits (issue4017)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 40652
diff changeset
2025 hastags = len(tags)
86f0ed7ac688 histedit: add warning message on editing tagged commits (issue4017)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 40652
diff changeset
2026 if hastags:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2027 if ui.promptchoice(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2028 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2029 b'warning: tags associated with the given'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2030 b' changeset will be lost after histedit.\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2031 b'do you want to continue (yN)? $$ &Yes $$ &No'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2032 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2033 default=1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2034 ):
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
2035 raise error.CanceledError(_(b'histedit cancelled\n'))
22977
29ae3b190ec5 histedit: use state object where necessary
David Soria Parra <davidsp@fb.com>
parents: 22976
diff changeset
2036 # rebuild state
28144
ed6d650b7cb7 histedit: change string literals to constants in goal naming
Kostia Balytskyi <ikostia@fb.com>
parents: 28134
diff changeset
2037 if goal == goalcontinue:
22983
a3a981563ce8 histedit: read state from histeditstate
David Soria Parra <davidsp@fb.com>
parents: 22982
diff changeset
2038 state.read()
22980
b3483bc1ec8c histedit: pass state to boostrapcontinue
David Soria Parra <davidsp@fb.com>
parents: 22979
diff changeset
2039 state = bootstrapcontinue(ui, state, opts)
28144
ed6d650b7cb7 histedit: change string literals to constants in goal naming
Kostia Balytskyi <ikostia@fb.com>
parents: 28134
diff changeset
2040 elif goal == goaleditplan:
28154
47f56b6bfed1 histedit: renaming parts to which _histedit was split
Kostia Balytskyi <ikostia@fb.com>
parents: 28153
diff changeset
2041 _edithisteditplan(ui, repo, state, rules)
24142
be7cb25186be histedit: add --edit-plan option to histedit
Mateusz Kwapich <mitrandir@fb.com>
parents: 24141
diff changeset
2042 return
28144
ed6d650b7cb7 histedit: change string literals to constants in goal naming
Kostia Balytskyi <ikostia@fb.com>
parents: 28134
diff changeset
2043 elif goal == goalabort:
38548
7b57b1ed5c0f histedit: add --no-backup option (issue5825)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38508
diff changeset
2044 _aborthistedit(ui, repo, state, nobackup=nobackup)
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
2045 return
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
2046 else:
28144
ed6d650b7cb7 histedit: change string literals to constants in goal naming
Kostia Balytskyi <ikostia@fb.com>
parents: 28134
diff changeset
2047 # goal == goalnew
28154
47f56b6bfed1 histedit: renaming parts to which _histedit was split
Kostia Balytskyi <ikostia@fb.com>
parents: 28153
diff changeset
2048 _newhistedit(ui, repo, state, revs, freeargs, opts)
24757
7b59f16174c5 histedit: store backup file before histedit
Durham Goode <durham@fb.com>
parents: 24756
diff changeset
2049
28154
47f56b6bfed1 histedit: renaming parts to which _histedit was split
Kostia Balytskyi <ikostia@fb.com>
parents: 28153
diff changeset
2050 _continuehistedit(ui, repo, state)
35126
a9cc233de513 histedit: add support to output nodechanges using formatter
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34999
diff changeset
2051 _finishhistedit(ui, repo, state, fm)
a9cc233de513 histedit: add support to output nodechanges using formatter
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34999
diff changeset
2052 fm.end()
28133
8fc55388ece5 histedit: break _histedit function into smaller pieces (add _continueaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28132
diff changeset
2053
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2054
28154
47f56b6bfed1 histedit: renaming parts to which _histedit was split
Kostia Balytskyi <ikostia@fb.com>
parents: 28153
diff changeset
2055 def _continuehistedit(ui, repo, state):
47f56b6bfed1 histedit: renaming parts to which _histedit was split
Kostia Balytskyi <ikostia@fb.com>
parents: 28153
diff changeset
2056 """This function runs after either:
28133
8fc55388ece5 histedit: break _histedit function into smaller pieces (add _continueaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28132
diff changeset
2057 - bootstrapcontinue (if the goal is 'continue')
28154
47f56b6bfed1 histedit: renaming parts to which _histedit was split
Kostia Balytskyi <ikostia@fb.com>
parents: 28153
diff changeset
2058 - _newhistedit (if the goal is 'new')
28133
8fc55388ece5 histedit: break _histedit function into smaller pieces (add _continueaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28132
diff changeset
2059 """
26246
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
2060 # preprocess rules so that we can hide inner folds from the user
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
2061 # and only show one editor
27207
2d8dbeb2462c histedit: change state.rules uses to state.actions
Mateusz Kwapich <mitrandir@fb.com>
parents: 27206
diff changeset
2062 actions = state.actions[:]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2063 for idx, (action, nextact) in enumerate(zip(actions, actions[1:] + [None])):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2064 if action.verb == b'fold' and nextact and nextact.verb == b'fold':
27207
2d8dbeb2462c histedit: change state.rules uses to state.actions
Mateusz Kwapich <mitrandir@fb.com>
parents: 27206
diff changeset
2065 state.actions[idx].__class__ = _multifold
26246
bf81b696b8f4 histedit: use one editor when multiple folds happen in a row (issue3524) (BC)
Augie Fackler <augie@google.com>
parents: 26203
diff changeset
2066
31513
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
2067 # Force an initial state file write, so the user can run --abort/continue
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
2068 # even if there's an exception before the first transaction serialize.
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
2069 state.write()
33445
0491004e2233 histedit: create transaction outside of try
Martin von Zweigbergk <martinvonz@google.com>
parents: 33444
diff changeset
2070
0491004e2233 histedit: create transaction outside of try
Martin von Zweigbergk <martinvonz@google.com>
parents: 33444
diff changeset
2071 tr = None
0491004e2233 histedit: create transaction outside of try
Martin von Zweigbergk <martinvonz@google.com>
parents: 33444
diff changeset
2072 # Don't use singletransaction by default since it rolls the entire
0491004e2233 histedit: create transaction outside of try
Martin von Zweigbergk <martinvonz@google.com>
parents: 33444
diff changeset
2073 # transaction back if an unexpected exception happens (like a
0491004e2233 histedit: create transaction outside of try
Martin von Zweigbergk <martinvonz@google.com>
parents: 33444
diff changeset
2074 # pretxncommit hook throws, or the user aborts the commit msg editor).
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2075 if ui.configbool(b"histedit", b"singletransaction"):
33445
0491004e2233 histedit: create transaction outside of try
Martin von Zweigbergk <martinvonz@google.com>
parents: 33444
diff changeset
2076 # Don't use a 'with' for the transaction, since actions may close
0491004e2233 histedit: create transaction outside of try
Martin von Zweigbergk <martinvonz@google.com>
parents: 33444
diff changeset
2077 # and reopen a transaction. For example, if the action executes an
0491004e2233 histedit: create transaction outside of try
Martin von Zweigbergk <martinvonz@google.com>
parents: 33444
diff changeset
2078 # external process it may choose to commit the transaction first.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2079 tr = repo.transaction(b'histedit')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2080 progress = ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2081 _(b"editing"), unit=_(b'changes'), total=len(state.actions)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2082 )
38378
e5d87c69bbcb histedit: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 37678
diff changeset
2083 with progress, util.acceptintervention(tr):
31513
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
2084 while state.actions:
33444
c4e39512a661 histedit: remove transaction from state object
Martin von Zweigbergk <martinvonz@google.com>
parents: 33351
diff changeset
2085 state.write(tr=tr)
31513
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
2086 actobj = state.actions[0]
38378
e5d87c69bbcb histedit: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 37678
diff changeset
2087 progress.increment(item=actobj.torule())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2088 ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2089 b'histedit: processing %s %s\n' % (actobj.verb, actobj.torule())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2090 )
31513
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
2091 parentctx, replacement_ = actobj.run()
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
2092 state.parentctxnode = parentctx.node()
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
2093 state.replacements.extend(replacement_)
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
2094 state.actions.pop(0)
68474b72ea63 histedit: add histedit.singletransaction config option
Durham Goode <durham@fb.com>
parents: 31512
diff changeset
2095
24111
11d72683f3de histedit: don't allow to strip nodes which are necessary to continue histedit
Mateusz Kwapich <mitrandir@fb.com>
parents: 24009
diff changeset
2096 state.write()
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
2097
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2098
35126
a9cc233de513 histedit: add support to output nodechanges using formatter
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34999
diff changeset
2099 def _finishhistedit(ui, repo, state, fm):
28153
17c474fdb225 histedit: break _histedit into smaller pieces (add _finishaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28144
diff changeset
2100 """This action runs when histedit is finishing its session"""
45577
5c8230ca37f2 merge: replace calls to hg.updaterepo() by merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45450
diff changeset
2101 mergemod.update(repo[state.parentctxnode])
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
2102
22985
0c14b9166da6 histedit: remove now-superfluous repo argument from processreplacement
Augie Fackler <raf@durin42.com>
parents: 22984
diff changeset
2103 mapping, tmpnodes, created, ntm = processreplacement(state)
17758
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2104 if mapping:
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
2105 for prec, succs in pycompat.iteritems(mapping):
17758
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2106 if not succs:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
2107 ui.debug(b'histedit: %s is dropped\n' % short(prec))
17758
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2108 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2109 ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2110 b'histedit: %s is replaced by %s\n'
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
2111 % (short(prec), short(succs[0]))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2112 )
17758
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2113 if len(succs) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2114 m = b'histedit: %s'
17758
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2115 for n in succs[1:]:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
2116 ui.debug(m % short(n))
17758
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2117
25330
8594d0b3018e histedit: fix keep during --continue
Durham Goode <durham@fb.com>
parents: 24959
diff changeset
2118 if not state.keep:
17758
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2119 if mapping:
33351
154298576d44 histedit: use scmutil.cleanupnodes (BC)
Jun Wu <quark@fb.com>
parents: 33350
diff changeset
2120 movetopmostbookmarks(repo, state.topmost, ntm)
17663
c6de8c696644 histedit: extract bookmark logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17662
diff changeset
2121 # TODO update mq state
33350
b320ff822c7e histedit: unify strip backup files on success (BC)
Jun Wu <quark@fb.com>
parents: 33349
diff changeset
2122 else:
b320ff822c7e histedit: unify strip backup files on success (BC)
Jun Wu <quark@fb.com>
parents: 33349
diff changeset
2123 mapping = {}
b320ff822c7e histedit: unify strip backup files on success (BC)
Jun Wu <quark@fb.com>
parents: 33349
diff changeset
2124
b320ff822c7e histedit: unify strip backup files on success (BC)
Jun Wu <quark@fb.com>
parents: 33349
diff changeset
2125 for n in tmpnodes:
39914
b153ca77a52b histedit: don't cleanup nodes already disposed of
Boris Feld <boris.feld@octobus.net>
parents: 38786
diff changeset
2126 if n in repo:
b153ca77a52b histedit: don't cleanup nodes already disposed of
Boris Feld <boris.feld@octobus.net>
parents: 38786
diff changeset
2127 mapping[n] = ()
33350
b320ff822c7e histedit: unify strip backup files on success (BC)
Jun Wu <quark@fb.com>
parents: 33349
diff changeset
2128
33351
154298576d44 histedit: use scmutil.cleanupnodes (BC)
Jun Wu <quark@fb.com>
parents: 33350
diff changeset
2129 # remove entries about unknown nodes
43547
2b5d07702f94 index: use `index.has_node` in `histedit._finishhistedit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
2130 has_node = repo.unfiltered().changelog.index.has_node
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2131 mapping = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2132 k: v
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2133 for k, v in mapping.items()
43547
2b5d07702f94 index: use `index.has_node` in `histedit._finishhistedit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
2134 if has_node(k) and all(has_node(n) for n in v)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2135 }
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2136 scmutil.cleanupnodes(repo, mapping, b'histedit')
35126
a9cc233de513 histedit: add support to output nodechanges using formatter
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34999
diff changeset
2137 hf = fm.hexfunc
a9cc233de513 histedit: add support to output nodechanges using formatter
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34999
diff changeset
2138 fl = fm.formatlist
a9cc233de513 histedit: add support to output nodechanges using formatter
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34999
diff changeset
2139 fd = fm.formatdict
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2140 nodechanges = fd(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2141 {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2142 hf(oldn): fl([hf(n) for n in newn], name=b'node')
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
2143 for oldn, newn in pycompat.iteritems(mapping)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2144 },
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2145 key=b"oldnode",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2146 value=b"newnodes",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2147 )
35126
a9cc233de513 histedit: add support to output nodechanges using formatter
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34999
diff changeset
2148 fm.data(nodechanges=nodechanges)
25894
54f9561088c7 histedit: backout ebb5bb9bc32e
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25824
diff changeset
2149
22978
d4e764521249 histedit: add clear method to remove state
David Soria Parra <davidsp@fb.com>
parents: 22977
diff changeset
2150 state.clear()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2151 if os.path.exists(repo.sjoin(b'undo')):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2152 os.unlink(repo.sjoin(b'undo'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2153 if repo.vfs.exists(b'histedit-last-edit.txt'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2154 repo.vfs.unlink(b'histedit-last-edit.txt')
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
2155
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2156
38548
7b57b1ed5c0f histedit: add --no-backup option (issue5825)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38508
diff changeset
2157 def _aborthistedit(ui, repo, state, nobackup=False):
28130
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2158 try:
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2159 state.read()
28179
2e11f6756d9c histedit: unifying the way replacements are computed for abort and success
Kostia Balytskyi <ikostia@fb.com>
parents: 28154
diff changeset
2160 __, leafs, tmpnodes, __ = processreplacement(state)
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
2161 ui.debug(b'restore wc to old parent %s\n' % short(state.topmost))
28130
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2162
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2163 # Recover our old commits if necessary
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2164 if not state.topmost in repo and state.backupfile:
31329
6ce67d3941fc histedit: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31056
diff changeset
2165 backupfile = repo.vfs.join(state.backupfile)
28130
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2166 f = hg.openpath(ui, backupfile)
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2167 gen = exchange.readbundle(ui, f, backupfile)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2168 with repo.transaction(b'histedit.abort') as tr:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2169 bundle2.applybundle(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2170 repo,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2171 gen,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2172 tr,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2173 source=b'histedit',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2174 url=b'bundle:' + backupfile,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2175 )
28130
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2176
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2177 os.remove(backupfile)
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2178
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2179 # check whether we should update away
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2180 if repo.unfiltered().revs(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2181 b'parents() and (%n or %ln::)',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2182 state.parentctxnode,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2183 leafs | tmpnodes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2184 ):
28130
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2185 hg.clean(repo, state.topmost, show_stats=True, quietempty=True)
38548
7b57b1ed5c0f histedit: add --no-backup option (issue5825)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38508
diff changeset
2186 cleanupnode(ui, repo, tmpnodes, nobackup=nobackup)
7b57b1ed5c0f histedit: add --no-backup option (issue5825)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38508
diff changeset
2187 cleanupnode(ui, repo, leafs, nobackup=nobackup)
28130
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2188 except Exception:
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2189 if state.inprogress():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2190 ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2191 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2192 b'warning: encountered an exception during histedit '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2193 b'--abort; the repository may not have been completely '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2194 b'cleaned up\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2195 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2196 )
28130
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2197 raise
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2198 finally:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2199 state.clear()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2200
28130
47317570ab8c histedit: break _histedit function into smaller pieces (add _abortaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28123
diff changeset
2201
42584
db5560c07a28 abort: added support for histedit
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
2202 def hgaborthistedit(ui, repo):
db5560c07a28 abort: added support for histedit
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
2203 state = histeditstate(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2204 nobackup = not ui.configbool(b'rewrite', b'backup-bundle')
42584
db5560c07a28 abort: added support for histedit
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
2205 with repo.wlock() as wlock, repo.lock() as lock:
db5560c07a28 abort: added support for histedit
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
2206 state.wlock = wlock
db5560c07a28 abort: added support for histedit
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
2207 state.lock = lock
db5560c07a28 abort: added support for histedit
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
2208 _aborthistedit(ui, repo, state, nobackup=nobackup)
db5560c07a28 abort: added support for histedit
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
2209
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2210
28154
47f56b6bfed1 histedit: renaming parts to which _histedit was split
Kostia Balytskyi <ikostia@fb.com>
parents: 28153
diff changeset
2211 def _edithisteditplan(ui, repo, state, rules):
28131
5a2fb2680a39 histedit: break _histedit function into smaller pieces (add _editplanaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28130
diff changeset
2212 state.read()
5a2fb2680a39 histedit: break _histedit function into smaller pieces (add _editplanaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28130
diff changeset
2213 if not rules:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2214 comment = geteditcomment(
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
2215 ui, short(state.parentctxnode), short(state.topmost)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2216 )
28131
5a2fb2680a39 histedit: break _histedit function into smaller pieces (add _editplanaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28130
diff changeset
2217 rules = ruleeditor(repo, ui, state.actions, comment)
5a2fb2680a39 histedit: break _histedit function into smaller pieces (add _editplanaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28130
diff changeset
2218 else:
30262
bc5d0e6fd9f3 histedit: use ui.fin to read commands from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 30025
diff changeset
2219 rules = _readfile(ui, rules)
28131
5a2fb2680a39 histedit: break _histedit function into smaller pieces (add _editplanaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28130
diff changeset
2220 actions = parserules(rules, state)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2221 ctxs = [repo[act.node] for act in state.actions if act.node]
28131
5a2fb2680a39 histedit: break _histedit function into smaller pieces (add _editplanaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28130
diff changeset
2222 warnverifyactions(ui, repo, actions, state, ctxs)
5a2fb2680a39 histedit: break _histedit function into smaller pieces (add _editplanaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28130
diff changeset
2223 state.actions = actions
5a2fb2680a39 histedit: break _histedit function into smaller pieces (add _editplanaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28130
diff changeset
2224 state.write()
5a2fb2680a39 histedit: break _histedit function into smaller pieces (add _editplanaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28130
diff changeset
2225
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2226
28154
47f56b6bfed1 histedit: renaming parts to which _histedit was split
Kostia Balytskyi <ikostia@fb.com>
parents: 28153
diff changeset
2227 def _newhistedit(ui, repo, state, revs, freeargs, opts):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2228 outg = opts.get(b'outgoing')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2229 rules = opts.get(b'commands', b'')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2230 force = opts.get(b'force')
28132
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2231
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2232 cmdutil.checkunfinished(repo)
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2233 cmdutil.bailifchanged(repo)
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2234
41399
5cb8158a61f7 cleanup: use p1() instead of parents() when we only need the first parent
Martin von Zweigbergk <martinvonz@google.com>
parents: 41397
diff changeset
2235 topmost = repo.dirstate.p1()
28132
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2236 if outg:
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2237 if freeargs:
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2238 remote = freeargs[0]
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2239 else:
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2240 remote = None
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2241 root = findoutgoing(ui, repo, remote, force, opts)
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2242 else:
48116
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48054
diff changeset
2243 rr = list(repo.set(b'roots(%ld)', logcmdutil.revrange(repo, revs)))
28132
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2244 if len(rr) != 1:
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
2245 raise error.InputError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2246 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2247 b'The specified revisions must have '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2248 b'exactly one common root'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2249 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2250 )
28132
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2251 root = rr[0].node()
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2252
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2253 revs = between(repo, root, topmost, state.keep)
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2254 if not revs:
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
2255 raise error.InputError(
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
2256 _(b'%s is not an ancestor of working directory') % short(root)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2257 )
28132
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2258
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2259 ctxs = [repo[r] for r in revs]
42977
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2260
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2261 wctx = repo[None]
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2262 # Please don't ask me why `ancestors` is this value. I figured it
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2263 # out with print-debugging, not by actually understanding what the
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2264 # merge code is doing. :(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2265 ancs = [repo[b'.']]
42977
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2266 # Sniff-test to make sure we won't collide with untracked files in
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2267 # the working directory. If we don't do this, we can get a
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2268 # collision after we've started histedit and backing out gets ugly
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2269 # for everyone, especially the user.
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2270 for c in [ctxs[0].p1()] + ctxs:
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2271 try:
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2272 mergemod.calculateupdates(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2273 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2274 wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2275 c,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2276 ancs,
42977
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2277 # These parameters were determined by print-debugging
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2278 # what happens later on inside histedit.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2279 branchmerge=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2280 force=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2281 acceptremote=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2282 followcopies=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2283 )
42977
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2284 except error.Abort:
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
2285 raise error.StateError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2286 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2287 b"untracked files in working directory conflict with files in %s"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2288 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2289 % c
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2290 )
42977
699102b10530 histedit: sniff-test for untracked file conflicts before prompting for rules
Augie Fackler <augie@google.com>
parents: 42659
diff changeset
2291
28132
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2292 if not rules:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
2293 comment = geteditcomment(ui, short(root), short(topmost))
28132
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2294 actions = [pick(state, r) for r in revs]
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2295 rules = ruleeditor(repo, ui, actions, comment)
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2296 else:
30262
bc5d0e6fd9f3 histedit: use ui.fin to read commands from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 30025
diff changeset
2297 rules = _readfile(ui, rules)
28132
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2298 actions = parserules(rules, state)
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2299 warnverifyactions(ui, repo, actions, state, ctxs)
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2300
41397
0bd56c291359 cleanup: use p1() and p2() instead of parents()[0] and parents()[1]
Martin von Zweigbergk <martinvonz@google.com>
parents: 41223
diff changeset
2301 parentctxnode = repo[root].p1().node()
28132
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2302
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2303 state.parentctxnode = parentctxnode
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2304 state.actions = actions
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2305 state.topmost = topmost
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2306 state.replacements = []
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2307
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2308 ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2309 b"histedit",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2310 b"%d actions to histedit\n",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2311 len(actions),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2312 histedit_num_actions=len(actions),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2313 )
35490
784a85c87c22 histedit: add ui.log for action count
Phil Cohen <phillco@fb.com>
parents: 35414
diff changeset
2314
28132
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2315 # Create a backup so we can always abort completely.
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2316 backupfile = None
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2317 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2318 backupfile = repair.backupbundle(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2319 repo, [parentctxnode], [topmost], root, b'histedit'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2320 )
28132
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2321 state.backupfile = backupfile
2d09a400b495 histedit: break _histedit function into smaller pieces (add _newaction)
Kostia Balytskyi <ikostia@fb.com>
parents: 28131
diff changeset
2322
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2323
29467
4c4232e51167 histedit: extract common summary code into method
Sean Farley <sean@farley.io>
parents: 29466
diff changeset
2324 def _getsummary(ctx):
4c4232e51167 histedit: extract common summary code into method
Sean Farley <sean@farley.io>
parents: 29466
diff changeset
2325 # a common pattern is to extract the summary but default to the empty
4c4232e51167 histedit: extract common summary code into method
Sean Farley <sean@farley.io>
parents: 29466
diff changeset
2326 # string
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2327 summary = ctx.description() or b''
29467
4c4232e51167 histedit: extract common summary code into method
Sean Farley <sean@farley.io>
parents: 29466
diff changeset
2328 if summary:
4c4232e51167 histedit: extract common summary code into method
Sean Farley <sean@farley.io>
parents: 29466
diff changeset
2329 summary = summary.splitlines()[0]
4c4232e51167 histedit: extract common summary code into method
Sean Farley <sean@farley.io>
parents: 29466
diff changeset
2330 return summary
4c4232e51167 histedit: extract common summary code into method
Sean Farley <sean@farley.io>
parents: 29466
diff changeset
2331
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2332
24774
a9d63d87b837 histedit: delete all non-actionclass related code
Durham Goode <durham@fb.com>
parents: 24773
diff changeset
2333 def bootstrapcontinue(ui, state, opts):
a9d63d87b837 histedit: delete all non-actionclass related code
Durham Goode <durham@fb.com>
parents: 24773
diff changeset
2334 repo = state.repo
32057
e5ffc91a2276 histedit: make check for unresolved conflicts explicit (issue5545)
Siddharth Agarwal <sid0@fb.com>
parents: 31638
diff changeset
2335
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44661
diff changeset
2336 ms = mergestatemod.mergestate.read(repo)
32057
e5ffc91a2276 histedit: make check for unresolved conflicts explicit (issue5545)
Siddharth Agarwal <sid0@fb.com>
parents: 31638
diff changeset
2337 mergeutil.checkunresolved(ms)
e5ffc91a2276 histedit: make check for unresolved conflicts explicit (issue5545)
Siddharth Agarwal <sid0@fb.com>
parents: 31638
diff changeset
2338
27207
2d8dbeb2462c histedit: change state.rules uses to state.actions
Mateusz Kwapich <mitrandir@fb.com>
parents: 27206
diff changeset
2339 if state.actions:
2d8dbeb2462c histedit: change state.rules uses to state.actions
Mateusz Kwapich <mitrandir@fb.com>
parents: 27206
diff changeset
2340 actobj = state.actions.pop(0)
24959
3c762cceedde histedit: fix --continue when rules are finished
Durham Goode <durham@fb.com>
parents: 24958
diff changeset
2341
26981
cda2e980281e histedit: extracts _isdirtywc function
liscju <piotr.listkiewicz@gmail.com>
parents: 26798
diff changeset
2342 if _isdirtywc(repo):
24959
3c762cceedde histedit: fix --continue when rules are finished
Durham Goode <durham@fb.com>
parents: 24958
diff changeset
2343 actobj.continuedirty()
26981
cda2e980281e histedit: extracts _isdirtywc function
liscju <piotr.listkiewicz@gmail.com>
parents: 26798
diff changeset
2344 if _isdirtywc(repo):
27084
383f10b67fd6 histedit: add abortdirty function
Mateusz Kwapich <mitrandir@fb.com>
parents: 27083
diff changeset
2345 abortdirty()
24766
cfb8f5e3ca49 histedit: integrate action class into flow
Durham Goode <durham@fb.com>
parents: 24765
diff changeset
2346
24959
3c762cceedde histedit: fix --continue when rules are finished
Durham Goode <durham@fb.com>
parents: 24958
diff changeset
2347 parentctx, replacements = actobj.continueclean()
17666
5b6c8f2fbda5 histedit: move `continue` logic into a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17665
diff changeset
2348
24959
3c762cceedde histedit: fix --continue when rules are finished
Durham Goode <durham@fb.com>
parents: 24958
diff changeset
2349 state.parentctxnode = parentctx.node()
3c762cceedde histedit: fix --continue when rules are finished
Durham Goode <durham@fb.com>
parents: 24958
diff changeset
2350 state.replacements.extend(replacements)
22980
b3483bc1ec8c histedit: pass state to boostrapcontinue
David Soria Parra <davidsp@fb.com>
parents: 22979
diff changeset
2351
b3483bc1ec8c histedit: pass state to boostrapcontinue
David Soria Parra <davidsp@fb.com>
parents: 22979
diff changeset
2352 return state
17666
5b6c8f2fbda5 histedit: move `continue` logic into a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17665
diff changeset
2353
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2354
17642
bea381c16809 histedit: move `between function` outside the action logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17641
diff changeset
2355 def between(repo, old, new, keep):
bea381c16809 histedit: move `between function` outside the action logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17641
diff changeset
2356 """select and validate the set of revision to edit
bea381c16809 histedit: move `between function` outside the action logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17641
diff changeset
2357
bea381c16809 histedit: move `between function` outside the action logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17641
diff changeset
2358 When keep is false, the specified set can't have children."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2359 revs = repo.revs(b'%n::%n', old, new)
36413
f493829b74dd histedit: use repo.revs() instead of repo.set() where revisions are needed
Yuya Nishihara <yuya@tcha.org>
parents: 36409
diff changeset
2360 if revs and not keep:
43933
bde97bee321f histedit: use rewriteutil.precheck() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43793
diff changeset
2361 rewriteutil.precheck(repo, revs, b'edit')
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2362 if repo.revs(b'(%ld) and merge()', revs):
48054
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
2363 raise error.StateError(
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
2364 _(b'cannot edit history that contains merges')
f27a83399abb histedit: use more specific exceptions for more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 48053
diff changeset
2365 )
36413
f493829b74dd histedit: use repo.revs() instead of repo.set() where revisions are needed
Yuya Nishihara <yuya@tcha.org>
parents: 36409
diff changeset
2366 return pycompat.maplist(repo.changelog.node, revs)
17642
bea381c16809 histedit: move `between function` outside the action logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17641
diff changeset
2367
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2368
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2369 def ruleeditor(repo, ui, actions, editcomment=b""):
24140
5a64b676c5d3 histedit: extract method ruleeditor
Mateusz Kwapich <mitrandir@fb.com>
parents: 24131
diff changeset
2370 """open an editor to edit rules
5a64b676c5d3 histedit: extract method ruleeditor
Mateusz Kwapich <mitrandir@fb.com>
parents: 24131
diff changeset
2371
5a64b676c5d3 histedit: extract method ruleeditor
Mateusz Kwapich <mitrandir@fb.com>
parents: 24131
diff changeset
2372 rules are in the format [ [act, ctx], ...] like in state.rules
5a64b676c5d3 histedit: extract method ruleeditor
Mateusz Kwapich <mitrandir@fb.com>
parents: 24131
diff changeset
2373 """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2374 if repo.ui.configbool(b"experimental", b"histedit.autoverb"):
29470
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2375 newact = util.sortdict()
29465
00d2bf4137e6 histedit: move autoverb logic from torule to ruleeditor
Sean Farley <sean@farley.io>
parents: 29324
diff changeset
2376 for act in actions:
00d2bf4137e6 histedit: move autoverb logic from torule to ruleeditor
Sean Farley <sean@farley.io>
parents: 29324
diff changeset
2377 ctx = repo[act.node]
29469
ffa194c3a83c histedit: use _getsummary in ruleeditor
Sean Farley <sean@farley.io>
parents: 29468
diff changeset
2378 summary = _getsummary(ctx)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2379 fword = summary.split(b' ', 1)[0].lower()
29470
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2380 added = False
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2381
29465
00d2bf4137e6 histedit: move autoverb logic from torule to ruleeditor
Sean Farley <sean@farley.io>
parents: 29324
diff changeset
2382 # if it doesn't end with the special character '!' just skip this
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2383 if fword.endswith(b'!'):
29465
00d2bf4137e6 histedit: move autoverb logic from torule to ruleeditor
Sean Farley <sean@farley.io>
parents: 29324
diff changeset
2384 fword = fword[:-1]
00d2bf4137e6 histedit: move autoverb logic from torule to ruleeditor
Sean Farley <sean@farley.io>
parents: 29324
diff changeset
2385 if fword in primaryactions | secondaryactions | tertiaryactions:
00d2bf4137e6 histedit: move autoverb logic from torule to ruleeditor
Sean Farley <sean@farley.io>
parents: 29324
diff changeset
2386 act.verb = fword
29470
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2387 # get the target summary
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2388 tsum = summary[len(fword) + 1 :].lstrip()
29470
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2389 # safe but slow: reverse iterate over the actions so we
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2390 # don't clash on two commits having the same summary
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
2391 for na, l in reversed(list(pycompat.iteritems(newact))):
29470
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2392 actx = repo[na.node]
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2393 asum = _getsummary(actx)
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2394 if asum == tsum:
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2395 added = True
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2396 l.append(act)
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2397 break
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2398
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2399 if not added:
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2400 newact[act] = []
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2401
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2402 # copy over and flatten the new list
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2403 actions = []
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
2404 for na, l in pycompat.iteritems(newact):
29470
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2405 actions.append(na)
2ff243c415b4 histedit: move autoverb rule to the commit it matches
Sean Farley <sean@farley.io>
parents: 29469
diff changeset
2406 actions += l
29465
00d2bf4137e6 histedit: move autoverb logic from torule to ruleeditor
Sean Farley <sean@farley.io>
parents: 29324
diff changeset
2407
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2408 rules = b'\n'.join([act.torule() for act in actions])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2409 rules += b'\n\n'
24140
5a64b676c5d3 histedit: extract method ruleeditor
Mateusz Kwapich <mitrandir@fb.com>
parents: 24131
diff changeset
2410 rules += editcomment
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2411 rules = ui.edit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2412 rules,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2413 ui.username(),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2414 {b'prefix': b'histedit'},
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2415 repopath=repo.path,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2416 action=b'histedit',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2417 )
24140
5a64b676c5d3 histedit: extract method ruleeditor
Mateusz Kwapich <mitrandir@fb.com>
parents: 24131
diff changeset
2418
5a64b676c5d3 histedit: extract method ruleeditor
Mateusz Kwapich <mitrandir@fb.com>
parents: 24131
diff changeset
2419 # Save edit rules in .hg/histedit-last-edit.txt in case
5a64b676c5d3 histedit: extract method ruleeditor
Mateusz Kwapich <mitrandir@fb.com>
parents: 24131
diff changeset
2420 # the user needs to ask for help after something
5a64b676c5d3 histedit: extract method ruleeditor
Mateusz Kwapich <mitrandir@fb.com>
parents: 24131
diff changeset
2421 # surprising happens.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2422 with repo.vfs(b'histedit-last-edit.txt', b'wb') as f:
36168
be73fa5b42d3 histedit: modernize write of histedit-last-edit file
Augie Fackler <augie@google.com>
parents: 36167
diff changeset
2423 f.write(rules)
24140
5a64b676c5d3 histedit: extract method ruleeditor
Mateusz Kwapich <mitrandir@fb.com>
parents: 24131
diff changeset
2424
5a64b676c5d3 histedit: extract method ruleeditor
Mateusz Kwapich <mitrandir@fb.com>
parents: 24131
diff changeset
2425 return rules
5a64b676c5d3 histedit: extract method ruleeditor
Mateusz Kwapich <mitrandir@fb.com>
parents: 24131
diff changeset
2426
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2427
27208
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2428 def parserules(rules, state):
47062
f38bf44e077f black: make codebase compatible with black v21.4b2 and v20.8b1
Kyle Lippincott <spectral@google.com>
parents: 46941
diff changeset
2429 """Read the histedit rules string and return list of action objects"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2430 rules = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2431 l
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2432 for l in (r.strip() for r in rules.splitlines())
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2433 if l and not l.startswith(b'#')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2434 ]
27208
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2435 actions = []
17064
168cc52ad7c2 histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff changeset
2436 for r in rules:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2437 if b' ' not in r:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2438 raise error.ParseError(_(b'malformed line "%s"') % r)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2439 verb, rest = r.split(b' ', 1)
27082
4898e442f392 histedit: make verification configurable
Mateusz Kwapich <mitrandir@fb.com>
parents: 27051
diff changeset
2440
27208
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2441 if verb not in actiontable:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2442 raise error.ParseError(_(b'unknown action "%s"') % verb)
27208
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2443
27082
4898e442f392 histedit: make verification configurable
Mateusz Kwapich <mitrandir@fb.com>
parents: 27051
diff changeset
2444 action = actiontable[verb].fromrule(state, rest)
27208
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2445 actions.append(action)
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2446 return actions
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2447
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2448
27543
ff0e4c8e642d histedit: limit mentioning histedit-last-edit.txt
timeless <timeless@mozdev.org>
parents: 27542
diff changeset
2449 def warnverifyactions(ui, repo, actions, state, ctxs):
ff0e4c8e642d histedit: limit mentioning histedit-last-edit.txt
timeless <timeless@mozdev.org>
parents: 27542
diff changeset
2450 try:
ff0e4c8e642d histedit: limit mentioning histedit-last-edit.txt
timeless <timeless@mozdev.org>
parents: 27542
diff changeset
2451 verifyactions(actions, state, ctxs)
27545
a67d2e059a51 histedit: use parse-error exception for parsing
timeless <timeless@mozdev.org>
parents: 27543
diff changeset
2452 except error.ParseError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2453 if repo.vfs.exists(b'histedit-last-edit.txt'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2454 ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2455 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2456 b'warning: histedit rules saved '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2457 b'to: .hg/histedit-last-edit.txt\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2458 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2459 )
27543
ff0e4c8e642d histedit: limit mentioning histedit-last-edit.txt
timeless <timeless@mozdev.org>
parents: 27542
diff changeset
2460 raise
ff0e4c8e642d histedit: limit mentioning histedit-last-edit.txt
timeless <timeless@mozdev.org>
parents: 27542
diff changeset
2461
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2462
27208
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2463 def verifyactions(actions, state, ctxs):
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2464 """Verify that there exists exactly one action per given changeset and
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2465 other constraints.
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2466
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2467 Will abort if there are to many or too few rules, a malformed rule,
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2468 or a rule on a changeset outside of the user-given range.
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2469 """
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44441
diff changeset
2470 expected = {c.node() for c in ctxs}
27208
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2471 seen = set()
27541
69df2081aeb5 histedit: pass previous action to verify
timeless <timeless@mozdev.org>
parents: 27534
diff changeset
2472 prev = None
33762
c26a76e1af36 histedit: check first changeset for verb "roll" or "fold" (issue5498)
André Klitzing <aklitzing@gmail.com>
parents: 33486
diff changeset
2473
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2474 if actions and actions[0].verb in [b'roll', b'fold']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2475 raise error.ParseError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2476 _(b'first changeset cannot use verb "%s"') % actions[0].verb
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2477 )
33762
c26a76e1af36 histedit: check first changeset for verb "roll" or "fold" (issue5498)
André Klitzing <aklitzing@gmail.com>
parents: 33486
diff changeset
2478
27208
994d8dced775 histedit: get rid of state.rules
Mateusz Kwapich <mitrandir@fb.com>
parents: 27207
diff changeset
2479 for action in actions:
29879
b566c5992e07 histedit: move constraint verification to the 'action.verify' method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29878
diff changeset
2480 action.verify(prev, expected, seen)
27541
69df2081aeb5 histedit: pass previous action to verify
timeless <timeless@mozdev.org>
parents: 27534
diff changeset
2481 prev = action
29876
034d38b5f6fb histedit: drop the 'nodetoverify' local variable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29875
diff changeset
2482 if action.node is not None:
29878
d7de02efa47e histedit: directly use node in 'verifyactions'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29877
diff changeset
2483 seen.add(action.node)
19048
1163ff06ce89 histedit: more precise user message when changeset is missing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19047
diff changeset
2484 missing = sorted(expected - seen) # sort to stabilize output
27414
6602a7b9deec histedit: delete to drop
Mateusz Kwapich <mitrandir@fb.com>
parents: 27407
diff changeset
2485
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2486 if state.repo.ui.configbool(b'histedit', b'dropmissing'):
28519
518a5030acba histedit: have dropmissing abort on empty plan
Mateusz Kwapich <mitrandir@fb.com>
parents: 28396
diff changeset
2487 if len(actions) == 0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2488 raise error.ParseError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2489 _(b'no rules provided'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2490 hint=_(b'use strip extension to remove commits'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2491 )
28519
518a5030acba histedit: have dropmissing abort on empty plan
Mateusz Kwapich <mitrandir@fb.com>
parents: 28396
diff changeset
2492
29878
d7de02efa47e histedit: directly use node in 'verifyactions'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29877
diff changeset
2493 drops = [drop(state, n) for n in missing]
27414
6602a7b9deec histedit: delete to drop
Mateusz Kwapich <mitrandir@fb.com>
parents: 27407
diff changeset
2494 # put the in the beginning so they execute immediately and
6602a7b9deec histedit: delete to drop
Mateusz Kwapich <mitrandir@fb.com>
parents: 27407
diff changeset
2495 # don't show in the edit-plan in the future
6602a7b9deec histedit: delete to drop
Mateusz Kwapich <mitrandir@fb.com>
parents: 27407
diff changeset
2496 actions[:0] = drops
6602a7b9deec histedit: delete to drop
Mateusz Kwapich <mitrandir@fb.com>
parents: 27407
diff changeset
2497 elif missing:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2498 raise error.ParseError(
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
2499 _(b'missing rules for changeset %s') % short(missing[0]),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2500 hint=_(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2501 b'use "drop %s" to discard, see also: '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2502 b"'hg help -e histedit.config'"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2503 )
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
2504 % short(missing[0]),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2505 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2506
17663
c6de8c696644 histedit: extract bookmark logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17662
diff changeset
2507
28216
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2508 def adjustreplacementsfrommarkers(repo, oldreplacements):
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30262
diff changeset
2509 """Adjust replacements from obsolescence markers
28216
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2510
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2511 Replacements structure is originally generated based on
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2512 histedit's state and does not account for changes that are
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2513 not recorded there. This function fixes that by adding
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30262
diff changeset
2514 data read from obsolescence markers"""
28216
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2515 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2516 return oldreplacements
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2517
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2518 unfi = repo.unfiltered()
43568
418ca164d44c index: use `index.get_rev` in `histedit.adjustreplacementsfrommarkers`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43548
diff changeset
2519 get_rev = unfi.changelog.index.get_rev
28224
8ec5478aa0d6 histedit: also handle locally missing nodes when reading obsolescence
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28216
diff changeset
2520 obsstore = repo.obsstore
28216
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2521 newreplacements = list(oldreplacements)
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2522 oldsuccs = [r[1] for r in oldreplacements]
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2523 # successors that have already been added to succstocheck once
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2524 seensuccs = set().union(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2525 *oldsuccs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2526 ) # create a set from an iterable of tuples
28216
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2527 succstocheck = list(seensuccs)
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2528 while succstocheck:
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2529 n = succstocheck.pop()
43568
418ca164d44c index: use `index.get_rev` in `histedit.adjustreplacementsfrommarkers`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43548
diff changeset
2530 missing = get_rev(n) is None
28224
8ec5478aa0d6 histedit: also handle locally missing nodes when reading obsolescence
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28216
diff changeset
2531 markers = obsstore.successors.get(n, ())
8ec5478aa0d6 histedit: also handle locally missing nodes when reading obsolescence
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28216
diff changeset
2532 if missing and not markers:
8ec5478aa0d6 histedit: also handle locally missing nodes when reading obsolescence
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28216
diff changeset
2533 # dead end, mark it as such
28216
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2534 newreplacements.append((n, ()))
28224
8ec5478aa0d6 histedit: also handle locally missing nodes when reading obsolescence
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28216
diff changeset
2535 for marker in markers:
8ec5478aa0d6 histedit: also handle locally missing nodes when reading obsolescence
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28216
diff changeset
2536 nsuccs = marker[1]
28216
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2537 newreplacements.append((n, nsuccs))
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2538 for nsucc in nsuccs:
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2539 if nsucc not in seensuccs:
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2540 seensuccs.add(nsucc)
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2541 succstocheck.append(nsucc)
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2542
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2543 return newreplacements
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2544
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2545
22985
0c14b9166da6 histedit: remove now-superfluous repo argument from processreplacement
Augie Fackler <raf@durin42.com>
parents: 22984
diff changeset
2546 def processreplacement(state):
17758
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2547 """process the list of replacements to return
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2548
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2549 1) the final mapping between original and created nodes
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2550 2) the list of temporary node created by histedit
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2551 3) the list of new commit created by histedit"""
28216
eed7d8c07c20 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com>
parents: 28179
diff changeset
2552 replacements = adjustreplacementsfrommarkers(state.repo, state.replacements)
17758
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2553 allsuccs = set()
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2554 replaced = set()
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2555 fullmapping = {}
26039
84dcc37b1272 histedit: correct spelling etc in more comments
Augie Fackler <augie@google.com>
parents: 26038
diff changeset
2556 # initialize basic set
84dcc37b1272 histedit: correct spelling etc in more comments
Augie Fackler <augie@google.com>
parents: 26038
diff changeset
2557 # fullmapping records all operations recorded in replacement
17758
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2558 for rep in replacements:
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2559 allsuccs.update(rep[1])
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2560 replaced.add(rep[0])
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2561 fullmapping.setdefault(rep[0], set()).update(rep[1])
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2562 new = allsuccs - replaced
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2563 tmpnodes = allsuccs & replaced
26039
84dcc37b1272 histedit: correct spelling etc in more comments
Augie Fackler <augie@google.com>
parents: 26038
diff changeset
2564 # Reduce content fullmapping into direct relation between original nodes
17758
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2565 # and final node created during history edition
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2566 # Dropped changeset are replaced by an empty list
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2567 toproceed = set(fullmapping)
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2568 final = {}
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2569 while toproceed:
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2570 for x in list(toproceed):
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2571 succs = fullmapping[x]
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2572 for s in list(succs):
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2573 if s in toproceed:
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2574 # non final node with unknown closure
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2575 # We can't process this now
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2576 break
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2577 elif s in final:
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2578 # non final node, replace with closure
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2579 succs.remove(s)
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2580 succs.update(final[s])
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2581 else:
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2582 final[x] = succs
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2583 toproceed.remove(x)
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2584 # remove tmpnodes from final mapping
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2585 for n in tmpnodes:
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2586 del final[n]
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2587 # we expect all changes involved in final to exist in the repo
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2588 # turn `final` into list (topologically sorted)
43569
43e722fc2909 index: use `index.get_rev` in `histedit.processreplacement`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43568
diff changeset
2589 get_rev = state.repo.changelog.index.get_rev
17758
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2590 for prec, succs in final.items():
43569
43e722fc2909 index: use `index.get_rev` in `histedit.processreplacement`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43568
diff changeset
2591 final[prec] = sorted(succs, key=get_rev)
17663
c6de8c696644 histedit: extract bookmark logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17662
diff changeset
2592
17758
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2593 # computed topmost element (necessary for bookmark)
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2594 if new:
22985
0c14b9166da6 histedit: remove now-superfluous repo argument from processreplacement
Augie Fackler <raf@durin42.com>
parents: 22984
diff changeset
2595 newtopmost = sorted(new, key=state.repo.changelog.rev)[-1]
17758
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2596 elif not final:
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2597 # Nothing rewritten at all. we won't need `newtopmost`
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2598 # It is the same as `oldtopmost` and `processreplacement` know it
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2599 newtopmost = None
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2600 else:
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2601 # every body died. The newtopmost is the parent of the root.
22985
0c14b9166da6 histedit: remove now-superfluous repo argument from processreplacement
Augie Fackler <raf@durin42.com>
parents: 22984
diff changeset
2602 r = state.repo.changelog.rev
0c14b9166da6 histedit: remove now-superfluous repo argument from processreplacement
Augie Fackler <raf@durin42.com>
parents: 22984
diff changeset
2603 newtopmost = state.repo[sorted(final, key=r)[0]].p1().node()
17758
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2604
5863f0e4cd3a histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17757
diff changeset
2605 return final, tmpnodes, new, newtopmost
17663
c6de8c696644 histedit: extract bookmark logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17662
diff changeset
2606
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2607
33346
7aa5160bdbf5 histedit: move topmost bookmark movement to a separate function
Jun Wu <quark@fb.com>
parents: 33345
diff changeset
2608 def movetopmostbookmarks(repo, oldtopmost, newtopmost):
7aa5160bdbf5 histedit: move topmost bookmark movement to a separate function
Jun Wu <quark@fb.com>
parents: 33345
diff changeset
2609 """Move bookmark from oldtopmost to newly created topmost
7aa5160bdbf5 histedit: move topmost bookmark movement to a separate function
Jun Wu <quark@fb.com>
parents: 33345
diff changeset
2610
7aa5160bdbf5 histedit: move topmost bookmark movement to a separate function
Jun Wu <quark@fb.com>
parents: 33345
diff changeset
2611 This is arguably a feature and we may only want that for the active
7aa5160bdbf5 histedit: move topmost bookmark movement to a separate function
Jun Wu <quark@fb.com>
parents: 33345
diff changeset
2612 bookmark. But the behavior is kept compatible with the old version for now.
7aa5160bdbf5 histedit: move topmost bookmark movement to a separate function
Jun Wu <quark@fb.com>
parents: 33345
diff changeset
2613 """
7aa5160bdbf5 histedit: move topmost bookmark movement to a separate function
Jun Wu <quark@fb.com>
parents: 33345
diff changeset
2614 if not oldtopmost or not newtopmost:
7aa5160bdbf5 histedit: move topmost bookmark movement to a separate function
Jun Wu <quark@fb.com>
parents: 33345
diff changeset
2615 return
7aa5160bdbf5 histedit: move topmost bookmark movement to a separate function
Jun Wu <quark@fb.com>
parents: 33345
diff changeset
2616 oldbmarks = repo.nodebookmarks(oldtopmost)
7aa5160bdbf5 histedit: move topmost bookmark movement to a separate function
Jun Wu <quark@fb.com>
parents: 33345
diff changeset
2617 if oldbmarks:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2618 with repo.lock(), repo.transaction(b'histedit') as tr:
33346
7aa5160bdbf5 histedit: move topmost bookmark movement to a separate function
Jun Wu <quark@fb.com>
parents: 33345
diff changeset
2619 marks = repo._bookmarks
33486
af402f11cb9d bookmark: use 'applychanges' when updating bookmark in histedit
Boris Feld <boris.feld@octobus.net>
parents: 33446
diff changeset
2620 changes = []
33346
7aa5160bdbf5 histedit: move topmost bookmark movement to a separate function
Jun Wu <quark@fb.com>
parents: 33345
diff changeset
2621 for name in oldbmarks:
33486
af402f11cb9d bookmark: use 'applychanges' when updating bookmark in histedit
Boris Feld <boris.feld@octobus.net>
parents: 33446
diff changeset
2622 changes.append((name, newtopmost))
af402f11cb9d bookmark: use 'applychanges' when updating bookmark in histedit
Boris Feld <boris.feld@octobus.net>
parents: 33446
diff changeset
2623 marks.applychanges(repo, tr, changes)
33346
7aa5160bdbf5 histedit: move topmost bookmark movement to a separate function
Jun Wu <quark@fb.com>
parents: 33345
diff changeset
2624
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2625
38548
7b57b1ed5c0f histedit: add --no-backup option (issue5825)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38508
diff changeset
2626 def cleanupnode(ui, repo, nodes, nobackup=False):
31637
c4dd1e7c1dab histedit: backout changeset 2b599f5468a4
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31528
diff changeset
2627 """strip a group of nodes from the repository
c4dd1e7c1dab histedit: backout changeset 2b599f5468a4
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31528
diff changeset
2628
c4dd1e7c1dab histedit: backout changeset 2b599f5468a4
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31528
diff changeset
2629 The set of node to strip may contains unknown nodes."""
c4dd1e7c1dab histedit: backout changeset 2b599f5468a4
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31528
diff changeset
2630 with repo.lock():
c4dd1e7c1dab histedit: backout changeset 2b599f5468a4
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31528
diff changeset
2631 # do not let filtering get in the way of the cleanse
c4dd1e7c1dab histedit: backout changeset 2b599f5468a4
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31528
diff changeset
2632 # we should probably get rid of obsolescence marker created during the
c4dd1e7c1dab histedit: backout changeset 2b599f5468a4
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31528
diff changeset
2633 # histedit, but we currently do not have such information.
c4dd1e7c1dab histedit: backout changeset 2b599f5468a4
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31528
diff changeset
2634 repo = repo.unfiltered()
c4dd1e7c1dab histedit: backout changeset 2b599f5468a4
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31528
diff changeset
2635 # Find all nodes that need to be stripped
c4dd1e7c1dab histedit: backout changeset 2b599f5468a4
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31528
diff changeset
2636 # (we use %lr instead of %ln to silently ignore unknown items)
43548
ccda03f6abcb index: use `index.has_node` in `histedit.cleanupnode`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43547
diff changeset
2637 has_node = repo.changelog.index.has_node
ccda03f6abcb index: use `index.has_node` in `histedit.cleanupnode`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43547
diff changeset
2638 nodes = sorted(n for n in nodes if has_node(n))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2639 roots = [c.node() for c in repo.set(b"roots(%ln)", nodes)]
33349
28f75a1695fb histedit: pass multiple nodes to strip (BC)
Jun Wu <quark@fb.com>
parents: 33348
diff changeset
2640 if roots:
38548
7b57b1ed5c0f histedit: add --no-backup option (issue5825)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38508
diff changeset
2641 backup = not nobackup
7b57b1ed5c0f histedit: add --no-backup option (issue5825)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38508
diff changeset
2642 repair.strip(ui, repo, roots, backup=backup)
31637
c4dd1e7c1dab histedit: backout changeset 2b599f5468a4
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31528
diff changeset
2643
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2644
24111
11d72683f3de histedit: don't allow to strip nodes which are necessary to continue histedit
Mateusz Kwapich <mitrandir@fb.com>
parents: 24009
diff changeset
2645 def stripwrapper(orig, ui, repo, nodelist, *args, **kwargs):
43744
40db695040eb histedit: fix an `isinstance(nodelist, str)` check for py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 43376
diff changeset
2646 if isinstance(nodelist, bytes):
24111
11d72683f3de histedit: don't allow to strip nodes which are necessary to continue histedit
Mateusz Kwapich <mitrandir@fb.com>
parents: 24009
diff changeset
2647 nodelist = [nodelist]
38786
28d8b5f49b4d histedit: avoid repeating name of state file in a few places
Martin von Zweigbergk <martinvonz@google.com>
parents: 38783
diff changeset
2648 state = histeditstate(repo)
28d8b5f49b4d histedit: avoid repeating name of state file in a few places
Martin von Zweigbergk <martinvonz@google.com>
parents: 38783
diff changeset
2649 if state.inprogress():
24111
11d72683f3de histedit: don't allow to strip nodes which are necessary to continue histedit
Mateusz Kwapich <mitrandir@fb.com>
parents: 24009
diff changeset
2650 state.read()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2651 histedit_nodes = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2652 action.node for action in state.actions if action.node
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2653 }
30025
4d9999e43ff7 histedit: avoid converting nodeid to context and back again
Martin von Zweigbergk <martinvonz@google.com>
parents: 29970
diff changeset
2654 common_nodes = histedit_nodes & set(nodelist)
24111
11d72683f3de histedit: don't allow to strip nodes which are necessary to continue histedit
Mateusz Kwapich <mitrandir@fb.com>
parents: 24009
diff changeset
2655 if common_nodes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2656 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2657 _(b"histedit in progress, can't strip %s")
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46104
diff changeset
2658 % b', '.join(short(x) for x in common_nodes)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2659 )
24111
11d72683f3de histedit: don't allow to strip nodes which are necessary to continue histedit
Mateusz Kwapich <mitrandir@fb.com>
parents: 24009
diff changeset
2660 return orig(ui, repo, nodelist, *args, **kwargs)
11d72683f3de histedit: don't allow to strip nodes which are necessary to continue histedit
Mateusz Kwapich <mitrandir@fb.com>
parents: 24009
diff changeset
2661
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2662
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2663 extensions.wrapfunction(repair, b'strip', stripwrapper)
24111
11d72683f3de histedit: don't allow to strip nodes which are necessary to continue histedit
Mateusz Kwapich <mitrandir@fb.com>
parents: 24009
diff changeset
2664
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2665
19215
f184fe1e2ac5 summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents: 19048
diff changeset
2666 def summaryhook(ui, repo):
38786
28d8b5f49b4d histedit: avoid repeating name of state file in a few places
Martin von Zweigbergk <martinvonz@google.com>
parents: 38783
diff changeset
2667 state = histeditstate(repo)
28d8b5f49b4d histedit: avoid repeating name of state file in a few places
Martin von Zweigbergk <martinvonz@google.com>
parents: 38783
diff changeset
2668 if not state.inprogress():
19215
f184fe1e2ac5 summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents: 19048
diff changeset
2669 return
22983
a3a981563ce8 histedit: read state from histeditstate
David Soria Parra <davidsp@fb.com>
parents: 22982
diff changeset
2670 state.read()
27207
2d8dbeb2462c histedit: change state.rules uses to state.actions
Mateusz Kwapich <mitrandir@fb.com>
parents: 27206
diff changeset
2671 if state.actions:
19215
f184fe1e2ac5 summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents: 19048
diff changeset
2672 # i18n: column positioning for "hg summary"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2673 ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2674 _(b'hist: %s (histedit --continue)\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2675 % (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2676 ui.label(_(b'%d remaining'), b'histedit.remaining')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2677 % len(state.actions)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2678 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2679 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2680
19215
f184fe1e2ac5 summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents: 19048
diff changeset
2681
f184fe1e2ac5 summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents: 19048
diff changeset
2682 def extsetup(ui):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2683 cmdutil.summaryhooks.add(b'histedit', summaryhook)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2684 statemod.addunfinished(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2685 b'histedit',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2686 fname=b'histedit-state',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2687 allowcommit=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2688 continueflag=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2689 abortfunc=hgaborthistedit,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
2690 )