annotate hgext/split.py @ 50225:53ca3e3bc013 stable

rhg: fix race when a fixup file is deleted on disk See next changeset for the other race in the same kind of logic and why there are two different places.
author Raphaël Gomès <rgomes@octobus.net>
date Mon, 27 Feb 2023 15:18:50 +0100
parents 6000f5b25c9b
children c166b212bdee
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
1 # split.py - split a changeset into smaller ones
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
2 #
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
3 # Copyright 2015 Laurent Charignon <lcharignon@fb.com>
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
4 # Copyright 2017 Facebook, Inc.
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
5 #
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
6 # This software may be used and distributed according to the terms of the
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
7 # GNU General Public License version 2 or any later version.
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
8 """command to split a changeset into smaller ones (EXPERIMENTAL)"""
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
9
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
10
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
11 from mercurial.i18n import _
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
12
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
13 from mercurial.node import (
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46758
diff changeset
14 nullrev,
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
15 short,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
16 )
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
17
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
18 from mercurial import (
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
19 bookmarks,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
20 cmdutil,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
21 commands,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
22 error,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
23 hg,
48116
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 46924
diff changeset
24 logcmdutil,
36400
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35455
diff changeset
25 pycompat,
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
26 registrar,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
27 revsetlang,
43935
2349a60f33db split: use rewriteutil.precheck() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43641
diff changeset
28 rewriteutil,
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
29 scmutil,
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
30 util,
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
31 )
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
32
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
33 # allow people to use split without explicitly enabling rebase extension
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
34 from . import rebase
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
35
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
36 cmdtable = {}
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
37 command = registrar.command(cmdtable)
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
38
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
39 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
40 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
41 # be specifying the version(s) of Mercurial they are tested with, or
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
42 # leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
43 testedwith = b'ships-with-hg-core'
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
44
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
45
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
46 @command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
47 b'split',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
48 [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
49 (b'r', b'rev', b'', _(b"revision to split"), _(b'REV')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
50 (b'', b'rebase', True, _(b'rebase descendants after split')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
51 ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
52 + cmdutil.commitopts2,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
53 _(b'hg split [--no-rebase] [[-r] REV]'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
54 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
55 helpbasic=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
56 )
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
57 def split(ui, repo, *revs, **opts):
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
58 """split a changeset into smaller ones
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
59
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
60 Repeatedly prompt changes and commit message for new changesets until there
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
61 is nothing left in the original changeset.
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
62
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
63 If --rev was not given, split the working directory parent.
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
64
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
65 By default, rebase connected non-obsoleted descendants onto the new
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
66 changeset. Use --no-rebase to avoid the rebase.
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
67 """
38069
5ba0cf22e4d0 py3: fix kwargs handling in hgext/split.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36408
diff changeset
68 opts = pycompat.byteskwargs(opts)
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
69 revlist = []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
70 if opts.get(b'rev'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
71 revlist.append(opts.get(b'rev'))
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
72 revlist.extend(revs)
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
73 with repo.wlock(), repo.lock():
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
74 tr = repo.transaction(b'split')
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
75 # If the rebase somehow runs into conflicts, make sure
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
76 # we close the transaction so the user can continue it.
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
77 with util.acceptintervention(tr):
48116
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 46924
diff changeset
78 revs = logcmdutil.revrange(repo, revlist or [b'.'])
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
79 if len(revs) > 1:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
80 raise error.InputError(_(b'cannot split multiple revisions'))
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
81
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
82 rev = revs.first()
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46758
diff changeset
83 # Handle nullrev specially here (instead of leaving for precheck()
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
84 # below) so we get a nicer message and error code.
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46758
diff changeset
85 if rev is None or rev == nullrev:
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
86 ui.status(_(b'nothing to split\n'))
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
87 return 1
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46758
diff changeset
88 ctx = repo[rev]
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
89 if ctx.node() is None:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
90 raise error.InputError(_(b'cannot split working directory'))
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
91
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
92 if opts.get(b'rebase'):
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
93 # Skip obsoleted descendants and their descendants so the rebase
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
94 # won't cause conflicts for sure.
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
95 descendants = list(repo.revs(b'(%d::) - (%d)', rev, rev))
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
96 torebase = list(
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
97 repo.revs(
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
98 b'%ld - (%ld & obsolete())::', descendants, descendants
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
99 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
100 )
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
101 else:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
102 torebase = []
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
103 rewriteutil.precheck(repo, [rev] + torebase, b'split')
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
104
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
105 if len(ctx.parents()) > 1:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
106 raise error.InputError(_(b'cannot split a merge changeset'))
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
107
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
108 cmdutil.bailifchanged(repo)
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
109
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
110 # Deactivate bookmark temporarily so it won't get moved
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
111 # unintentionally
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
112 bname = repo._activebookmark
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
113 if bname and repo._bookmarks[bname] != ctx.node():
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
114 bookmarks.deactivate(repo)
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
115
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
116 wnode = repo[b'.'].node()
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
117 top = None
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
118 try:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
119 top = dosplit(ui, repo, tr, ctx, opts)
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
120 finally:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
121 # top is None: split failed, need update --clean recovery.
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
122 # wnode == ctx.node(): wnode split, no need to update.
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
123 if top is None or wnode != ctx.node():
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
124 hg.clean(repo, wnode, show_stats=False)
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
125 if bname:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
126 bookmarks.activate(repo, bname)
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
127 if torebase and top:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
128 dorebase(ui, repo, torebase, top)
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
129
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
130
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
131 def dosplit(ui, repo, tr, ctx, opts):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
132 committed = [] # [ctx]
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
133
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
134 # Set working parent to ctx.p1(), and keep working copy as ctx's content
41966
42e2c7c52e1b split: use the new movedirstate() we now have in scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 40295
diff changeset
135 if ctx.node() != repo.dirstate.p1():
42e2c7c52e1b split: use the new movedirstate() we now have in scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 40295
diff changeset
136 hg.clean(repo, ctx.node(), show_stats=False)
42e2c7c52e1b split: use the new movedirstate() we now have in scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 40295
diff changeset
137 with repo.dirstate.parentchange():
42e2c7c52e1b split: use the new movedirstate() we now have in scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 40295
diff changeset
138 scmutil.movedirstate(repo, ctx.p1())
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
139
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
140 # Any modified, added, removed, deleted result means split is incomplete
43641
705738def50c split: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
141 def incomplete(repo):
705738def50c split: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
142 st = repo.status()
705738def50c split: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
143 return any((st.modified, st.added, st.removed, st.deleted))
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
144
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
145 # Main split loop
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
146 while incomplete(repo):
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
147 if committed:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
148 header = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
149 b'HG: Splitting %s. So far it has been split into:\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
150 ) % short(ctx.node())
45856
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
151 # We don't want color codes in the commit message template, so
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
152 # disable the label() template function while we render it.
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
153 with ui.configoverride(
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
154 {(b'templatealias', b'label(l,x)'): b"x"}, b'split'
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
155 ):
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
156 for c in committed:
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
157 summary = cmdutil.format_changeset_summary(ui, c, b'split')
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
158 header += _(b'HG: - %s\n') % summary
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
159 header += _(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43077
diff changeset
160 b'HG: Write commit message for the next split changeset.\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
161 )
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
162 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
163 header = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
164 b'HG: Splitting %s. Write commit message for the '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
165 b'first split changeset.\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
166 ) % short(ctx.node())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
167 opts.update(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
168 {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
169 b'edit': True,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
170 b'interactive': True,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
171 b'message': header + ctx.description(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
172 }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
173 )
46923
8ee1ac083ee7 split: fix issue with empty splits adjusting phases
Kyle Lippincott <spectral@google.com>
parents: 46843
diff changeset
174 origctx = repo[b'.']
36400
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35455
diff changeset
175 commands.commit(ui, repo, **pycompat.strkwargs(opts))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
176 newctx = repo[b'.']
46923
8ee1ac083ee7 split: fix issue with empty splits adjusting phases
Kyle Lippincott <spectral@google.com>
parents: 46843
diff changeset
177 # Ensure user didn't do a "no-op" split (such as deselecting
8ee1ac083ee7 split: fix issue with empty splits adjusting phases
Kyle Lippincott <spectral@google.com>
parents: 46843
diff changeset
178 # everything).
8ee1ac083ee7 split: fix issue with empty splits adjusting phases
Kyle Lippincott <spectral@google.com>
parents: 46843
diff changeset
179 if origctx.node() != newctx.node():
8ee1ac083ee7 split: fix issue with empty splits adjusting phases
Kyle Lippincott <spectral@google.com>
parents: 46843
diff changeset
180 committed.append(newctx)
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
181
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
182 if not committed:
45876
568c05d8f3d2 errors: raise InputError in `hg split`
Martin von Zweigbergk <martinvonz@google.com>
parents: 45856
diff changeset
183 raise error.InputError(_(b'cannot split an empty revision'))
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
184
46924
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
185 if len(committed) != 1 or committed[0].node() != ctx.node():
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
186 # Ensure we don't strip a node if we produce the same commit as already
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
187 # exists
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
188 scmutil.cleanupnodes(
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
189 repo,
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
190 {ctx.node(): [c.node() for c in committed]},
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
191 operation=b'split',
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
192 fixphase=True,
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
193 )
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
194
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
195 return committed[-1]
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
196
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
197
36408
83bade6206d4 split: use ctx.rev() instead of %d % ctx
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36400
diff changeset
198 def dorebase(ui, repo, src, destctx):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
199 rebase.rebase(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
200 ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
201 repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
202 rev=[revsetlang.formatspec(b'%ld', src)],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
203 dest=revsetlang.formatspec(b'%d', destctx.rev()),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
204 )