Mercurial > hg
annotate hgext/histedit.py @ 19659:750a913334c8
workingctx: remove unneeded manifest since it is now inherited
author | Sean Farley <sean.michael.farley@gmail.com> |
---|---|
date | Wed, 14 Aug 2013 13:41:09 -0500 |
parents | d0dbe5330177 |
children | baab785e3ecf |
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 # |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
33 # Commands: |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
34 # p, pick = use commit |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
35 # e, edit = use commit, but stop for amending |
17335
b5c560787a4e
histedit: sync docstring with edit comment
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17326
diff
changeset
|
36 # f, fold = use commit, but fold into previous commit (combines N and N-1) |
17131
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
37 # d, drop = remove commit from history |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
38 # m, mess = edit message without changing commit content |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
39 # |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
40 |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
41 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
|
42 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
|
43 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
|
44 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
|
45 |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
46 pick 030b686bedc4 Add gamma |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
47 pick c561b4e977df Add beta |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
48 fold 7c2fd3b9020c Add delta |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
49 |
18322
e819c12a8bd0
histedit: correct changeset IDs in online help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17771
diff
changeset
|
50 # Edit history between c561b4e977df and 7c2fd3b9020c |
17131
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
51 # |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
52 # Commands: |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
53 # p, pick = use commit |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
54 # e, edit = use commit, but stop for amending |
17335
b5c560787a4e
histedit: sync docstring with edit comment
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17326
diff
changeset
|
55 # f, fold = use commit, but fold into previous commit (combines N and N-1) |
17131
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
56 # d, drop = remove commit from history |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
57 # m, mess = edit message without changing commit content |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
58 # |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
59 |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
60 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
|
61 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
|
62 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
|
63 |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
64 Add beta |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
65 *** |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
66 Add delta |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
67 |
17131
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
68 Edit the commit message to your liking, then close the editor. For |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
69 this example, let's assume that the commit message was changed to |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
70 ``Add beta and delta.`` After histedit has run and had a chance to |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
71 remove any old or temporary revisions it needed, the history looks |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
72 like this:: |
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 @ 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
|
75 | Add beta and delta. |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
76 | |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
77 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
|
78 | Add gamma |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
79 | |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
80 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
|
81 Add alpha |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
82 |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
83 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
|
84 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
|
85 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
|
86 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
|
87 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
|
88 revisions by passing the ``--keep`` flag. |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
89 |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
90 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
|
91 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
|
92 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
|
93 uncommitted changes will be committed as well. When done, run ``hg |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
94 histedit --continue`` to finish this step. You'll be prompted for a |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
95 new commit message, but the default commit message will be the |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
96 original message for the ``edit`` ed revision. |
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 ``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
|
99 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
|
100 ``edit`` immediately followed by `hg histedit --continue``. |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
101 |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
102 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
|
103 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
|
104 ``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
|
105 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
|
106 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
|
107 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
|
108 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
|
109 history. |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
110 |
18323
7648b87e76db
histedit: correct the number of added revisions in online help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18322
diff
changeset
|
111 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
|
112 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
|
113 |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
114 @ 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
|
115 | Add theta |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
116 | |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
117 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
|
118 | Add eta |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
119 | |
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
120 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
|
121 | Add zeta |
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 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
|
124 | Add epsilon |
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 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
|
127 | Add beta and delta. |
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 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
|
130 | Add gamma |
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 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
|
133 Add alpha |
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 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
|
136 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
|
137 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
|
138 repo, you can add a ``--force`` option. |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
139 """ |
17131
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
140 |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
141 try: |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
142 import cPickle as pickle |
19284
87bb53367633
histedit: raise ImportError when demandloading is enabled
Simon Heimberg <simohe@besonet.ch>
parents:
19048
diff
changeset
|
143 pickle.dump # import now |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
144 except ImportError: |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
145 import pickle |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
146 import os |
19018
730614b9b352
histedit: allow "-" as a command file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19017
diff
changeset
|
147 import sys |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
148 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
149 from mercurial import cmdutil |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
150 from mercurial import discovery |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
151 from mercurial import error |
17644
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
152 from mercurial import copies |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
153 from mercurial import context |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
154 from mercurial import hg |
17326
23b2ee0f758d
histedit: add proper locking around repair.strip() calls
Augie Fackler <raf@durin42.com>
parents:
17315
diff
changeset
|
155 from mercurial import lock as lockmod |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
156 from mercurial import node |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
157 from mercurial import repair |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
158 from mercurial import scmutil |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
159 from mercurial import util |
17759
9c7497cd39fd
histedit: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17758
diff
changeset
|
160 from mercurial import obsolete |
17647
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
161 from mercurial import merge as mergemod |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
162 from mercurial.i18n import _ |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
163 |
17147
80e861511e2b
histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
17131
diff
changeset
|
164 cmdtable = {} |
80e861511e2b
histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
17131
diff
changeset
|
165 command = cmdutil.command(cmdtable) |
80e861511e2b
histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
17131
diff
changeset
|
166 |
17069
2b1c78674230
histedit: mark as a first party extension
Augie Fackler <raf@durin42.com>
parents:
17068
diff
changeset
|
167 testedwith = 'internal' |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
168 |
17337
474ae9720aa5
histedit, i18n: warn translators about edit command names
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17326
diff
changeset
|
169 # i18n: command names and abbreviations must remain untranslated |
17315
f320d7ed912f
histedit: make comment part of the file describing rules as translatable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17285
diff
changeset
|
170 editcomment = _("""# Edit history between %s and %s |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
171 # |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
172 # Commands: |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
173 # p, pick = use commit |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
174 # e, edit = use commit, but stop for amending |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
175 # f, fold = use commit, but fold into previous commit (combines N and N-1) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
176 # d, drop = remove commit from history |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
177 # m, mess = edit message without changing commit content |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
178 # |
17315
f320d7ed912f
histedit: make comment part of the file describing rules as translatable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17285
diff
changeset
|
179 """) |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
180 |
18436
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
181 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
|
182 """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
|
183 |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18609
diff
changeset
|
184 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
|
185 |
18437
358c23e8f1c6
histedit: record histedit source (issue3681)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18436
diff
changeset
|
186 - 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
|
187 |
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
188 Note that fold have its own separated logic because its handling is a bit |
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
189 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
|
190 """ |
18440
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
191 phasemin = src.phase() |
18436
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
192 def commitfunc(**kwargs): |
18440
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
193 phasebackup = repo.ui.backupconfig('phases', 'new-commit') |
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
194 try: |
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
195 repo.ui.setconfig('phases', 'new-commit', phasemin) |
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
196 extra = kwargs.get('extra', {}).copy() |
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
197 extra['histedit_source'] = src.hex() |
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
198 kwargs['extra'] = extra |
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
199 return repo.commit(**kwargs) |
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
200 finally: |
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
201 repo.ui.restoreconfig(phasebackup) |
18436
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
202 return commitfunc |
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
203 |
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
204 |
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
205 |
17647
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
206 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
|
207 """Merge changeset from ctx (only) in the current working directory""" |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
208 wcpar = repo.dirstate.parents()[0] |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
209 if ctx.p1().node() == wcpar: |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
210 # edition ar "in place" we do not need to make any merge, |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
211 # just applies changes on parent for edition |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
212 cmdutil.revert(ui, repo, ctx, (wcpar, node.nullid), all=True) |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
213 stats = None |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
214 else: |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
215 try: |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
216 # ui.forcemerge is an internal variable, do not document |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
217 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', '')) |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
218 stats = mergemod.update(repo, ctx.node(), True, True, False, |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
219 ctx.p1().node()) |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
220 finally: |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
221 repo.ui.setconfig('ui', 'forcemerge', '') |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
222 repo.setparents(wcpar, node.nullid) |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
223 repo.dirstate.write() |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
224 # fix up dirstate for copies and renames |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
225 cmdutil.duplicatecopies(repo, ctx.rev(), ctx.p1().rev()) |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
226 return stats |
17407
31c123a2f273
histedit: factored out diff/patch logic
Leah Xue <leahxue@fb.com>
parents:
17340
diff
changeset
|
227 |
17644
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
228 def collapse(repo, first, last, commitopts): |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
229 """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
|
230 |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
231 Expected commit options are: |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
232 - message |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
233 - date |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
234 - username |
17738
b8424c92ba2b
spelling: fix minor spell checker issues
Mads Kiilerich <mads@kiilerich.com>
parents:
17666
diff
changeset
|
235 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
|
236 |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
237 This function works in memory.""" |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
238 ctxs = list(repo.set('%d::%d', first, last)) |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
239 if not ctxs: |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
240 return None |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
241 base = first.parents()[0] |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
242 |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
243 # 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
|
244 # collect all files which might be affected |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
245 files = set() |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
246 for ctx in ctxs: |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
247 files.update(ctx.files()) |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
248 |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
249 # Recompute copies (avoid recording a -> b -> a) |
19392
f6b047cf9272
histedit: use base for computing renames when folding (issue3729)
Martin Geisler <martin@geisler.net>
parents:
19284
diff
changeset
|
250 copied = copies.pathcopies(base, last) |
17644
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
251 |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
252 # prune files which were reverted by the updates |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
253 def samefile(f): |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
254 if f in last.manifest(): |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
255 a = last.filectx(f) |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
256 if f in base.manifest(): |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
257 b = base.filectx(f) |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
258 return (a.data() == b.data() |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
259 and a.flags() == b.flags()) |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
260 else: |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
261 return False |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
262 else: |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
263 return f not in base.manifest() |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
264 files = [f for f in files if not samefile(f)] |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
265 # commit version of these files as defined by head |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
266 headmf = last.manifest() |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
267 def filectxfn(repo, ctx, path): |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
268 if path in headmf: |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
269 fctx = last[path] |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
270 flags = fctx.flags() |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
271 mctx = context.memfilectx(fctx.path(), fctx.data(), |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
272 islink='l' in flags, |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
273 isexec='x' in flags, |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
274 copied=copied.get(path)) |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
275 return mctx |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
276 raise IOError() |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
277 |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
278 if commitopts.get('message'): |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
279 message = commitopts['message'] |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
280 else: |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
281 message = first.description() |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
282 user = commitopts.get('user') |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
283 date = commitopts.get('date') |
18437
358c23e8f1c6
histedit: record histedit source (issue3681)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18436
diff
changeset
|
284 extra = commitopts.get('extra') |
17644
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
285 |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
286 parents = (first.p1().node(), first.p2().node()) |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
287 new = context.memctx(repo, |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
288 parents=parents, |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
289 text=message, |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
290 files=files, |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
291 filectxfn=filectxfn, |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
292 user=user, |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
293 date=date, |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
294 extra=extra) |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
295 new._text = cmdutil.commitforceeditor(repo, new, []) |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
296 return repo.commitctx(new) |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
297 |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
298 def pick(ui, repo, ctx, ha, opts): |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
299 oldctx = repo[ha] |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
300 if oldctx.parents()[0] == ctx: |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
301 ui.debug('node %s unchanged\n' % ha) |
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
|
302 return oldctx, [] |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
303 hg.update(repo, ctx.node()) |
17647
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
304 stats = applychanges(ui, repo, oldctx, opts) |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
305 if stats and stats[3] > 0: |
18934
93f3a06b2035
histedit: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents:
18913
diff
changeset
|
306 raise error.InterventionRequired(_('Fix up the change and run ' |
93f3a06b2035
histedit: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents:
18913
diff
changeset
|
307 'hg histedit --continue')) |
17647
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
308 # drop the second merge parent |
18436
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
309 commit = commitfuncfor(repo, oldctx) |
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
310 n = commit(text=oldctx.description(), user=oldctx.user(), |
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
311 date=oldctx.date(), extra=oldctx.extra()) |
17647
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
312 if n is None: |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
313 ui.warn(_('%s: empty changeset\n') |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
314 % node.hex(ha)) |
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
|
315 return ctx, [] |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
316 new = repo[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
|
317 return new, [(oldctx.node(), (n,))] |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
318 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
319 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
320 def edit(ui, repo, ctx, ha, opts): |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
321 oldctx = repo[ha] |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
322 hg.update(repo, ctx.node()) |
17647
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
323 applychanges(ui, repo, oldctx, opts) |
18934
93f3a06b2035
histedit: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents:
18913
diff
changeset
|
324 raise error.InterventionRequired( |
93f3a06b2035
histedit: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents:
18913
diff
changeset
|
325 _('Make changes as needed, you may commit or record as needed now.\n' |
93f3a06b2035
histedit: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents:
18913
diff
changeset
|
326 'When you are finished, run hg histedit --continue to resume.')) |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
327 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
328 def fold(ui, repo, ctx, ha, opts): |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
329 oldctx = repo[ha] |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
330 hg.update(repo, ctx.node()) |
17647
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
331 stats = applychanges(ui, repo, oldctx, opts) |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
332 if stats and stats[3] > 0: |
18934
93f3a06b2035
histedit: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents:
18913
diff
changeset
|
333 raise error.InterventionRequired( |
93f3a06b2035
histedit: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents:
18913
diff
changeset
|
334 _('Fix up the change and run hg histedit --continue')) |
17066
baf8887d40e2
histedit: fix most check-code violations
Augie Fackler <raf@durin42.com>
parents:
17064
diff
changeset
|
335 n = repo.commit(text='fold-temp-revision %s' % ha, user=oldctx.user(), |
baf8887d40e2
histedit: fix most check-code violations
Augie Fackler <raf@durin42.com>
parents:
17064
diff
changeset
|
336 date=oldctx.date(), extra=oldctx.extra()) |
17647
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
337 if n is None: |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
338 ui.warn(_('%s: empty changeset') |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
339 % node.hex(ha)) |
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
|
340 return ctx, [] |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
341 return finishfold(ui, repo, ctx, oldctx, n, opts, []) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
342 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
343 def finishfold(ui, repo, ctx, oldctx, newnode, opts, internalchanges): |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
344 parent = ctx.parents()[0].node() |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
345 hg.update(repo, parent) |
17644
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
346 ### prepare new commit data |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
347 commitopts = opts.copy() |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
348 # username |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
349 if ctx.user() == oldctx.user(): |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
350 username = ctx.user() |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
351 else: |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
352 username = ui.username() |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
353 commitopts['user'] = username |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
354 # commit message |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
355 newmessage = '\n***\n'.join( |
17066
baf8887d40e2
histedit: fix most check-code violations
Augie Fackler <raf@durin42.com>
parents:
17064
diff
changeset
|
356 [ctx.description()] + |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
357 [repo[r].description() for r in internalchanges] + |
17241
c2f13180001f
histedit: end folding message with an LF
Patrick Mezard <patrick@mezard.eu>
parents:
17191
diff
changeset
|
358 [oldctx.description()]) + '\n' |
17644
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
359 commitopts['message'] = newmessage |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
360 # date |
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
361 commitopts['date'] = max(ctx.date(), oldctx.date()) |
18437
358c23e8f1c6
histedit: record histedit source (issue3681)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18436
diff
changeset
|
362 extra = ctx.extra().copy() |
358c23e8f1c6
histedit: record histedit source (issue3681)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18436
diff
changeset
|
363 # histedit_source |
358c23e8f1c6
histedit: record histedit source (issue3681)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18436
diff
changeset
|
364 # note: ctx is likely a temporary commit but that the best we can do here |
358c23e8f1c6
histedit: record histedit source (issue3681)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18436
diff
changeset
|
365 # This is sufficient to solve issue3681 anyway |
358c23e8f1c6
histedit: record histedit source (issue3681)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18436
diff
changeset
|
366 extra['histedit_source'] = '%s,%s' % (ctx.hex(), oldctx.hex()) |
358c23e8f1c6
histedit: record histedit source (issue3681)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18436
diff
changeset
|
367 commitopts['extra'] = extra |
18440
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
368 phasebackup = repo.ui.backupconfig('phases', 'new-commit') |
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
369 try: |
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
370 phasemin = max(ctx.phase(), oldctx.phase()) |
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
371 repo.ui.setconfig('phases', 'new-commit', phasemin) |
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
372 n = collapse(repo, ctx, repo[newnode], commitopts) |
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
373 finally: |
35513c59f376
histedit: proper phase conservation (issue3724)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18437
diff
changeset
|
374 repo.ui.restoreconfig(phasebackup) |
17644
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
375 if n is None: |
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
|
376 return ctx, [] |
17644
9ae073f10572
histedit: fold in memory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17643
diff
changeset
|
377 hg.update(repo, 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
|
378 replacements = [(oldctx.node(), (newnode,)), |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
379 (ctx.node(), (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
|
380 (newnode, (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
|
381 ] |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
382 for ich in internalchanges: |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
383 replacements.append((ich, (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
|
384 return repo[n], replacements |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
385 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
386 def drop(ui, repo, ctx, ha, opts): |
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
|
387 return ctx, [(repo[ha].node(), ())] |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
388 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
389 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
390 def message(ui, repo, ctx, ha, opts): |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
391 oldctx = repo[ha] |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
392 hg.update(repo, ctx.node()) |
17647
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
393 stats = applychanges(ui, repo, oldctx, opts) |
d34ba4991188
histedit: replaces patching logic by merges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17645
diff
changeset
|
394 if stats and stats[3] > 0: |
18934
93f3a06b2035
histedit: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents:
18913
diff
changeset
|
395 raise error.InterventionRequired( |
93f3a06b2035
histedit: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents:
18913
diff
changeset
|
396 _('Fix up the change and run hg histedit --continue')) |
17285
0f6f10d5f7a6
histedit: add trailing newline when editing commit messages
Mads Kiilerich <mads@kiilerich.com>
parents:
17275
diff
changeset
|
397 message = oldctx.description() + '\n' |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
398 message = ui.edit(message, ui.username()) |
18436
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
399 commit = commitfuncfor(repo, oldctx) |
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
400 new = commit(text=message, user=oldctx.user(), date=oldctx.date(), |
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
401 extra=oldctx.extra()) |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
402 newctx = repo[new] |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
403 if oldctx.node() != newctx.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
|
404 return newctx, [(oldctx.node(), (new,))] |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
405 # We didn't make an edit, so just indicate no replaced 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
|
406 return newctx, [] |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
407 |
19021
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
408 def findoutgoing(ui, repo, remote=None, force=False, opts={}): |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
409 """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
|
410 |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
411 Used by initialisation code""" |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
412 dest = ui.expandpath(remote or 'default-push', remote or 'default') |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
413 dest, revs = hg.parseurl(dest, None)[:2] |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
414 ui.status(_('comparing with %s\n') % util.hidepassword(dest)) |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
415 |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
416 revs, checkout = hg.addbranchrevs(repo, repo, revs, None) |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
417 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
|
418 |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
419 if revs: |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
420 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
|
421 |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
422 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
|
423 if not outgoing.missing: |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
424 raise util.Abort(_('no outgoing ancestors')) |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
425 return outgoing.missing[0] |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
426 |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
427 actiontable = {'p': pick, |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
428 'pick': pick, |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
429 'e': edit, |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
430 'edit': edit, |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
431 'f': fold, |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
432 'fold': fold, |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
433 'd': drop, |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
434 'drop': drop, |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
435 'm': message, |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
436 'mess': message, |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
437 } |
17147
80e861511e2b
histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
17131
diff
changeset
|
438 |
80e861511e2b
histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
17131
diff
changeset
|
439 @command('histedit', |
80e861511e2b
histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
17131
diff
changeset
|
440 [('', 'commands', '', |
80e861511e2b
histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
17131
diff
changeset
|
441 _('Read history edits from the specified file.')), |
80e861511e2b
histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
17131
diff
changeset
|
442 ('c', 'continue', False, _('continue an edit already in progress')), |
80e861511e2b
histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
17131
diff
changeset
|
443 ('k', 'keep', False, |
80e861511e2b
histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
17131
diff
changeset
|
444 _("don't strip old nodes after edit is complete")), |
80e861511e2b
histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
17131
diff
changeset
|
445 ('', 'abort', False, _('abort an edit in progress')), |
80e861511e2b
histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
17131
diff
changeset
|
446 ('o', 'outgoing', False, _('changesets not found in destination')), |
80e861511e2b
histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
17131
diff
changeset
|
447 ('f', 'force', False, |
80e861511e2b
histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
17131
diff
changeset
|
448 _('force outgoing even for unrelated repositories')), |
80e861511e2b
histedit: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
17131
diff
changeset
|
449 ('r', 'rev', [], _('first revision to be edited'))], |
19622
3d0ece7523c8
histedit: add description about "histedit --outgoing" to command help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19621
diff
changeset
|
450 _("ANCESTOR | --outgoing [URL]")) |
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
|
451 def histedit(ui, repo, *freeargs, **opts): |
17131
4fb2d3d16743
histedit: add extension docstring from external README
Augie Fackler <raf@durin42.com>
parents:
17130
diff
changeset
|
452 """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
|
453 |
11de0651d3b6
histedit: add description about basic histedit function to command help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19519
diff
changeset
|
454 This command edits changesets between ANCESTOR and the parent of |
11de0651d3b6
histedit: add description about basic histedit function to command help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19519
diff
changeset
|
455 the working directory. |
19622
3d0ece7523c8
histedit: add description about "histedit --outgoing" to command help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19621
diff
changeset
|
456 |
3d0ece7523c8
histedit: add description about "histedit --outgoing" to command help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19621
diff
changeset
|
457 With --outgoing, this edits changesets not found in the |
3d0ece7523c8
histedit: add description about "histedit --outgoing" to command help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19621
diff
changeset
|
458 destination repository. If URL of the destination is omitted, the |
3d0ece7523c8
histedit: add description about "histedit --outgoing" to command help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19621
diff
changeset
|
459 'default-push' (or 'default') path will be used. |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
460 """ |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
461 # TODO only abort if we try and histedit mq patches, not just |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
462 # blanket if mq patches are applied somewhere |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
463 mq = getattr(repo, 'mq', None) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
464 if mq and mq.applied: |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
465 raise util.Abort(_('source has mq patches applied')) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
466 |
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
|
467 # basic argument incompatibility processing |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
468 outg = opts.get('outgoing') |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
469 cont = opts.get('continue') |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
470 abort = opts.get('abort') |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
471 force = opts.get('force') |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
472 rules = opts.get('commands', '') |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
473 revs = opts.get('rev', []) |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
474 goal = 'new' # This invocation goal, in new, continue, abort |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
475 if force and not 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
|
476 raise util.Abort(_('--force only allowed with --outgoing')) |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
477 if cont: |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
478 if util.any((outg, abort, revs, freeargs, rules)): |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
479 raise util.Abort(_('no arguments allowed with --continue')) |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
480 goal = 'continue' |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
481 elif abort: |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
482 if util.any((outg, revs, freeargs, rules)): |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
483 raise util.Abort(_('no arguments allowed with --abort')) |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
484 goal = 'abort' |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
485 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
|
486 if os.path.exists(os.path.join(repo.path, 'histedit-state')): |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
487 raise util.Abort(_('history edit already in progress, try ' |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
488 '--continue or --abort')) |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
489 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
|
490 if revs: |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
491 raise util.Abort(_('no revisions allowed with --outgoing')) |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
492 if len(freeargs) > 1: |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
493 raise util.Abort( |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
494 _('only one repo argument allowed with --outgoing')) |
12c06686d371
histedit: move all arguments checks to the beginning of the command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19018
diff
changeset
|
495 else: |
19021
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
496 revs.extend(freeargs) |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
497 if len(revs) != 1: |
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
|
498 raise util.Abort( |
19621
11de0651d3b6
histedit: add description about basic histedit function to command help
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19519
diff
changeset
|
499 _('histedit requires exactly one ancestor revision')) |
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
|
500 |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
501 |
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
|
502 if goal == 'continue': |
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
|
503 (parentctxnode, rules, keep, topmost, replacements) = readstate(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
|
504 currentparent, wantnull = repo.dirstate.parents() |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
505 parentctx = repo[parentctxnode] |
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
|
506 parentctx, repl = bootstrapcontinue(ui, repo, parentctx, rules, opts) |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
507 replacements.extend(repl) |
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
|
508 elif goal == 'abort': |
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
|
509 (parentctxnode, rules, keep, topmost, replacements) = readstate(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
|
510 mapping, tmpnodes, leafs, _ntm = processreplacement(repo, replacements) |
17665
b65533958b85
histedit: rename `tip` to `topmost`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17664
diff
changeset
|
511 ui.debug('restore wc to old parent %s\n' % node.short(topmost)) |
19519
c2a479a058d0
histedit: don't clobber working copy on --abort if not on histedit cset
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
512 # check whether we should update away |
c2a479a058d0
histedit: don't clobber working copy on --abort if not on histedit cset
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
513 parentnodes = [c.node() for c in repo[None].parents()] |
c2a479a058d0
histedit: don't clobber working copy on --abort if not on histedit cset
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
514 for n in leafs | set([parentctxnode]): |
c2a479a058d0
histedit: don't clobber working copy on --abort if not on histedit cset
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
515 if n in parentnodes: |
c2a479a058d0
histedit: don't clobber working copy on --abort if not on histedit cset
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
516 hg.clean(repo, topmost) |
c2a479a058d0
histedit: don't clobber working copy on --abort if not on histedit cset
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
517 break |
c2a479a058d0
histedit: don't clobber working copy on --abort if not on histedit cset
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
518 else: |
c2a479a058d0
histedit: don't clobber working copy on --abort if not on histedit cset
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
519 pass |
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
|
520 cleanupnode(ui, repo, 'created', 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
|
521 cleanupnode(ui, repo, 'temp', leafs) |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
522 os.unlink(os.path.join(repo.path, 'histedit-state')) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
523 return |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
524 else: |
19479
11664641fbad
histedit: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19473
diff
changeset
|
525 cmdutil.checkunfinished(repo) |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
526 cmdutil.bailifchanged(repo) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
527 |
17665
b65533958b85
histedit: rename `tip` to `topmost`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17664
diff
changeset
|
528 topmost, empty = repo.dirstate.parents() |
19021
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
529 if outg: |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
530 if freeargs: |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
531 remote = freeargs[0] |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
532 else: |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
533 remote = None |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
534 root = findoutgoing(ui, repo, remote, force, opts) |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
535 else: |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
536 root = revs[0] |
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
537 root = scmutil.revsingle(repo, root).node() |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
538 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
539 keep = opts.get('keep', False) |
19021
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
540 revs = between(repo, root, topmost, keep) |
17766
d9da327516f8
histedit: clean abort when there is nothing to edit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17765
diff
changeset
|
541 if not revs: |
18608
3adbd57e1794
histedit: report when revisions to edit are not ancestors of working dir
Simon Heimberg <simohe@besonet.ch>
parents:
18507
diff
changeset
|
542 raise util.Abort(_('%s is not an ancestor of working directory') % |
19021
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
543 node.short(root)) |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
544 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
545 ctxs = [repo[r] for r in revs] |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
546 if not rules: |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
547 rules = '\n'.join([makedesc(c) for c in ctxs]) |
17315
f320d7ed912f
histedit: make comment part of the file describing rules as translatable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17285
diff
changeset
|
548 rules += '\n\n' |
19021
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
549 rules += editcomment % (node.short(root), node.short(topmost)) |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
550 rules = ui.edit(rules, ui.username()) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
551 # Save edit rules in .hg/histedit-last-edit.txt in case |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
552 # the user needs to ask for help after something |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
553 # surprising happens. |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
554 f = open(repo.join('histedit-last-edit.txt'), 'w') |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
555 f.write(rules) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
556 f.close() |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
557 else: |
19018
730614b9b352
histedit: allow "-" as a command file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19017
diff
changeset
|
558 if rules == '-': |
730614b9b352
histedit: allow "-" as a command file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19017
diff
changeset
|
559 f = sys.stdin |
730614b9b352
histedit: allow "-" as a command file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19017
diff
changeset
|
560 else: |
730614b9b352
histedit: allow "-" as a command file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19017
diff
changeset
|
561 f = open(rules) |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
562 rules = f.read() |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
563 f.close() |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
564 rules = [l for l in (r.strip() for r in rules.splitlines()) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
565 if l and not l[0] == '#'] |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
566 rules = verifyrules(rules, repo, ctxs) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
567 |
19021
26b41a902195
histedit: move outgoing processing to its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19020
diff
changeset
|
568 parentctx = repo[root].parents()[0] |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
569 keep = opts.get('keep', False) |
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
|
570 replacements = [] |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
571 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
572 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
573 while rules: |
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
|
574 writestate(repo, parentctx.node(), rules, keep, topmost, replacements) |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
575 action, ha = rules.pop(0) |
17645
4721fc933943
histedit: display action being processed in debug mode
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17644
diff
changeset
|
576 ui.debug('histedit: processing %s %s\n' % (action, ha)) |
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
|
577 actfunc = actiontable[action] |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
578 parentctx, replacement_ = actfunc(ui, repo, parentctx, ha, opts) |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
579 replacements.extend(replacement_) |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
580 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
581 hg.update(repo, parentctx.node()) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
582 |
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
|
583 mapping, tmpnodes, created, ntm = processreplacement(repo, 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
|
584 if 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
|
585 for prec, succs in mapping.iteritems(): |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
586 if not 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
|
587 ui.debug('histedit: %s is dropped\n' % node.short(prec)) |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
588 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
|
589 ui.debug('histedit: %s is replaced by %s\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
|
590 node.short(prec), node.short(succs[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
|
591 if len(succs) > 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
|
592 m = 'histedit: %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
|
593 for n in succs[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
|
594 ui.debug(m % node.short(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
|
595 |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
596 if not 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
|
597 if 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
|
598 movebookmarks(ui, repo, mapping, topmost, ntm) |
17663
c6de8c696644
histedit: extract bookmark logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17662
diff
changeset
|
599 # TODO update mq state |
17759
9c7497cd39fd
histedit: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17758
diff
changeset
|
600 if obsolete._enabled: |
9c7497cd39fd
histedit: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17758
diff
changeset
|
601 markers = [] |
17771
dcfa526b180b
histedit: create obsolescence markers in deterministic order
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17769
diff
changeset
|
602 # sort by revision number because it sound "right" |
dcfa526b180b
histedit: create obsolescence markers in deterministic order
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17769
diff
changeset
|
603 for prec in sorted(mapping, key=repo.changelog.rev): |
dcfa526b180b
histedit: create obsolescence markers in deterministic order
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17769
diff
changeset
|
604 succs = mapping[prec] |
17759
9c7497cd39fd
histedit: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17758
diff
changeset
|
605 markers.append((repo[prec], |
9c7497cd39fd
histedit: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17758
diff
changeset
|
606 tuple(repo[s] for s in succs))) |
9c7497cd39fd
histedit: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17758
diff
changeset
|
607 if markers: |
9c7497cd39fd
histedit: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17758
diff
changeset
|
608 obsolete.createmarkers(repo, markers) |
9c7497cd39fd
histedit: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17758
diff
changeset
|
609 else: |
9c7497cd39fd
histedit: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17758
diff
changeset
|
610 cleanupnode(ui, repo, 'replaced', mapping) |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
611 |
17664
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
612 cleanupnode(ui, repo, 'temp', tmpnodes) |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
613 os.unlink(os.path.join(repo.path, 'histedit-state')) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
614 if os.path.exists(repo.sjoin('undo')): |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
615 os.unlink(repo.sjoin('undo')) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
616 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
617 |
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
|
618 def bootstrapcontinue(ui, repo, parentctx, rules, opts): |
17666
5b6c8f2fbda5
histedit: move `continue` logic into a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17665
diff
changeset
|
619 action, currentnode = rules.pop(0) |
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
|
620 ctx = repo[currentnode] |
17749
40601f2b7608
histedit: simplify computation of `newchildren` during --continue
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17666
diff
changeset
|
621 # is there any new commit between the expected parent and "." |
40601f2b7608
histedit: simplify computation of `newchildren` during --continue
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17666
diff
changeset
|
622 # |
40601f2b7608
histedit: simplify computation of `newchildren` during --continue
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17666
diff
changeset
|
623 # note: does not take non linear new change in account (but previous |
40601f2b7608
histedit: simplify computation of `newchildren` during --continue
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17666
diff
changeset
|
624 # implementation didn't used them anyway (issue3655) |
40601f2b7608
histedit: simplify computation of `newchildren` during --continue
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17666
diff
changeset
|
625 newchildren = [c.node() for c in repo.set('(%d::.)', parentctx)] |
18913
79580b3140cd
histedit: support editing of the first commit (issue3767)
Bryan O'Sullivan <bryano@fb.com>
parents:
18644
diff
changeset
|
626 if parentctx.node() != node.nullid: |
79580b3140cd
histedit: support editing of the first commit (issue3767)
Bryan O'Sullivan <bryano@fb.com>
parents:
18644
diff
changeset
|
627 if not newchildren: |
79580b3140cd
histedit: support editing of the first commit (issue3767)
Bryan O'Sullivan <bryano@fb.com>
parents:
18644
diff
changeset
|
628 # `parentctxnode` should match but no result. This means that |
79580b3140cd
histedit: support editing of the first commit (issue3767)
Bryan O'Sullivan <bryano@fb.com>
parents:
18644
diff
changeset
|
629 # currentnode is not a descendant from parentctxnode. |
79580b3140cd
histedit: support editing of the first commit (issue3767)
Bryan O'Sullivan <bryano@fb.com>
parents:
18644
diff
changeset
|
630 msg = _('%s is not an ancestor of working directory') |
79580b3140cd
histedit: support editing of the first commit (issue3767)
Bryan O'Sullivan <bryano@fb.com>
parents:
18644
diff
changeset
|
631 hint = _('update to %s or descendant and run "hg histedit ' |
79580b3140cd
histedit: support editing of the first commit (issue3767)
Bryan O'Sullivan <bryano@fb.com>
parents:
18644
diff
changeset
|
632 '--continue" again') % parentctx |
79580b3140cd
histedit: support editing of the first commit (issue3767)
Bryan O'Sullivan <bryano@fb.com>
parents:
18644
diff
changeset
|
633 raise util.Abort(msg % parentctx, hint=hint) |
79580b3140cd
histedit: support editing of the first commit (issue3767)
Bryan O'Sullivan <bryano@fb.com>
parents:
18644
diff
changeset
|
634 newchildren.pop(0) # remove parentctxnode |
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
|
635 # Commit dirty working directory if necessary |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
636 new = None |
17666
5b6c8f2fbda5
histedit: move `continue` logic into a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17665
diff
changeset
|
637 m, a, r, d = repo.status()[:4] |
5b6c8f2fbda5
histedit: move `continue` logic into a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17665
diff
changeset
|
638 if m or a or r or d: |
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
|
639 # prepare the message for the commit to comes |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
640 if action in ('f', 'fold'): |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
641 message = 'fold-temp-revision %s' % currentnode |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
642 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
|
643 message = ctx.description() + '\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
|
644 if action in ('e', 'edit', 'm', 'mess'): |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
645 editor = cmdutil.commitforceeditor |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
646 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
|
647 editor = False |
18436
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
648 commit = commitfuncfor(repo, ctx) |
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
649 new = commit(text=message, user=ctx.user(), |
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
650 date=ctx.date(), extra=ctx.extra(), |
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
651 editor=editor) |
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
|
652 if new is not 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
|
653 newchildren.append(new) |
17666
5b6c8f2fbda5
histedit: move `continue` logic into a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17665
diff
changeset
|
654 |
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
|
655 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
|
656 # track 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
|
657 if ctx.node() not in newchildren: |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
658 # note: new children may be empty when the changeset is dropped. |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
659 # this happen e.g during conflicting pick where we revert content |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
660 # to parent. |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
661 replacements.append((ctx.node(), tuple(newchildren))) |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
662 |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
663 if action in ('f', 'fold'): |
19017
c5c8613f265e
histedit: properly handle --continue on empty fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18995
diff
changeset
|
664 if newchildren: |
c5c8613f265e
histedit: properly handle --continue on empty fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18995
diff
changeset
|
665 # finalize fold operation if applicable |
c5c8613f265e
histedit: properly handle --continue on empty fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18995
diff
changeset
|
666 if new is None: |
c5c8613f265e
histedit: properly handle --continue on empty fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18995
diff
changeset
|
667 new = newchildren[-1] |
c5c8613f265e
histedit: properly handle --continue on empty fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18995
diff
changeset
|
668 else: |
c5c8613f265e
histedit: properly handle --continue on empty fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18995
diff
changeset
|
669 newchildren.pop() # remove new from internal changes |
c5c8613f265e
histedit: properly handle --continue on empty fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18995
diff
changeset
|
670 parentctx, repl = finishfold(ui, repo, parentctx, ctx, new, opts, |
c5c8613f265e
histedit: properly handle --continue on empty fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18995
diff
changeset
|
671 newchildren) |
c5c8613f265e
histedit: properly handle --continue on empty fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18995
diff
changeset
|
672 replacements.extend(repl) |
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
|
673 else: |
19017
c5c8613f265e
histedit: properly handle --continue on empty fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18995
diff
changeset
|
674 # newchildren is empty if the fold did not result in any commit |
c5c8613f265e
histedit: properly handle --continue on empty fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18995
diff
changeset
|
675 # this happen when all folded change are discarded during the |
c5c8613f265e
histedit: properly handle --continue on empty fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18995
diff
changeset
|
676 # merge. |
c5c8613f265e
histedit: properly handle --continue on empty fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18995
diff
changeset
|
677 replacements.append((ctx.node(), (parentctx.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
|
678 elif newchildren: |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18609
diff
changeset
|
679 # otherwise update "parentctx" before proceeding to further operation |
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
|
680 parentctx = repo[newchildren[-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
|
681 return parentctx, replacements |
17666
5b6c8f2fbda5
histedit: move `continue` logic into a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17665
diff
changeset
|
682 |
5b6c8f2fbda5
histedit: move `continue` logic into a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17665
diff
changeset
|
683 |
17642
bea381c16809
histedit: move `between function` outside the action logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17641
diff
changeset
|
684 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
|
685 """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
|
686 |
bea381c16809
histedit: move `between function` outside the action logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17641
diff
changeset
|
687 When keep is false, the specified set can't have children.""" |
17765
ef7760f0be87
histedit: rename `revs` in `ctxs` inside the `between` function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17762
diff
changeset
|
688 ctxs = list(repo.set('%n::%n', old, new)) |
17766
d9da327516f8
histedit: clean abort when there is nothing to edit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17765
diff
changeset
|
689 if ctxs and not keep: |
18165
0f5a0a2073a8
histedit: allow operation from non-head if obsolete is enabled
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17922
diff
changeset
|
690 if (not obsolete._enabled and |
18270
48deb483a8f8
clfilter: drop unnecessary explicit filtering on histedit
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18165
diff
changeset
|
691 repo.revs('(%ld::) - (%ld)', ctxs, ctxs)): |
17762
57f27cbfc5bb
histedit: refuse to edit public changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17761
diff
changeset
|
692 raise util.Abort(_('cannot edit history that would orphan nodes')) |
19473
10a0ae668fe6
histedit: refuse to edit history that contains merges (issue3962)
Augie Fackler <raf@durin42.com>
parents:
19393
diff
changeset
|
693 if repo.revs('(%ld) and merge()', ctxs): |
10a0ae668fe6
histedit: refuse to edit history that contains merges (issue3962)
Augie Fackler <raf@durin42.com>
parents:
19393
diff
changeset
|
694 raise util.Abort(_('cannot edit history that contains merges')) |
17767
a787e46d3b94
histedit: do not use "min" on ctx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17766
diff
changeset
|
695 root = ctxs[0] # list is already sorted by repo.set |
17762
57f27cbfc5bb
histedit: refuse to edit public changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17761
diff
changeset
|
696 if not root.phase(): |
57f27cbfc5bb
histedit: refuse to edit public changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17761
diff
changeset
|
697 raise util.Abort(_('cannot edit immutable changeset: %s') % root) |
17765
ef7760f0be87
histedit: rename `revs` in `ctxs` inside the `between` function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17762
diff
changeset
|
698 return [c.node() for c in ctxs] |
17642
bea381c16809
histedit: move `between function` outside the action logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17641
diff
changeset
|
699 |
bea381c16809
histedit: move `between function` outside the action logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17641
diff
changeset
|
700 |
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
|
701 def writestate(repo, parentnode, rules, keep, topmost, replacements): |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
702 fp = open(os.path.join(repo.path, 'histedit-state'), 'w') |
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
|
703 pickle.dump((parentnode, rules, keep, topmost, replacements), fp) |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
704 fp.close() |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
705 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
706 def readstate(repo): |
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
|
707 """Returns a tuple of (parentnode, rules, keep, topmost, replacements). |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
708 """ |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
709 fp = open(os.path.join(repo.path, 'histedit-state')) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
710 return pickle.load(fp) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
711 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
712 |
17643
64e0f0cfb569
histedit: move makedesc function near other rules related function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17642
diff
changeset
|
713 def makedesc(c): |
64e0f0cfb569
histedit: move makedesc function near other rules related function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17642
diff
changeset
|
714 """build a initial action line for a ctx `c` |
64e0f0cfb569
histedit: move makedesc function near other rules related function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17642
diff
changeset
|
715 |
64e0f0cfb569
histedit: move makedesc function near other rules related function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17642
diff
changeset
|
716 line are in the form: |
64e0f0cfb569
histedit: move makedesc function near other rules related function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17642
diff
changeset
|
717 |
64e0f0cfb569
histedit: move makedesc function near other rules related function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17642
diff
changeset
|
718 pick <hash> <rev> <summary> |
64e0f0cfb569
histedit: move makedesc function near other rules related function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17642
diff
changeset
|
719 """ |
64e0f0cfb569
histedit: move makedesc function near other rules related function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17642
diff
changeset
|
720 summary = '' |
64e0f0cfb569
histedit: move makedesc function near other rules related function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17642
diff
changeset
|
721 if c.description(): |
64e0f0cfb569
histedit: move makedesc function near other rules related function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17642
diff
changeset
|
722 summary = c.description().splitlines()[0] |
17662
4f2390e3f4b0
histedit: remove all usages of hex[:12]
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17647
diff
changeset
|
723 line = 'pick %s %d %s' % (c, c.rev(), summary) |
17643
64e0f0cfb569
histedit: move makedesc function near other rules related function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17642
diff
changeset
|
724 return line[:80] # trim to 80 chars so it's not stupidly wide in my editor |
64e0f0cfb569
histedit: move makedesc function near other rules related function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17642
diff
changeset
|
725 |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
726 def verifyrules(rules, repo, ctxs): |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
727 """Verify that there exists exactly one edit rule per given changeset. |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
728 |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
729 Will abort if there are to many or too few rules, a malformed rule, |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
730 or a rule on a changeset outside of the user-given range. |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
731 """ |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
732 parsed = [] |
19046
36adbbe960ca
histedit: track short hash instead of changectx object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19045
diff
changeset
|
733 expected = set(str(c) for c in ctxs) |
19047
81de87f8b480
histedit: protect against duplicated entries
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19046
diff
changeset
|
734 seen = set() |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
735 for r in rules: |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
736 if ' ' not in r: |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
737 raise util.Abort(_('malformed line "%s"') % r) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
738 action, rest = r.split(' ', 1) |
19039
41669a18a7d6
histedit: handle multiple spaces between action and hash (issue3893)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19021
diff
changeset
|
739 ha = rest.strip().split(' ', 1)[0] |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
740 try: |
19045
080b801c34f1
histedit: ensure rules return short hex at all time
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19039
diff
changeset
|
741 ha = str(repo[ha]) # ensure its a short hash |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
742 except error.RepoError: |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
743 raise util.Abort(_('unknown changeset %s listed') % ha) |
19046
36adbbe960ca
histedit: track short hash instead of changectx object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19045
diff
changeset
|
744 if ha not in expected: |
19045
080b801c34f1
histedit: ensure rules return short hex at all time
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19039
diff
changeset
|
745 raise util.Abort( |
080b801c34f1
histedit: ensure rules return short hex at all time
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19039
diff
changeset
|
746 _('may not use changesets other than the ones listed')) |
19047
81de87f8b480
histedit: protect against duplicated entries
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19046
diff
changeset
|
747 if ha in seen: |
81de87f8b480
histedit: protect against duplicated entries
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19046
diff
changeset
|
748 raise util.Abort(_('duplicated command for changeset %s') % ha) |
81de87f8b480
histedit: protect against duplicated entries
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19046
diff
changeset
|
749 seen.add(ha) |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
750 if action not in actiontable: |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
751 raise util.Abort(_('unknown action "%s"') % action) |
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
752 parsed.append([action, ha]) |
19048
1163ff06ce89
histedit: more precise user message when changeset is missing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19047
diff
changeset
|
753 missing = sorted(expected - seen) # sort to stabilize output |
1163ff06ce89
histedit: more precise user message when changeset is missing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19047
diff
changeset
|
754 if missing: |
1163ff06ce89
histedit: more precise user message when changeset is missing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19047
diff
changeset
|
755 raise util.Abort(_('missing rules for changeset %s') % missing[0], |
1163ff06ce89
histedit: more precise user message when changeset is missing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19047
diff
changeset
|
756 hint=_('do you want to use the drop action?')) |
17064
168cc52ad7c2
histedit: new extension for interactive history editing
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
757 return parsed |
17663
c6de8c696644
histedit: extract bookmark logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17662
diff
changeset
|
758 |
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
|
759 def processreplacement(repo, 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
|
760 """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
|
761 |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
762 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
|
763 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
|
764 3) the list of new commit 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
|
765 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
|
766 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
|
767 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
|
768 # initialise basic 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
|
769 # fullmapping record all operation recorded in replacement |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
770 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
|
771 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
|
772 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
|
773 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
|
774 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
|
775 tmpnodes = 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
|
776 # Reduce content fullmapping into direct relation between original 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
|
777 # 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
|
778 # 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
|
779 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
|
780 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
|
781 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
|
782 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
|
783 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
|
784 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
|
785 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
|
786 # 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
|
787 # 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
|
788 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
|
789 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
|
790 # 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
|
791 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
|
792 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
|
793 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
|
794 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
|
795 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
|
796 # 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
|
797 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
|
798 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
|
799 # 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
|
800 # turn `final` into list (topologically sorted) |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
801 nm = repo.changelog.nodemap |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
802 for prec, succs in final.items(): |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
803 final[prec] = sorted(succs, key=nm.get) |
17663
c6de8c696644
histedit: extract bookmark logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17662
diff
changeset
|
804 |
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
|
805 # 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
|
806 if new: |
17769
8672e615d81c
histedit: max(x, key=y) and min(x, key=y) are not available in python 2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
17767
diff
changeset
|
807 newtopmost = sorted(new, key=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
|
808 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
|
809 # 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
|
810 # 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
|
811 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
|
812 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
|
813 # every body died. The newtopmost is the parent of the root. |
17769
8672e615d81c
histedit: max(x, key=y) and min(x, key=y) are not available in python 2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
17767
diff
changeset
|
814 newtopmost = repo[sorted(final, key=repo.changelog.rev)[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
|
815 |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
816 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
|
817 |
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
|
818 def movebookmarks(ui, repo, mapping, oldtopmost, 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
|
819 """Move bookmark from old to newly created node""" |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
820 if not 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
|
821 # if nothing got rewritten there is not purpose for this function |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
822 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
|
823 moves = [] |
18370
c605e12dd622
histedit: process bookmarks in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents:
18324
diff
changeset
|
824 for bk, old in sorted(repo._bookmarks.iteritems()): |
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
|
825 if old == oldtopmost: |
18436
b38c10502af9
histedit: factor most commit creation in a function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18370
diff
changeset
|
826 # special case ensure bookmark stay on tip. |
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
|
827 # |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
828 # This is arguably a feature and we may only want that for the |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
829 # active bookmark. But the behavior is kept compatible with the old |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
830 # version for 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
|
831 moves.append((bk, 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
|
832 continue |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
833 base = old |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
834 new = mapping.get(base, 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
|
835 if new is 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
|
836 continue |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
837 while not new: |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
838 # base is killed, trying with parent |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
839 base = repo[base].p1().node() |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
840 new = mapping.get(base, (base,)) |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
841 # nothing to move |
5863f0e4cd3a
histedit: replace various nodes lists with replacement graph (and issue3582)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17757
diff
changeset
|
842 moves.append((bk, new[-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
|
843 if moves: |
17922
7f5dab94e48c
bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents:
17771
diff
changeset
|
844 marks = repo._bookmarks |
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
|
845 for mark, new in moves: |
17922
7f5dab94e48c
bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents:
17771
diff
changeset
|
846 old = marks[mark] |
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
|
847 ui.note(_('histedit: moving bookmarks %s from %s to %s\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
|
848 % (mark, node.short(old), node.short(new))) |
17922
7f5dab94e48c
bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents:
17771
diff
changeset
|
849 marks[mark] = new |
7f5dab94e48c
bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents:
17771
diff
changeset
|
850 marks.write() |
17664
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
851 |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
852 def cleanupnode(ui, repo, name, nodes): |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
853 """strip a group of nodes from the repository |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
854 |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
855 The set of node to strip may contains unknown nodes.""" |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
856 ui.debug('should strip %s nodes %s\n' % |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
857 (name, ', '.join([node.short(n) for n in nodes]))) |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
858 lock = None |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
859 try: |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
860 lock = repo.lock() |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
861 # Find all node that need to be stripped |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
862 # (we hg %lr instead of %ln to silently ignore unknown item |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
863 nm = repo.changelog.nodemap |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
864 nodes = [n for n in nodes if n in nm] |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
865 roots = [c.node() for c in repo.set("roots(%ln)", nodes)] |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
866 for c in roots: |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
867 # We should process node in reverse order to strip tip most first. |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
868 # but this trigger a bug in changegroup hook. |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
869 # This would reduce bundle overhead |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
870 repair.strip(ui, repo, c) |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
871 finally: |
4eb13b619785
histedit: factorise node stripping logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17663
diff
changeset
|
872 lockmod.release(lock) |
19215
f184fe1e2ac5
summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents:
19048
diff
changeset
|
873 |
f184fe1e2ac5
summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents:
19048
diff
changeset
|
874 def summaryhook(ui, repo): |
f184fe1e2ac5
summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents:
19048
diff
changeset
|
875 if not os.path.exists(repo.join('histedit-state')): |
f184fe1e2ac5
summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents:
19048
diff
changeset
|
876 return |
f184fe1e2ac5
summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents:
19048
diff
changeset
|
877 (parentctxnode, rules, keep, topmost, replacements) = readstate(repo) |
f184fe1e2ac5
summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents:
19048
diff
changeset
|
878 if rules: |
f184fe1e2ac5
summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents:
19048
diff
changeset
|
879 # i18n: column positioning for "hg summary" |
f184fe1e2ac5
summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents:
19048
diff
changeset
|
880 ui.write(_('hist: %s (histedit --continue)\n') % |
f184fe1e2ac5
summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents:
19048
diff
changeset
|
881 (ui.label(_('%d remaining'), 'histedit.remaining') % |
f184fe1e2ac5
summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents:
19048
diff
changeset
|
882 len(rules))) |
f184fe1e2ac5
summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents:
19048
diff
changeset
|
883 |
f184fe1e2ac5
summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents:
19048
diff
changeset
|
884 def extsetup(ui): |
f184fe1e2ac5
summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents:
19048
diff
changeset
|
885 cmdutil.summaryhooks.add('histedit', summaryhook) |
19479
11664641fbad
histedit: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19473
diff
changeset
|
886 cmdutil.unfinishedstates.append( |
19496
607191a45f8c
checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents:
19479
diff
changeset
|
887 ['histedit-state', False, True, _('histedit in progress'), |
19479
11664641fbad
histedit: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19473
diff
changeset
|
888 _("use 'hg histedit --continue' or 'hg histedit --abort'")]) |