annotate mercurial/commit.py @ 45481:6e474eec4be6

merge: update commitinfo from all mergeresults during bid merge During bid merge, it's not clear which commitinfo should be stored and which one should not. This depends on which side the bid merge chooses for a file. For this we will need to refactor bid merge code and commitinfo handling. For now, we just blindly updates info since we hardly have any users of commitinfo and this will help us in testing and clearing out further path. Differential Revision: https://phab.mercurial-scm.org/D8965
author Pulkit Goyal <7895pulkit@gmail.com>
date Wed, 26 Aug 2020 16:37:23 +0530
parents 037e88d453fa
children 479cce8c9882
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45239
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,
45240
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
13 nullid,
45239
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 (
45240
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
18 context,
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
19 mergestate,
45239
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
45260
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45259
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: 45259
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: 45259
diff changeset
29
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45259
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: 45259
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: 45259
diff changeset
32 """
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45259
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: 45259
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: 45259
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: 45259
diff changeset
36 else:
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45259
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: 45259
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: 45259
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: 45259
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: 45259
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: 45259
diff changeset
42 )
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45259
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: 45259
diff changeset
44
ada51c1b6916 commitctx: move copy meta config reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45259
diff changeset
45
45239
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
45265
bd7515273fd6 commitctx: gather more preparation code within the lock context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45264
diff changeset
66 with repo.lock(), repo.transaction(b"commit") as tr:
45344
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45277
diff changeset
67 mn, files = _prepare_files(tr, ctx, error=error, origctx=origctx)
45239
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
68
45274
4cde23ba076e commitctx: create the new extra dict on its own line
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45273
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: 45273
diff changeset
70
45275
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45274
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: 45274
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: 45274
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: 45274
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: 45274
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: 45274
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: 45274
diff changeset
77 ):
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45274
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: 45274
diff changeset
79 if repo.changelog._copiesstorage == b'extra':
45344
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45277
diff changeset
80 extra = _extra_with_copies(repo, extra, files)
45275
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45274
diff changeset
81
45239
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
82 # update changelog
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
83 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
84 repo.changelog.delayupdate(tr)
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
85 n = repo.changelog.add(
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
86 mn,
45345
6c56277317c2 commitctx: directly pass a ChangingFiles object to changelog.add
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45344
diff changeset
87 files,
45239
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
88 ctx.description(),
45257
5d0998ccedbb commitctx: stop using weakref proxy for transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45256
diff changeset
89 tr,
45239
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
90 p1.node(),
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
91 p2.node(),
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
92 user,
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
93 ctx.date(),
45274
4cde23ba076e commitctx: create the new extra dict on its own line
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45273
diff changeset
94 extra,
45239
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
95 )
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
96 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
97 repo.hook(
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
98 b'pretxncommit', throw=True, node=hex(n), parent1=xp1, parent2=xp2,
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
99 )
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
100 # 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
101 targetphase = subrepoutil.newcommitphase(repo.ui, ctx)
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
102 if targetphase:
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
103 # 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
104 # 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
105 # be compliant anyway
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 # if minimal phase was 0 we don't need to retract anything
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
108 phases.registernew(repo, tr, targetphase, [n])
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
109 return n
45240
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
110
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
111
45266
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45265
diff changeset
112 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: 45265
diff changeset
113 repo = ctx.repo()
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45265
diff changeset
114 p1 = ctx.p1()
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45265
diff changeset
115
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45265
diff changeset
116 writechangesetcopy, writefilecopymeta = _write_copy_meta(repo)
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45265
diff changeset
117
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45265
diff changeset
118 if ctx.manifestnode():
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45265
diff changeset
119 # 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: 45265
diff changeset
120 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: 45265
diff changeset
121 mn = ctx.manifestnode()
45349
e52031f5e046 commitctx: create the ChangingFiles object directly in the various case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45348
diff changeset
122 files = metadata.ChangingFiles()
e52031f5e046 commitctx: create the ChangingFiles object directly in the various case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45348
diff changeset
123 files.update_touched(ctx.files())
45266
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45265
diff changeset
124 if writechangesetcopy:
45349
e52031f5e046 commitctx: create the ChangingFiles object directly in the various case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45348
diff changeset
125 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: 45348
diff changeset
126 files.update_removed(ctx.filesremoved())
45266
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45265
diff changeset
127 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: 45265
diff changeset
128 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: 45265
diff changeset
129 mn = p1.manifestnode()
45349
e52031f5e046 commitctx: create the ChangingFiles object directly in the various case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45348
diff changeset
130 files = metadata.ChangingFiles()
45266
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45265
diff changeset
131 else:
45350
dcbad0f17d76 commitctx: move ChangingFiles creation directly inside `_process_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45349
diff changeset
132 mn, files = _process_files(tr, ctx, error=error)
45266
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45265
diff changeset
133
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45265
diff changeset
134 if origctx and origctx.manifestnode() == mn:
45349
e52031f5e046 commitctx: create the ChangingFiles object directly in the various case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45348
diff changeset
135 origfiles = origctx.files()
e52031f5e046 commitctx: create the ChangingFiles object directly in the various case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45348
diff changeset
136 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: 45348
diff changeset
137 files.update_touched(origfiles)
45266
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45265
diff changeset
138
45347
99614011892b commitctx: directly gather p1 and p2 copies in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45345
diff changeset
139 if writechangesetcopy:
99614011892b commitctx: directly gather p1 and p2 copies in `files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45345
diff changeset
140 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: 45345
diff changeset
141 files.update_copies_from_p2(ctx.p2copies())
45344
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45277
diff changeset
142
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45277
diff changeset
143 return mn, files
45266
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45265
diff changeset
144
13814622b3b1 commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45265
diff changeset
145
45263
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
146 def _process_files(tr, ctx, error=False):
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
147 repo = ctx.repo()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
148 p1 = ctx.p1()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
149 p2 = ctx.p2()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
150
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
151 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: 45262
diff changeset
152
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
153 m1ctx = p1.manifestctx()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
154 m2ctx = p2.manifestctx()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
155 mctx = m1ctx.copy()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
156
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
157 m = mctx.read()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
158 m1 = m1ctx.read()
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
159 m2 = m2ctx.read()
45454
037e88d453fa commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
160 ms = mergestate.mergestate.read(repo)
45263
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
161
45353
54eeb1a0e325 commitctx: directly update the touched and added set of files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45352
diff changeset
162 files = metadata.ChangingFiles()
54eeb1a0e325 commitctx: directly update the touched and added set of files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45352
diff changeset
163
45263
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
164 # check in files
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
165 added = []
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
166 removed = list(ctx.removed())
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
167 linkrev = len(repo)
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
168 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: 45262
diff changeset
169 uipathfn = scmutil.getuipathfn(repo)
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
170 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: 45262
diff changeset
171 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: 45262
diff changeset
172 try:
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
173 fctx = ctx[f]
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
174 if fctx is None:
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
175 removed.append(f)
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
176 else:
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
177 added.append(f)
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
178 m[f], is_touched = _filecommit(
45454
037e88d453fa commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
179 repo, fctx, m1, m2, linkrev, tr, writefilecopymeta, ms
45263
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
180 )
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
181 if is_touched:
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
182 if is_touched == 'added':
45353
54eeb1a0e325 commitctx: directly update the touched and added set of files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45352
diff changeset
183 files.mark_added(f)
54eeb1a0e325 commitctx: directly update the touched and added set of files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45352
diff changeset
184 else:
54eeb1a0e325 commitctx: directly update the touched and added set of files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45352
diff changeset
185 files.mark_touched(f)
45263
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
186 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: 45262
diff changeset
187 except OSError:
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
188 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: 45262
diff changeset
189 raise
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
190 except IOError as inst:
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
191 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: 45262
diff changeset
192 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: 45262
diff changeset
193 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: 45262
diff changeset
194 raise
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
195
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
196 # update manifest
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
197 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: 45262
diff changeset
198 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: 45262
diff changeset
199 for f in drop:
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
200 del m[f]
45352
027f3dd76302 commitctx: directly updated the set of removed files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45351
diff changeset
201 if p2.rev() == nullrev:
027f3dd76302 commitctx: directly updated the set of removed files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45351
diff changeset
202 files.update_removed(removed)
027f3dd76302 commitctx: directly updated the set of removed files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45351
diff changeset
203 else:
45263
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
204 rf = metadata.get_removal_filter(ctx, (p1, p2, m1, m2))
45352
027f3dd76302 commitctx: directly updated the set of removed files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45351
diff changeset
205 for f in removed:
027f3dd76302 commitctx: directly updated the set of removed files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45351
diff changeset
206 if not rf(f):
027f3dd76302 commitctx: directly updated the set of removed files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45351
diff changeset
207 files.mark_removed(f)
45263
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
208
45351
a852e5058e69 commitctx: create the `ChangingFiles` object sooner
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45350
diff changeset
209 mn = _commit_manifest(tr, linkrev, ctx, mctx, m, files.touched, added, drop)
45350
dcbad0f17d76 commitctx: move ChangingFiles creation directly inside `_process_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45349
diff changeset
210
dcbad0f17d76 commitctx: move ChangingFiles creation directly inside `_process_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45349
diff changeset
211 return mn, files
45263
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
212
0c468fef09b3 commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45262
diff changeset
213
45240
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
214 def _filecommit(
45454
037e88d453fa commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
215 repo, fctx, manifest1, manifest2, linkrev, tr, includecopymeta, ms,
45240
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
216 ):
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
217 """
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
218 commit an individual file as part of a larger transaction
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
219
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
220 input:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
221
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
222 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: 45239
diff changeset
223 manifest1: manifest of changeset first parent
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
224 manifest2: manifest of changeset second parent
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
225 linkrev: revision number of the changeset being created
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
226 tr: current transation
45443
f52b0297acc8 commit: fix a wrong argument name in documentation
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45402
diff changeset
227 includecopymeta: boolean, set to False to skip storing the copy data
45240
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
228 (only used by the Google specific feature of using
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
229 changeset extra as copy source of truth).
45454
037e88d453fa commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
230 ms: mergestate object
45240
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
231
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
232 output: (filenode, touched)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
233
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
234 filenode: the filenode that should be used by this changeset
45256
d056a131c93f commitctx: document the None return for "touched" value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45240
diff changeset
235 touched: one of: None (mean untouched), 'added' or 'modified'
45240
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
236 """
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
237
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
238 fname = fctx.path()
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
239 fparent1 = manifest1.get(fname, nullid)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
240 fparent2 = manifest2.get(fname, nullid)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
241 touched = None
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
242 if fparent1 == fparent2 == nullid:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
243 touched = 'added'
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
244
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
245 if isinstance(fctx, context.filectx):
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
246 # 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: 45239
diff changeset
247 # 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: 45239
diff changeset
248 # need to create a new file revision in this case.
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
249 node = fctx.filenode()
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
250 if node in [fparent1, fparent2]:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
251 repo.ui.debug(b'reusing %s filelog entry\n' % fname)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
252 if (
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
253 fparent1 != nullid and manifest1.flags(fname) != fctx.flags()
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
254 ) or (
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
255 fparent2 != nullid and manifest2.flags(fname) != fctx.flags()
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
256 ):
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
257 touched = 'modified'
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
258 return node, touched
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
259
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
260 flog = repo.file(fname)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
261 meta = {}
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
262 cfname = fctx.copysource()
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
263 fnode = None
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
264
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
265 if cfname and cfname != fname:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
266 # 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: 45239
diff changeset
267 # file. This copy data will effectively act as a parent
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
268 # 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: 45239
diff changeset
269 # 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: 45239
diff changeset
270 # 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: 45239
diff changeset
271 #
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
272 # 0 --- 1 --- 3 rev1 changes file foo
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
273 # \ / rev2 renames foo to bar and changes it
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
274 # \- 2 -/ rev3 should have bar with all changes and
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
275 # should record that bar descends from
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
276 # bar in rev2 and foo in rev1
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
277 #
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
278 # this allows this merge to succeed:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
279 #
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
280 # 0 --- 1 --- 3 rev4 reverts the content change from rev2
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
281 # \ / merging rev3 and rev4 should use bar@rev2
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
282 # \- 2 --- 4 as the merge base
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
283 #
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
284
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
285 cnode = manifest1.get(cfname)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
286 newfparent = fparent2
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
287
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
288 if manifest2: # branch merge
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
289 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: 45239
diff changeset
290 if cfname in manifest2:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
291 cnode = manifest2[cfname]
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
292 newfparent = fparent1
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
293
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
294 # 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: 45239
diff changeset
295 # 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: 45239
diff changeset
296 # 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: 45239
diff changeset
297 # 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: 45239
diff changeset
298 # 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: 45239
diff changeset
299 # 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: 45239
diff changeset
300 # 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: 45239
diff changeset
301 # behavior in this circumstance.
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
302
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
303 if cnode:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
304 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: 45239
diff changeset
305 if includecopymeta:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
306 meta[b"copy"] = cfname
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
307 meta[b"copyrev"] = hex(cnode)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
308 fparent1, fparent2 = nullid, newfparent
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
309 else:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
310 repo.ui.warn(
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
311 _(
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
312 b"warning: can't find ancestor for '%s' "
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
313 b"copied from '%s'!\n"
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
314 )
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
315 % (fname, cfname)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
316 )
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
317
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
318 elif fparent1 == nullid:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
319 fparent1, fparent2 = fparent2, nullid
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
320 elif fparent2 != nullid:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
321 # is one parent an ancestor of the other?
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
322 fparentancestors = flog.commonancestorsheads(fparent1, fparent2)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
323 if fparent1 in fparentancestors:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
324 fparent1, fparent2 = fparent2, nullid
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
325 elif fparent2 in fparentancestors:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
326 fparent2 = nullid
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
327 elif not fparentancestors:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
328 # TODO: this whole if-else might be simplified much more
45454
037e88d453fa commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
329 if (
037e88d453fa commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
330 ms.active()
037e88d453fa commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45443
diff changeset
331 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: 45443
diff changeset
332 ):
45240
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
333 fparent1, fparent2 = fparent2, nullid
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
334
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
335 # is the file changed?
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
336 text = fctx.data()
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
337 if fparent2 != nullid or meta or flog.cmp(fparent1, text):
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
338 if touched is None: # do not overwrite added
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
339 touched = 'modified'
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
340 fnode = flog.add(text, meta, tr, linkrev, fparent1, fparent2)
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
341 # are just the flags changed during merge?
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
342 elif fname in manifest1 and manifest1.flags(fname) != fctx.flags():
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
343 touched = 'modified'
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
344 fnode = fparent1
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
345 else:
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
346 fnode = fparent1
ce9ee81df9ff commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45239
diff changeset
347 return fnode, touched
45258
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
348
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
349
45273
e15416c95b25 commitctx: explicitly pass `manifest` to _commit_manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45266
diff changeset
350 def _commit_manifest(tr, linkrev, ctx, mctx, manifest, files, added, drop):
45258
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
351 """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: 45257
diff changeset
352
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
353 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: 45257
diff changeset
354 - 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: 45257
diff changeset
355 - 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: 45257
diff changeset
356 - 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: 45257
diff changeset
357
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
358 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: 45257
diff changeset
359
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
360 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: 45257
diff changeset
361 """
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
362 repo = ctx.repo()
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
363
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
364 md = None
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
365
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
366 # 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: 45257
diff changeset
367 p1 = ctx.p1()
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
368 p2 = ctx.p2()
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
369 m1ctx = p1.manifestctx()
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
370
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
371 m1 = m1ctx.read()
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
372
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
373 if not files:
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
374 # 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: 45257
diff changeset
375 # 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: 45257
diff changeset
376 # 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: 45257
diff changeset
377 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: 45257
diff changeset
378 if not files and md:
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
379 repo.ui.debug(
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
380 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: 45257
diff changeset
381 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: 45257
diff changeset
382 )
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
383 if files or md:
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
384 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: 45257
diff changeset
385 # 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: 45257
diff changeset
386 # 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: 45257
diff changeset
387 # 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: 45257
diff changeset
388 # 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: 45257
diff changeset
389 # 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: 45257
diff changeset
390 # 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: 45257
diff changeset
391 # so this is safe.
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
392 mn = mctx.write(
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
393 tr,
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
394 linkrev,
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
395 p1.manifestnode(),
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
396 p2.manifestnode(),
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
397 added,
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
398 drop,
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
399 match=repo.narrowmatch(),
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
400 )
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
401 else:
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
402 repo.ui.debug(
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
403 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: 45257
diff changeset
404 )
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
405 mn = p1.manifestnode()
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
406
f0d4d1343cb4 commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45257
diff changeset
407 return mn
45275
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45274
diff changeset
408
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45274
diff changeset
409
45344
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45277
diff changeset
410 def _extra_with_copies(repo, extra, files):
45275
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45274
diff changeset
411 """encode copy information into a `extra` dictionnary"""
45344
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45277
diff changeset
412 p1copies = files.copied_from_p1
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45277
diff changeset
413 p2copies = files.copied_from_p2
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45277
diff changeset
414 filesadded = files.added
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45277
diff changeset
415 filesremoved = files.removed
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45277
diff changeset
416 files = sorted(files.touched)
45277
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45276
diff changeset
417 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: 45276
diff changeset
418 # 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: 45276
diff changeset
419 # 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: 45276
diff changeset
420 # 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: 45276
diff changeset
421 # filelogs.
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45276
diff changeset
422 p1copies = p1copies or None
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45276
diff changeset
423 p2copies = p2copies or None
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45276
diff changeset
424 filesadded = filesadded or None
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45276
diff changeset
425 filesremoved = filesremoved or None
0041a42c6f28 commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45276
diff changeset
426
45275
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45274
diff changeset
427 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: 45274
diff changeset
428 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: 45274
diff changeset
429 extra = {}
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45274
diff changeset
430 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: 45274
diff changeset
431 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: 45274
diff changeset
432 extra[b'p1copies'] = p1copies
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45274
diff changeset
433 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: 45274
diff changeset
434 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: 45274
diff changeset
435 extra[b'p2copies'] = p2copies
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45274
diff changeset
436 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: 45274
diff changeset
437 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: 45274
diff changeset
438 extra[b'filesadded'] = filesadded
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45274
diff changeset
439 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: 45274
diff changeset
440 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: 45274
diff changeset
441 extra[b'filesremoved'] = filesremoved
b3040b6739ce commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45274
diff changeset
442 return extra