annotate hgext/split.py @ 48578:28f0092ec89f

exchange: add fast path for subrepo check on push Try to check if .hgsub and .hgsubstate exist at all before looking for them in every changeset to be pushed. The latter can be quite expensive for large repositories and the existance check is almost free. Differential Revision: https://phab.mercurial-scm.org/D11956
author Joerg Sonnenberger <joerg@bec.de>
date Mon, 03 Jan 2022 01:09:56 +0100
parents 5ced12cfa41b
children 6000f5b25c9b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
35459
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 from __future__ import absolute_import
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
11
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
12 from mercurial.i18n import _
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
13
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
14 from mercurial.node import (
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46771
diff changeset
15 nullrev,
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
16 short,
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
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
19 from mercurial import (
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
20 bookmarks,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
21 cmdutil,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
22 commands,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
23 error,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
24 hg,
48128
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 46924
diff changeset
25 logcmdutil,
36430
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35459
diff changeset
26 pycompat,
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
27 registrar,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
28 revsetlang,
43941
2349a60f33db split: use rewriteutil.precheck() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43685
diff changeset
29 rewriteutil,
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
30 scmutil,
46771
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
31 util,
35459
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
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
34 # allow people to use split without explicitly enabling rebase extension
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
35 from . import rebase
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
36
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
37 cmdtable = {}
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
38 command = registrar.command(cmdtable)
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
39
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
40 # 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
41 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
42 # 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
43 # leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
44 testedwith = b'ships-with-hg-core'
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
45
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
46
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
47 @command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
48 b'split',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
49 [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
50 (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
51 (b'', b'rebase', True, _(b'rebase descendants after split')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
52 ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
53 + cmdutil.commitopts2,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
54 _(b'hg split [--no-rebase] [[-r] REV]'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
55 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
56 helpbasic=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
57 )
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
58 def split(ui, repo, *revs, **opts):
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
59 """split a changeset into smaller ones
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
60
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
61 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
62 is nothing left in the original changeset.
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
63
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
64 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
65
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
66 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
67 changeset. Use --no-rebase to avoid the rebase.
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
68 """
38102
5ba0cf22e4d0 py3: fix kwargs handling in hgext/split.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36438
diff changeset
69 opts = pycompat.byteskwargs(opts)
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
70 revlist = []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
71 if opts.get(b'rev'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
72 revlist.append(opts.get(b'rev'))
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
73 revlist.extend(revs)
46771
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
74 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: 45891
diff changeset
75 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: 45891
diff changeset
76 # 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: 45891
diff changeset
77 # 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: 45891
diff changeset
78 with util.acceptintervention(tr):
48128
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 46924
diff changeset
79 revs = logcmdutil.revrange(repo, revlist or [b'.'])
46771
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
80 if len(revs) > 1:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
81 raise error.InputError(_(b'cannot split multiple revisions'))
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
82
46771
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
83 rev = revs.first()
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46771
diff changeset
84 # Handle nullrev specially here (instead of leaving for precheck()
46771
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
85 # 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: 46771
diff changeset
86 if rev is None or rev == nullrev:
46771
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
87 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: 45891
diff changeset
88 return 1
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46771
diff changeset
89 ctx = repo[rev]
46771
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
90 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: 45891
diff changeset
91 raise error.InputError(_(b'cannot split working directory'))
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
92
46771
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
93 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: 45891
diff changeset
94 # 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: 45891
diff changeset
95 # 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: 45891
diff changeset
96 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: 45891
diff changeset
97 torebase = list(
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
98 repo.revs(
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
99 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: 45891
diff changeset
100 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
101 )
46771
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
102 else:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
103 torebase = []
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
104 rewriteutil.precheck(repo, [rev] + torebase, b'split')
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
105
46771
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
106 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: 45891
diff changeset
107 raise error.InputError(_(b'cannot split a merge changeset'))
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
108
46771
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
109 cmdutil.bailifchanged(repo)
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
110
46771
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
111 # 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: 45891
diff changeset
112 # unintentionally
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
113 bname = repo._activebookmark
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
114 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: 45891
diff changeset
115 bookmarks.deactivate(repo)
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
116
46771
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
117 wnode = repo[b'.'].node()
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
118 top = None
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
119 try:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
120 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: 45891
diff changeset
121 finally:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
122 # 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: 45891
diff changeset
123 # 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: 45891
diff changeset
124 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: 45891
diff changeset
125 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: 45891
diff changeset
126 if bname:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
127 bookmarks.activate(repo, bname)
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
128 if torebase and top:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45891
diff changeset
129 dorebase(ui, repo, torebase, top)
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
130
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
131
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
132 def dosplit(ui, repo, tr, ctx, opts):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
133 committed = [] # [ctx]
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
134
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
135 # Set working parent to ctx.p1(), and keep working copy as ctx's content
41971
42e2c7c52e1b split: use the new movedirstate() we now have in scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 40295
diff changeset
136 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
137 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
138 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
139 scmutil.movedirstate(repo, ctx.p1())
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
140
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
141 # Any modified, added, removed, deleted result means split is incomplete
43685
705738def50c split: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
142 def incomplete(repo):
705738def50c split: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
143 st = repo.status()
705738def50c split: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
144 return any((st.modified, st.added, st.removed, st.deleted))
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
145
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
146 # Main split loop
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
147 while incomplete(repo):
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
148 if committed:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
149 header = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
150 b'HG: Splitting %s. So far it has been split into:\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
151 ) % short(ctx.node())
45871
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45796
diff changeset
152 # 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: 45796
diff changeset
153 # 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: 45796
diff changeset
154 with ui.configoverride(
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45796
diff changeset
155 {(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: 45796
diff changeset
156 ):
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45796
diff changeset
157 for c in committed:
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45796
diff changeset
158 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: 45796
diff changeset
159 header += _(b'HG: - %s\n') % summary
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
160 header += _(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43077
diff changeset
161 b'HG: Write commit message for the next split changeset.\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
162 )
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
163 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
164 header = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
165 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
166 b'first split changeset.\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
167 ) % short(ctx.node())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
168 opts.update(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
169 {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
170 b'edit': True,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
171 b'interactive': True,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
172 b'message': header + ctx.description(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
173 }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
174 )
46923
8ee1ac083ee7 split: fix issue with empty splits adjusting phases
Kyle Lippincott <spectral@google.com>
parents: 46843
diff changeset
175 origctx = repo[b'.']
36430
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35459
diff changeset
176 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
177 newctx = repo[b'.']
46923
8ee1ac083ee7 split: fix issue with empty splits adjusting phases
Kyle Lippincott <spectral@google.com>
parents: 46843
diff changeset
178 # 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
179 # everything).
8ee1ac083ee7 split: fix issue with empty splits adjusting phases
Kyle Lippincott <spectral@google.com>
parents: 46843
diff changeset
180 if origctx.node() != newctx.node():
8ee1ac083ee7 split: fix issue with empty splits adjusting phases
Kyle Lippincott <spectral@google.com>
parents: 46843
diff changeset
181 committed.append(newctx)
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
182
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
183 if not committed:
45891
568c05d8f3d2 errors: raise InputError in `hg split`
Martin von Zweigbergk <martinvonz@google.com>
parents: 45871
diff changeset
184 raise error.InputError(_(b'cannot split an empty revision'))
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
185
46924
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
186 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
187 # 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
188 # exists
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
189 scmutil.cleanupnodes(
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
190 repo,
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
191 {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
192 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
193 fixphase=True,
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
194 )
35459
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
195
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
196 return committed[-1]
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
197
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
198
36438
83bade6206d4 split: use ctx.rev() instead of %d % ctx
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36430
diff changeset
199 def dorebase(ui, repo, src, destctx):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
200 rebase.rebase(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
201 ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
202 repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
203 rev=[revsetlang.formatspec(b'%ld', src)],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
204 dest=revsetlang.formatspec(b'%d', destctx.rev()),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41971
diff changeset
205 )