annotate mercurial/commit.py @ 46335:25be21ec6c65

share: rework config options to be much clearer and easier Recently I implemented various boolean configs which control how to behave when there is a share-safe mismatch between source and share repository. Mismatch means that source supports share-safe where as share does not or vice versa. However, while discussion and documentation we realized that it's too complicated and there are some combinations of values which makes no sense. We decided to introduce a config option with 4 possible values which makes controlling and understanding things easier. The config option `share.safe-mismatch.source-{not-}safe` can have following 4 values: * abort (default): error out if there is mismatch * allow: allow to work with respecting share source configuration * {up|down}grade-abort: try to {up|down}grade, if it fails, abort * {up|down}grade-allow: try to {up|down}grade, if it fails, continue in allow mode I am not sure if I can explain 3 config options which I deleted right now in just 5 lines which is a sign of how complex they became. No test changes demonstrate that functionality is same, only names have changed. Differential Revision: https://phab.mercurial-scm.org/D9785
author Pulkit Goyal <7895pulkit@gmail.com>
date Mon, 18 Jan 2021 21:37:20 +0530
parents 89a2afe31e82
children 72f5280e33b6 d6fa9fbd375d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
1 # commit.py - fonction to perform commit
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
2 #
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
3 # This software may be used and distributed according to the terms of the
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
4 # GNU General Public License version 2 or any later version.
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
5
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
6 from __future__ import absolute_import
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
7
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
8 import errno
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
9
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
10 from .i18n import _
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
11 from .node import (
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
12 hex,
45204
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
13 nullid,
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
14 nullrev,
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
15 )
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
16
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
17 from . import (
45204
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
18 context,
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
19 mergestate,
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
20 metadata,
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
21 phases,
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
22 scmutil,
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
23 subrepoutil,
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
24 )
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
25
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
26
45233
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
27 def _write_copy_meta(repo):
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
28 """return a (changelog, filelog) boolean tuple
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
29
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
30 changelog: copy related information should be stored in the changeset
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
31 filelof: copy related information should be written in the file revision
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
32 """
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
33 if repo.filecopiesmode == b'changeset-sidedata':
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
34 writechangesetcopy = True
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
35 writefilecopymeta = True
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
36 else:
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
37 writecopiesto = repo.ui.config(b'experimental', b'copies.write-to')
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
38 writefilecopymeta = writecopiesto != b'changeset-only'
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
39 writechangesetcopy = writecopiesto in (
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
40 b'changeset-only',
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
41 b'compatibility',
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
42 )
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
43 return writechangesetcopy, writefilecopymeta
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
44
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45232
diff changeset
45
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
46 def commitctx(repo, ctx, error=False, origctx=None):
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
47 """Add a new revision to the target repository.
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
48 Revision information is passed via the context argument.
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
49
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
50 ctx.files() should list all files involved in this commit, i.e.
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
51 modified/added/removed files. On merge, it may be wider than the
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
52 ctx.files() to be committed, since any file nodes derived directly
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
53 from p1 or p2 are excluded from the committed ctx.files().
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
54
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
55 origctx is for convert to work around the problem that bug
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
56 fixes to the files list in changesets change hashes. For
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
57 convert to be the identity, it can pass an origctx and this
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
58 function will use the same files list when it makes sense to
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
59 do so.
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
60 """
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
61 repo = repo.unfiltered()
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
62
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
63 p1, p2 = ctx.p1(), ctx.p2()
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
64 user = ctx.user()
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
65
45238
bd7515273fd6 commitctx: gather more preparation code within the lock context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45237
diff changeset
66 with repo.lock(), repo.transaction(b"commit") as tr:
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45251
diff changeset
67 mn, files = _prepare_files(tr, ctx, error=error, origctx=origctx)
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
68
45248
4cde23ba076e commitctx: create the new extra dict on its own line
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45247
diff changeset
69 extra = ctx.extra().copy()
4cde23ba076e commitctx: create the new extra dict on its own line
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45247
diff changeset
70
45249
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
71 if extra is not None:
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
72 for name in (
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
73 b'p1copies',
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
74 b'p2copies',
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
75 b'filesadded',
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
76 b'filesremoved',
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
77 ):
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
78 extra.pop(name, None)
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
79 if repo.changelog._copiesstorage == b'extra':
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45251
diff changeset
80 extra = _extra_with_copies(repo, extra, files)
45249
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
81
45757
067707e026b4 commit: don't change phases for preexisting commits
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 45715
diff changeset
82 # save the tip to check whether we actually committed anything
067707e026b4 commit: don't change phases for preexisting commits
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 45715
diff changeset
83 oldtip = repo.changelog.tiprev()
067707e026b4 commit: don't change phases for preexisting commits
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 45715
diff changeset
84
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
85 # update changelog
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
86 repo.ui.note(_(b"committing changelog\n"))
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
87 repo.changelog.delayupdate(tr)
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
88 n = repo.changelog.add(
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
89 mn,
45324
6c56277317c2 commitctx: directly pass a ChangingFiles object to changelog.add
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45323
diff changeset
90 files,
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
91 ctx.description(),
45230
5d0998ccedbb commitctx: stop using weakref proxy for transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45223
diff changeset
92 tr,
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
93 p1.node(),
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
94 p2.node(),
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
95 user,
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
96 ctx.date(),
45248
4cde23ba076e commitctx: create the new extra dict on its own line
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45247
diff changeset
97 extra,
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
98 )
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
99 xp1, xp2 = p1.hex(), p2 and p2.hex() or b''
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
100 repo.hook(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45794
diff changeset
101 b'pretxncommit',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45794
diff changeset
102 throw=True,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45794
diff changeset
103 node=hex(n),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45794
diff changeset
104 parent1=xp1,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45794
diff changeset
105 parent2=xp2,
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
106 )
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
107 # set the new commit is proper phase
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
108 targetphase = subrepoutil.newcommitphase(repo.ui, ctx)
45757
067707e026b4 commit: don't change phases for preexisting commits
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 45715
diff changeset
109
067707e026b4 commit: don't change phases for preexisting commits
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 45715
diff changeset
110 # prevent unmarking changesets as public on recommit
067707e026b4 commit: don't change phases for preexisting commits
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 45715
diff changeset
111 waspublic = oldtip == repo.changelog.tiprev() and not repo[n].phase()
067707e026b4 commit: don't change phases for preexisting commits
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 45715
diff changeset
112
067707e026b4 commit: don't change phases for preexisting commits
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 45715
diff changeset
113 if targetphase and not waspublic:
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
114 # retract boundary do not alter parent changeset.
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
115 # if a parent have higher the resulting phase will
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
116 # be compliant anyway
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
117 #
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
118 # if minimal phase was 0 we don't need to retract anything
45790
5d65e04b6a80 phases: convert registernew users to use revision sets
Joerg Sonnenberger <joerg@bec.de>
parents: 45715
diff changeset
119 phases.registernew(repo, tr, targetphase, [repo[n].rev()])
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
120 return n
45204
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
121
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
122
45239
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
123 def _prepare_files(tr, ctx, error=False, origctx=None):
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
124 repo = ctx.repo()
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
125 p1 = ctx.p1()
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
126
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
127 writechangesetcopy, writefilecopymeta = _write_copy_meta(repo)
45708
60c46cc28bf4 commit: pass ChangingFiles object as argument to _process_files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45707
diff changeset
128 files = metadata.ChangingFiles()
45706
b92887ce8db4 commit: move salvaged calculation a bit earlier in the function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45705
diff changeset
129 ms = mergestate.mergestate.read(repo)
b92887ce8db4 commit: move salvaged calculation a bit earlier in the function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45705
diff changeset
130 salvaged = _get_salvaged(repo, ms, ctx)
45708
60c46cc28bf4 commit: pass ChangingFiles object as argument to _process_files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45707
diff changeset
131 for s in salvaged:
60c46cc28bf4 commit: pass ChangingFiles object as argument to _process_files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45707
diff changeset
132 files.mark_salvaged(s)
45239
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
133
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
134 if ctx.manifestnode():
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
135 # reuse an existing manifest revision
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
136 repo.ui.debug(b'reusing known manifest\n')
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
137 mn = ctx.manifestnode()
45328
e52031f5e046 commitctx: create the ChangingFiles object directly in the various case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45327
diff changeset
138 files.update_touched(ctx.files())
45239
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
139 if writechangesetcopy:
45328
e52031f5e046 commitctx: create the ChangingFiles object directly in the various case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45327
diff changeset
140 files.update_added(ctx.filesadded())
e52031f5e046 commitctx: create the ChangingFiles object directly in the various case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45327
diff changeset
141 files.update_removed(ctx.filesremoved())
45239
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
142 elif not ctx.files():
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
143 repo.ui.debug(b'reusing manifest from p1 (no file change)\n')
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
144 mn = p1.manifestnode()
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
145 else:
45708
60c46cc28bf4 commit: pass ChangingFiles object as argument to _process_files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45707
diff changeset
146 mn = _process_files(tr, ctx, ms, files, error=error)
45239
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
147
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
148 if origctx and origctx.manifestnode() == mn:
45328
e52031f5e046 commitctx: create the ChangingFiles object directly in the various case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45327
diff changeset
149 origfiles = origctx.files()
e52031f5e046 commitctx: create the ChangingFiles object directly in the various case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45327
diff changeset
150 assert files.touched.issubset(origfiles)
e52031f5e046 commitctx: create the ChangingFiles object directly in the various case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45327
diff changeset
151 files.update_touched(origfiles)
45239
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
152
45326
99614011892b commitctx: directly gather p1 and p2 copies in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45324
diff changeset
153 if writechangesetcopy:
99614011892b commitctx: directly gather p1 and p2 copies in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45324
diff changeset
154 files.update_copies_from_p1(ctx.p1copies())
99614011892b commitctx: directly gather p1 and p2 copies in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45324
diff changeset
155 files.update_copies_from_p2(ctx.p2copies())
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45251
diff changeset
156
45705
61454026fa04 commit: refactor salvage calculation to a different function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45662
diff changeset
157 return mn, files
61454026fa04 commit: refactor salvage calculation to a different function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45662
diff changeset
158
61454026fa04 commit: refactor salvage calculation to a different function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45662
diff changeset
159
61454026fa04 commit: refactor salvage calculation to a different function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45662
diff changeset
160 def _get_salvaged(repo, ms, ctx):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45794
diff changeset
161 """returns a list of salvaged files
45705
61454026fa04 commit: refactor salvage calculation to a different function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45662
diff changeset
162
61454026fa04 commit: refactor salvage calculation to a different function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45662
diff changeset
163 returns empty list if config option which process salvaged files are
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45794
diff changeset
164 not enabled"""
45705
61454026fa04 commit: refactor salvage calculation to a different function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45662
diff changeset
165 salvaged = []
61454026fa04 commit: refactor salvage calculation to a different function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45662
diff changeset
166 copy_sd = repo.filecopiesmode == b'changeset-sidedata'
45662
64a4b85c4a00 salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45612
diff changeset
167 if copy_sd and len(ctx.parents()) > 1:
64a4b85c4a00 salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45612
diff changeset
168 if ms.active():
45715
0428978bca22 mergestate: add `allextras()` to get all extras
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45708
diff changeset
169 for fname in sorted(ms.allextras().keys()):
45662
64a4b85c4a00 salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45612
diff changeset
170 might_removed = ms.extras(fname).get(b'merge-removal-candidate')
64a4b85c4a00 salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45612
diff changeset
171 if might_removed == b'yes':
64a4b85c4a00 salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45612
diff changeset
172 if fname in ctx:
45705
61454026fa04 commit: refactor salvage calculation to a different function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45662
diff changeset
173 salvaged.append(fname)
61454026fa04 commit: refactor salvage calculation to a different function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45662
diff changeset
174 return salvaged
45239
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
175
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45238
diff changeset
176
45708
60c46cc28bf4 commit: pass ChangingFiles object as argument to _process_files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45707
diff changeset
177 def _process_files(tr, ctx, ms, files, error=False):
45236
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
178 repo = ctx.repo()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
179 p1 = ctx.p1()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
180 p2 = ctx.p2()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
181
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
182 writechangesetcopy, writefilecopymeta = _write_copy_meta(repo)
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
183
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
184 m1ctx = p1.manifestctx()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
185 m2ctx = p2.manifestctx()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
186 mctx = m1ctx.copy()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
187
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
188 m = mctx.read()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
189 m1 = m1ctx.read()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
190 m2 = m2ctx.read()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
191
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
192 # check in files
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
193 added = []
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
194 removed = list(ctx.removed())
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
195 linkrev = len(repo)
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
196 repo.ui.note(_(b"committing files:\n"))
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
197 uipathfn = scmutil.getuipathfn(repo)
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
198 for f in sorted(ctx.modified() + ctx.added()):
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
199 repo.ui.note(uipathfn(f) + b"\n")
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
200 try:
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
201 fctx = ctx[f]
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
202 if fctx is None:
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
203 removed.append(f)
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
204 else:
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
205 added.append(f)
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
206 m[f], is_touched = _filecommit(
45443
037e88d453fa commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45432
diff changeset
207 repo, fctx, m1, m2, linkrev, tr, writefilecopymeta, ms
45236
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
208 )
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
209 if is_touched:
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
210 if is_touched == 'added':
45332
54eeb1a0e325 commitctx: directly update the touched and added set of files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45331
diff changeset
211 files.mark_added(f)
45612
094a91a183f1 changing-files: record merged files at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45585
diff changeset
212 elif is_touched == 'merged':
094a91a183f1 changing-files: record merged files at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45585
diff changeset
213 files.mark_merged(f)
45332
54eeb1a0e325 commitctx: directly update the touched and added set of files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45331
diff changeset
214 else:
54eeb1a0e325 commitctx: directly update the touched and added set of files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45331
diff changeset
215 files.mark_touched(f)
45236
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
216 m.setflag(f, fctx.flags())
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
217 except OSError:
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
218 repo.ui.warn(_(b"trouble committing %s!\n") % uipathfn(f))
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
219 raise
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
220 except IOError as inst:
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
221 errcode = getattr(inst, 'errno', errno.ENOENT)
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
222 if error or errcode and errcode != errno.ENOENT:
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
223 repo.ui.warn(_(b"trouble committing %s!\n") % uipathfn(f))
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
224 raise
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
225
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
226 # update manifest
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
227 removed = [f for f in removed if f in m1 or f in m2]
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
228 drop = sorted([f for f in removed if f in m])
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
229 for f in drop:
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
230 del m[f]
45331
027f3dd76302 commitctx: directly updated the set of removed files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45330
diff changeset
231 if p2.rev() == nullrev:
027f3dd76302 commitctx: directly updated the set of removed files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45330
diff changeset
232 files.update_removed(removed)
027f3dd76302 commitctx: directly updated the set of removed files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45330
diff changeset
233 else:
45236
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
234 rf = metadata.get_removal_filter(ctx, (p1, p2, m1, m2))
45331
027f3dd76302 commitctx: directly updated the set of removed files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45330
diff changeset
235 for f in removed:
027f3dd76302 commitctx: directly updated the set of removed files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45330
diff changeset
236 if not rf(f):
027f3dd76302 commitctx: directly updated the set of removed files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45330
diff changeset
237 files.mark_removed(f)
45236
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
238
45330
a852e5058e69 commitctx: create the `ChangingFiles` object sooner
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45329
diff changeset
239 mn = _commit_manifest(tr, linkrev, ctx, mctx, m, files.touched, added, drop)
45329
dcbad0f17d76 commitctx: move ChangingFiles creation directly inside `_process_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45328
diff changeset
240
45708
60c46cc28bf4 commit: pass ChangingFiles object as argument to _process_files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45707
diff changeset
241 return mn
45236
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
242
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45235
diff changeset
243
45204
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
244 def _filecommit(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45794
diff changeset
245 repo,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45794
diff changeset
246 fctx,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45794
diff changeset
247 manifest1,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45794
diff changeset
248 manifest2,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45794
diff changeset
249 linkrev,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45794
diff changeset
250 tr,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45794
diff changeset
251 includecopymeta,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45794
diff changeset
252 ms,
45204
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
253 ):
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
254 """
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
255 commit an individual file as part of a larger transaction
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
256
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
257 input:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
258
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
259 fctx: a file context with the content we are trying to commit
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
260 manifest1: manifest of changeset first parent
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
261 manifest2: manifest of changeset second parent
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
262 linkrev: revision number of the changeset being created
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
263 tr: current transation
45432
f52b0297acc8 commit: fix a wrong argument name in documentation
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45382
diff changeset
264 includecopymeta: boolean, set to False to skip storing the copy data
45204
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
265 (only used by the Google specific feature of using
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
266 changeset extra as copy source of truth).
45443
037e88d453fa commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45432
diff changeset
267 ms: mergestate object
45204
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
268
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
269 output: (filenode, touched)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
270
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
271 filenode: the filenode that should be used by this changeset
45223
d056a131c93f commitctx: document the None return for "touched" value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45204
diff changeset
272 touched: one of: None (mean untouched), 'added' or 'modified'
45204
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
273 """
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
274
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
275 fname = fctx.path()
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
276 fparent1 = manifest1.get(fname, nullid)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
277 fparent2 = manifest2.get(fname, nullid)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
278 touched = None
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
279 if fparent1 == fparent2 == nullid:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
280 touched = 'added'
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
281
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
282 if isinstance(fctx, context.filectx):
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
283 # This block fast path most comparisons which are usually done. It
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
284 # assumes that bare filectx is used and no merge happened, hence no
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
285 # need to create a new file revision in this case.
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
286 node = fctx.filenode()
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
287 if node in [fparent1, fparent2]:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
288 repo.ui.debug(b'reusing %s filelog entry\n' % fname)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
289 if (
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
290 fparent1 != nullid and manifest1.flags(fname) != fctx.flags()
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
291 ) or (
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
292 fparent2 != nullid and manifest2.flags(fname) != fctx.flags()
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
293 ):
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
294 touched = 'modified'
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
295 return node, touched
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
296
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
297 flog = repo.file(fname)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
298 meta = {}
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
299 cfname = fctx.copysource()
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
300 fnode = None
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
301
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
302 if cfname and cfname != fname:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
303 # Mark the new revision of this file as a copy of another
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
304 # file. This copy data will effectively act as a parent
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
305 # of this new revision. If this is a merge, the first
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
306 # parent will be the nullid (meaning "look up the copy data")
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
307 # and the second one will be the other parent. For example:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
308 #
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
309 # 0 --- 1 --- 3 rev1 changes file foo
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
310 # \ / rev2 renames foo to bar and changes it
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
311 # \- 2 -/ rev3 should have bar with all changes and
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
312 # should record that bar descends from
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
313 # bar in rev2 and foo in rev1
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
314 #
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
315 # this allows this merge to succeed:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
316 #
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
317 # 0 --- 1 --- 3 rev4 reverts the content change from rev2
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
318 # \ / merging rev3 and rev4 should use bar@rev2
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
319 # \- 2 --- 4 as the merge base
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
320 #
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
321
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
322 cnode = manifest1.get(cfname)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
323 newfparent = fparent2
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
324
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
325 if manifest2: # branch merge
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
326 if fparent2 == nullid or cnode is None: # copied on remote side
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
327 if cfname in manifest2:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
328 cnode = manifest2[cfname]
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
329 newfparent = fparent1
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
330
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
331 # Here, we used to search backwards through history to try to find
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
332 # where the file copy came from if the source of a copy was not in
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
333 # the parent directory. However, this doesn't actually make sense to
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
334 # do (what does a copy from something not in your working copy even
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
335 # mean?) and it causes bugs (eg, issue4476). Instead, we will warn
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
336 # the user that copy information was dropped, so if they didn't
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
337 # expect this outcome it can be fixed, but this is the correct
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
338 # behavior in this circumstance.
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
339
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
340 if cnode:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
341 repo.ui.debug(b" %s: copy %s:%s\n" % (fname, cfname, hex(cnode)))
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
342 if includecopymeta:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
343 meta[b"copy"] = cfname
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
344 meta[b"copyrev"] = hex(cnode)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
345 fparent1, fparent2 = nullid, newfparent
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
346 else:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
347 repo.ui.warn(
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
348 _(
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
349 b"warning: can't find ancestor for '%s' "
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
350 b"copied from '%s'!\n"
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
351 )
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
352 % (fname, cfname)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
353 )
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
354
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
355 elif fparent1 == nullid:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
356 fparent1, fparent2 = fparent2, nullid
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
357 elif fparent2 != nullid:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
358 # is one parent an ancestor of the other?
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
359 fparentancestors = flog.commonancestorsheads(fparent1, fparent2)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
360 if fparent1 in fparentancestors:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
361 fparent1, fparent2 = fparent2, nullid
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
362 elif fparent2 in fparentancestors:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
363 fparent2 = nullid
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
364 elif not fparentancestors:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
365 # TODO: this whole if-else might be simplified much more
45443
037e88d453fa commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45432
diff changeset
366 if (
037e88d453fa commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45432
diff changeset
367 ms.active()
037e88d453fa commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45432
diff changeset
368 and ms.extras(fname).get(b'filenode-source') == b'other'
037e88d453fa commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45432
diff changeset
369 ):
45204
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
370 fparent1, fparent2 = fparent2, nullid
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
371
45585
479cce8c9882 commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
372 force_new_node = False
479cce8c9882 commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
373 # The file might have been deleted by merge code and user explicitly choose
479cce8c9882 commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
374 # to revert the file and keep it. The other case can be where there is
479cce8c9882 commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
375 # change-delete or delete-change conflict and user explicitly choose to keep
479cce8c9882 commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
376 # the file. The goal is to create a new filenode for users explicit choices
479cce8c9882 commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
377 if (
479cce8c9882 commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
378 repo.ui.configbool(b'experimental', b'merge-track-salvaged')
479cce8c9882 commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
379 and ms.active()
479cce8c9882 commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
380 and ms.extras(fname).get(b'merge-removal-candidate') == b'yes'
479cce8c9882 commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
381 ):
479cce8c9882 commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
382 force_new_node = True
45204
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
383 # is the file changed?
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
384 text = fctx.data()
45585
479cce8c9882 commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
385 if fparent2 != nullid or meta or flog.cmp(fparent1, text) or force_new_node:
45204
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
386 if touched is None: # do not overwrite added
45612
094a91a183f1 changing-files: record merged files at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45585
diff changeset
387 if fparent2 == nullid:
094a91a183f1 changing-files: record merged files at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45585
diff changeset
388 touched = 'modified'
094a91a183f1 changing-files: record merged files at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45585
diff changeset
389 else:
094a91a183f1 changing-files: record merged files at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45585
diff changeset
390 touched = 'merged'
45204
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
391 fnode = flog.add(text, meta, tr, linkrev, fparent1, fparent2)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
392 # are just the flags changed during merge?
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
393 elif fname in manifest1 and manifest1.flags(fname) != fctx.flags():
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
394 touched = 'modified'
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
395 fnode = fparent1
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
396 else:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
397 fnode = fparent1
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45203
diff changeset
398 return fnode, touched
45231
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
399
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
400
45247
e15416c95b25 commitctx: explicitly pass `manifest` to _commit_manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
401 def _commit_manifest(tr, linkrev, ctx, mctx, manifest, files, added, drop):
45231
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
402 """make a new manifest entry (or reuse a new one)
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
403
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
404 given an initialised manifest context and precomputed list of
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
405 - files: files affected by the commit
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
406 - added: new entries in the manifest
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
407 - drop: entries present in parents but absent of this one
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
408
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
409 Create a new manifest revision, reuse existing ones if possible.
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
410
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
411 Return the nodeid of the manifest revision.
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
412 """
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
413 repo = ctx.repo()
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
414
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
415 md = None
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
416
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
417 # all this is cached, so it is find to get them all from the ctx.
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
418 p1 = ctx.p1()
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
419 p2 = ctx.p2()
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
420 m1ctx = p1.manifestctx()
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
421
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
422 m1 = m1ctx.read()
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
423
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
424 if not files:
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
425 # if no "files" actually changed in terms of the changelog,
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
426 # try hard to detect unmodified manifest entry so that the
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
427 # exact same commit can be reproduced later on convert.
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
428 md = m1.diff(manifest, scmutil.matchfiles(repo, ctx.files()))
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
429 if not files and md:
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
430 repo.ui.debug(
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
431 b'not reusing manifest (no file change in '
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
432 b'changelog, but manifest differs)\n'
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
433 )
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
434 if files or md:
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
435 repo.ui.note(_(b"committing manifest\n"))
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
436 # we're using narrowmatch here since it's already applied at
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
437 # other stages (such as dirstate.walk), so we're already
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
438 # ignoring things outside of narrowspec in most cases. The
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
439 # one case where we might have files outside the narrowspec
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
440 # at this point is merges, and we already error out in the
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
441 # case where the merge has files outside of the narrowspec,
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
442 # so this is safe.
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
443 mn = mctx.write(
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
444 tr,
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
445 linkrev,
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
446 p1.manifestnode(),
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
447 p2.manifestnode(),
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
448 added,
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
449 drop,
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
450 match=repo.narrowmatch(),
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
451 )
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
452 else:
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
453 repo.ui.debug(
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
454 b'reusing manifest from p1 (listed files ' b'actually unchanged)\n'
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
455 )
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
456 mn = p1.manifestnode()
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
457
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45230
diff changeset
458 return mn
45249
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
459
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
460
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45251
diff changeset
461 def _extra_with_copies(repo, extra, files):
45249
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
462 """encode copy information into a `extra` dictionnary"""
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45251
diff changeset
463 p1copies = files.copied_from_p1
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45251
diff changeset
464 p2copies = files.copied_from_p2
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45251
diff changeset
465 filesadded = files.added
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45251
diff changeset
466 filesremoved = files.removed
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45251
diff changeset
467 files = sorted(files.touched)
45251
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45250
diff changeset
468 if not _write_copy_meta(repo)[1]:
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45250
diff changeset
469 # If writing only to changeset extras, use None to indicate that
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45250
diff changeset
470 # no entry should be written. If writing to both, write an empty
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45250
diff changeset
471 # entry to prevent the reader from falling back to reading
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45250
diff changeset
472 # filelogs.
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45250
diff changeset
473 p1copies = p1copies or None
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45250
diff changeset
474 p2copies = p2copies or None
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45250
diff changeset
475 filesadded = filesadded or None
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45250
diff changeset
476 filesremoved = filesremoved or None
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45250
diff changeset
477
45249
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
478 extrasentries = p1copies, p2copies, filesadded, filesremoved
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
479 if extra is None and any(x is not None for x in extrasentries):
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
480 extra = {}
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
481 if p1copies is not None:
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
482 p1copies = metadata.encodecopies(files, p1copies)
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
483 extra[b'p1copies'] = p1copies
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
484 if p2copies is not None:
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
485 p2copies = metadata.encodecopies(files, p2copies)
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
486 extra[b'p2copies'] = p2copies
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
487 if filesadded is not None:
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
488 filesadded = metadata.encodefileindices(files, filesadded)
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
489 extra[b'filesadded'] = filesadded
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
490 if filesremoved is not None:
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
491 filesremoved = metadata.encodefileindices(files, filesremoved)
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
492 extra[b'filesremoved'] = filesremoved
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45248
diff changeset
493 return extra