annotate hgext/uncommit.py @ 41767:1c1c4ef8b72e

changegroup: move non-pruning of non-ellipsis manifests to _prunemanifests() Google has an extension that overrides _prunemanifests() and removes nodes that we fetch using another mechanism. That broke when _prunemanifests() no longer got called. It works again if we move the check for "not self._ellipses" inside _prunemanifests(). Differential Revision: https://phab.mercurial-scm.org/D6004
author Martin von Zweigbergk <martinvonz@google.com>
date Thu, 21 Feb 2019 21:27:42 -0800
parents 1040d54eb7eb
children bf22e370ae9a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
1 # uncommit - undo the actions of a commit
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
2 #
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
3 # Copyright 2011 Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
4 # Logilab SA <contact@logilab.fr>
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
5 # Pierre-Yves David <pierre-yves.david@ens-lyon.org>
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
6 # Patrick Mezard <patrick@mezard.eu>
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
7 # Copyright 2016 Facebook, Inc.
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
8 #
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
9 # This software may be used and distributed according to the terms of the
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
10 # GNU General Public License version 2 or any later version.
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
11
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
12 """uncommit part or all of a local changeset (EXPERIMENTAL)
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
13
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
14 This command undoes the effect of a local commit, returning the affected
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
15 files to their uncommitted state. This means that files modified, added or
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
16 removed in the changeset will be left unchanged, and so will remain modified,
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
17 added and removed in the working directory.
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
18 """
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
19
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
20 from __future__ import absolute_import
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
21
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
22 from mercurial.i18n import _
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
23
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
24 from mercurial import (
34284
624c53e4121d uncommit: don't allow bare uncommit on dirty working directory
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34283
diff changeset
25 cmdutil,
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
26 commands,
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
27 context,
41339
7be231f5a4ad unamend: import "copies" module as "copiesmod" to avoid shadowing
Martin von Zweigbergk <martinvonz@google.com>
parents: 40295
diff changeset
28 copies as copiesmod,
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
29 error,
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
30 node,
35182
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
31 obsutil,
35004
3ebae3ec4664 py3: handle keyword arguments in hgext/uncommit.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34758
diff changeset
32 pycompat,
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
33 registrar,
35244
98f97eb20597 rewriteutil: use precheck() in uncommit and amend commands
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35200
diff changeset
34 rewriteutil,
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
35 scmutil,
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
36 )
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
37
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
38 cmdtable = {}
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
39 command = registrar.command(cmdtable)
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
40
34758
9ea416a4b4f7 configitems: register the 'experimental.uncommitondirtywdir' config
Boris Feld <boris.feld@octobus.net>
parents: 34285
diff changeset
41 configtable = {}
9ea416a4b4f7 configitems: register the 'experimental.uncommitondirtywdir' config
Boris Feld <boris.feld@octobus.net>
parents: 34285
diff changeset
42 configitem = registrar.configitem(configtable)
9ea416a4b4f7 configitems: register the 'experimental.uncommitondirtywdir' config
Boris Feld <boris.feld@octobus.net>
parents: 34285
diff changeset
43
9ea416a4b4f7 configitems: register the 'experimental.uncommitondirtywdir' config
Boris Feld <boris.feld@octobus.net>
parents: 34285
diff changeset
44 configitem('experimental', 'uncommitondirtywdir',
9ea416a4b4f7 configitems: register the 'experimental.uncommitondirtywdir' config
Boris Feld <boris.feld@octobus.net>
parents: 34285
diff changeset
45 default=False,
9ea416a4b4f7 configitems: register the 'experimental.uncommitondirtywdir' config
Boris Feld <boris.feld@octobus.net>
parents: 34285
diff changeset
46 )
41750
1040d54eb7eb uncommit: add config option to keep commit by default
Martin von Zweigbergk <martinvonz@google.com>
parents: 41745
diff changeset
47 configitem('experimental', 'uncommit.keep',
1040d54eb7eb uncommit: add config option to keep commit by default
Martin von Zweigbergk <martinvonz@google.com>
parents: 41745
diff changeset
48 default=False,
1040d54eb7eb uncommit: add config option to keep commit by default
Martin von Zweigbergk <martinvonz@google.com>
parents: 41745
diff changeset
49 )
34758
9ea416a4b4f7 configitems: register the 'experimental.uncommitondirtywdir' config
Boris Feld <boris.feld@octobus.net>
parents: 34285
diff changeset
50
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
51 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
52 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
53 # be specifying the version(s) of Mercurial they are tested with, or
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
54 # leave the attribute unspecified.
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
55 testedwith = 'ships-with-hg-core'
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
56
36974
435b8b05affd uncommit: simplify condition for keeping commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 36973
diff changeset
57 def _commitfiltered(repo, ctx, match, keepcommit):
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
58 """Recommit ctx with changed files not in match. Return the new
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
59 node identifier, or None if nothing changed.
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
60 """
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
61 base = ctx.p1()
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
62 # ctx
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
63 initialfiles = set(ctx.files())
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
64 exclude = set(f for f in initialfiles if match(f))
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
65
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
66 # No files matched commit, so nothing excluded
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
67 if not exclude:
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
68 return None
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
69
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
70 # return the p1 so that we don't create an obsmarker later
36974
435b8b05affd uncommit: simplify condition for keeping commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 36973
diff changeset
71 if not keepcommit:
41397
0bd56c291359 cleanup: use p1() and p2() instead of parents()[0] and parents()[1]
Martin von Zweigbergk <martinvonz@google.com>
parents: 41342
diff changeset
72 return ctx.p1().node()
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
73
41745
83d294c71f1e uncommit: inform user if the commit is empty after uncommit
Martin von Zweigbergk <martinvonz@google.com>
parents: 41397
diff changeset
74 files = (initialfiles - exclude)
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
75 # Filter copies
41339
7be231f5a4ad unamend: import "copies" module as "copiesmod" to avoid shadowing
Martin von Zweigbergk <martinvonz@google.com>
parents: 40295
diff changeset
76 copied = copiesmod.pathcopies(base, ctx)
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
77 copied = dict((dst, src) for dst, src in copied.iteritems()
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
78 if dst in files)
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
79 def filectxfn(repo, memctx, path, contentctx=ctx, redirect=()):
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
80 if path not in contentctx:
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
81 return None
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
82 fctx = contentctx[path]
35400
8a0cac20a1ad memfilectx: make changectx argument mandatory in constructor (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 35244
diff changeset
83 mctx = context.memfilectx(repo, memctx, fctx.path(), fctx.data(),
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
84 fctx.islink(),
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
85 fctx.isexec(),
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
86 copied=copied.get(path))
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
87 return mctx
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
88
41745
83d294c71f1e uncommit: inform user if the commit is empty after uncommit
Martin von Zweigbergk <martinvonz@google.com>
parents: 41397
diff changeset
89 if not files:
83d294c71f1e uncommit: inform user if the commit is empty after uncommit
Martin von Zweigbergk <martinvonz@google.com>
parents: 41397
diff changeset
90 repo.ui.status(_("note: keeping empty commit\n"))
83d294c71f1e uncommit: inform user if the commit is empty after uncommit
Martin von Zweigbergk <martinvonz@google.com>
parents: 41397
diff changeset
91
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
92 new = context.memctx(repo,
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
93 parents=[base.node(), node.nullid],
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
94 text=ctx.description(),
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
95 files=files,
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
96 filectxfn=filectxfn,
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
97 user=ctx.user(),
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
98 date=ctx.date(),
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
99 extra=ctx.extra())
38423
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 36974
diff changeset
100 return repo.commitctx(new)
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
101
41341
19c590ce8661 unamend: fix unamending of renamed rename
Martin von Zweigbergk <martinvonz@google.com>
parents: 41340
diff changeset
102 def _fixdirstate(repo, oldctx, newctx, match=None):
35183
9dadcb99cc17 uncommit: unify functions _uncommitdirstate and _unamenddirstate to one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35182
diff changeset
103 """ fix the dirstate after switching the working directory from oldctx to
9dadcb99cc17 uncommit: unify functions _uncommitdirstate and _unamenddirstate to one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35182
diff changeset
104 newctx which can be result of either unamend or uncommit.
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
105 """
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
106 ds = repo.dirstate
41342
fe83040400b7 uncommit: set dirstateparents from within _fixdirstate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41341
diff changeset
107 ds.setparents(newctx.node(), node.nullid)
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
108 copies = dict(ds.copies())
41341
19c590ce8661 unamend: fix unamending of renamed rename
Martin von Zweigbergk <martinvonz@google.com>
parents: 41340
diff changeset
109 s = newctx.status(oldctx, match=match)
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
110 for f in s.modified:
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
111 if ds[f] == 'r':
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
112 # modified + removed -> removed
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
113 continue
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
114 ds.normallookup(f)
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
115
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
116 for f in s.added:
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
117 if ds[f] == 'r':
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
118 # added + removed -> unknown
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
119 ds.drop(f)
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
120 elif ds[f] != 'a':
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
121 ds.add(f)
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
122
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
123 for f in s.removed:
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
124 if ds[f] == 'a':
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
125 # removed + added -> normal
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
126 ds.normallookup(f)
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
127 elif ds[f] != 'r':
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
128 ds.remove(f)
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
129
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
130 # Merge old parent and old working dir copies
41341
19c590ce8661 unamend: fix unamending of renamed rename
Martin von Zweigbergk <martinvonz@google.com>
parents: 41340
diff changeset
131 oldcopies = copiesmod.pathcopies(newctx, oldctx, match)
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
132 oldcopies.update(copies)
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
133 copies = dict((dst, oldcopies.get(src, src))
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
134 for dst, src in oldcopies.iteritems())
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
135 # Adjust the dirstate copies
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
136 for dst, src in copies.iteritems():
35183
9dadcb99cc17 uncommit: unify functions _uncommitdirstate and _unamenddirstate to one
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35182
diff changeset
137 if (src not in newctx or dst in newctx or ds[dst] != 'a'):
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
138 src = None
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
139 ds.copy(src, dst)
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
140
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
141 @command('uncommit',
41750
1040d54eb7eb uncommit: add config option to keep commit by default
Martin von Zweigbergk <martinvonz@google.com>
parents: 41745
diff changeset
142 [('', 'keep', None, _('allow an empty commit after uncommiting')),
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
143 ] + commands.walkopts,
40293
c303d65d2e34 help: assigning categories to existing commands
rdamazio@google.com
parents: 38771
diff changeset
144 _('[OPTION]... [FILE]...'),
c303d65d2e34 help: assigning categories to existing commands
rdamazio@google.com
parents: 38771
diff changeset
145 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT)
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
146 def uncommit(ui, repo, *pats, **opts):
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
147 """uncommit part or all of a local changeset
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
148
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
149 This command undoes the effect of a local commit, returning the affected
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
150 files to their uncommitted state. This means that files modified or
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
151 deleted in the changeset will be left unchanged, and so will remain
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
152 modified in the working directory.
36973
d63c5c651183 uncommit: document when the commit will be pruned
Martin von Zweigbergk <martinvonz@google.com>
parents: 36972
diff changeset
153
d63c5c651183 uncommit: document when the commit will be pruned
Martin von Zweigbergk <martinvonz@google.com>
parents: 36972
diff changeset
154 If no files are specified, the commit will be pruned, unless --keep is
d63c5c651183 uncommit: document when the commit will be pruned
Martin von Zweigbergk <martinvonz@google.com>
parents: 36972
diff changeset
155 given.
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
156 """
35004
3ebae3ec4664 py3: handle keyword arguments in hgext/uncommit.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34758
diff changeset
157 opts = pycompat.byteskwargs(opts)
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
158
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
159 with repo.wlock(), repo.lock():
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
160
34285
7b1e524ad73f uncommit: add an experimental.uncommitondirtywdir config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34284
diff changeset
161 if not pats and not repo.ui.configbool('experimental',
36947
3d0178bf1039 uncommit: fix unaligned indentation
Martin von Zweigbergk <martinvonz@google.com>
parents: 35809
diff changeset
162 'uncommitondirtywdir'):
34284
624c53e4121d uncommit: don't allow bare uncommit on dirty working directory
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34283
diff changeset
163 cmdutil.bailifchanged(repo)
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
164 old = repo['.']
35244
98f97eb20597 rewriteutil: use precheck() in uncommit and amend commands
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35200
diff changeset
165 rewriteutil.precheck(repo, [old.rev()], 'uncommit')
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
166 if len(old.parents()) > 1:
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
167 raise error.Abort(_("cannot uncommit merge changeset"))
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
168
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
169 with repo.transaction('uncommit'):
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
170 match = scmutil.match(old, pats, opts)
41750
1040d54eb7eb uncommit: add config option to keep commit by default
Martin von Zweigbergk <martinvonz@google.com>
parents: 41745
diff changeset
171 keepcommit = pats
1040d54eb7eb uncommit: add config option to keep commit by default
Martin von Zweigbergk <martinvonz@google.com>
parents: 41745
diff changeset
172 if not keepcommit:
1040d54eb7eb uncommit: add config option to keep commit by default
Martin von Zweigbergk <martinvonz@google.com>
parents: 41745
diff changeset
173 if opts.get('keep') is not None:
1040d54eb7eb uncommit: add config option to keep commit by default
Martin von Zweigbergk <martinvonz@google.com>
parents: 41745
diff changeset
174 keepcommit = opts.get('keep')
1040d54eb7eb uncommit: add config option to keep commit by default
Martin von Zweigbergk <martinvonz@google.com>
parents: 41745
diff changeset
175 else:
1040d54eb7eb uncommit: add config option to keep commit by default
Martin von Zweigbergk <martinvonz@google.com>
parents: 41745
diff changeset
176 keepcommit = ui.configbool('experimental', 'uncommit.keep')
36974
435b8b05affd uncommit: simplify condition for keeping commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 36973
diff changeset
177 newid = _commitfiltered(repo, old, match, keepcommit)
34192
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
178 if newid is None:
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
179 ui.status(_("nothing to uncommit\n"))
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
180 return 1
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
181
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
182 mapping = {}
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
183 if newid != old.p1().node():
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
184 # Move local changes on filtered changeset
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
185 mapping[old.node()] = (newid,)
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
186 else:
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
187 # Fully removed the old commit
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
188 mapping[old.node()] = ()
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
189
da2f5f19312c uncommit: move fb-extension to core which uncommits a changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
190 with repo.dirstate.parentchange():
41341
19c590ce8661 unamend: fix unamending of renamed rename
Martin von Zweigbergk <martinvonz@google.com>
parents: 41340
diff changeset
191 _fixdirstate(repo, old, repo[newid], match)
35182
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
192
41340
c9f1fd82a826 uncommit: mark old node obsolete after updating dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 41339
diff changeset
193 scmutil.cleanupnodes(repo, mapping, 'uncommit', fixphase=True)
c9f1fd82a826 uncommit: mark old node obsolete after updating dirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 41339
diff changeset
194
35182
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
195 def predecessormarkers(ctx):
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
196 """yields the obsolete markers marking the given changeset as a successor"""
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
197 for data in ctx.repo().obsstore.predecessors.get(ctx.node(), ()):
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
198 yield obsutil.marker(ctx.repo(), data)
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
199
40295
fa88170c10bb help: adding a proper declaration for shortlist/basic commands (API)
Rodrigo Damazio <rdamazio@google.com>
parents: 40293
diff changeset
200 @command('unamend', [], helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
fa88170c10bb help: adding a proper declaration for shortlist/basic commands (API)
Rodrigo Damazio <rdamazio@google.com>
parents: 40293
diff changeset
201 helpbasic=True)
35182
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
202 def unamend(ui, repo, **opts):
35809
f9a82b9b2c36 unamend: fix command summary line
Martin von Zweigbergk <martinvonz@google.com>
parents: 35435
diff changeset
203 """undo the most recent amend operation on a current changeset
35182
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
204
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
205 This command will roll back to the previous version of a changeset,
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
206 leaving working directory in state in which it was before running
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
207 `hg amend` (e.g. files modified as part of an amend will be
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
208 marked as modified `hg status`)
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
209 """
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
210
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
211 unfi = repo.unfiltered()
35200
9e339c97fabb unamend: drop unused vars, query after taking lock, use ctx.hex() for extras
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35183
diff changeset
212 with repo.wlock(), repo.lock(), repo.transaction('unamend'):
35182
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
213
35200
9e339c97fabb unamend: drop unused vars, query after taking lock, use ctx.hex() for extras
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35183
diff changeset
214 # identify the commit from which to unamend
9e339c97fabb unamend: drop unused vars, query after taking lock, use ctx.hex() for extras
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35183
diff changeset
215 curctx = repo['.']
35182
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
216
35435
f01101100043 unamend: allow unamending if allowunstable is set
Martin von Zweigbergk <martinvonz@google.com>
parents: 35400
diff changeset
217 rewriteutil.precheck(repo, [curctx.rev()], 'unamend')
35182
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
218
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
219 # identify the commit to which to unamend
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
220 markers = list(predecessormarkers(curctx))
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
221 if len(markers) != 1:
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
222 e = _("changeset must have one predecessor, found %i predecessors")
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
223 raise error.Abort(e % len(markers))
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
224
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
225 prednode = markers[0].prednode()
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
226 predctx = unfi[prednode]
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
227
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
228 # add an extra so that we get a new hash
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
229 # note: allowing unamend to undo an unamend is an intentional feature
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
230 extras = predctx.extra()
35200
9e339c97fabb unamend: drop unused vars, query after taking lock, use ctx.hex() for extras
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35183
diff changeset
231 extras['unamend_source'] = curctx.hex()
35182
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
232
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
233 def filectxfn(repo, ctx_, path):
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
234 try:
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
235 return predctx.filectx(path)
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
236 except KeyError:
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
237 return None
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
238
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
239 # Make a new commit same as predctx
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
240 newctx = context.memctx(repo,
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
241 parents=(predctx.p1(), predctx.p2()),
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
242 text=predctx.description(),
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
243 files=predctx.files(),
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
244 filectxfn=filectxfn,
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
245 user=predctx.user(),
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
246 date=predctx.date(),
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
247 extra=extras)
38423
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 36974
diff changeset
248 newprednode = repo.commitctx(newctx)
35182
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
249 newpredctx = repo[newprednode]
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
250 dirstate = repo.dirstate
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
251
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
252 with dirstate.parentchange():
41341
19c590ce8661 unamend: fix unamending of renamed rename
Martin von Zweigbergk <martinvonz@google.com>
parents: 41340
diff changeset
253 _fixdirstate(repo, curctx, newpredctx)
35182
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
254
867990238dc6 unamend: move fb extension unamend to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35004
diff changeset
255 mapping = {curctx.node(): (newprednode,)}
38423
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 36974
diff changeset
256 scmutil.cleanupnodes(repo, mapping, 'unamend', fixphase=True)