Mercurial > hg-stable
annotate mercurial/commit.py @ 45688:ed0ded64a8a9
py3: convert an exception message to bytes
One of our users ran into this (unrelated to my recent work on
more specific errors).
Differential Revision: https://phab.mercurial-scm.org/D9184
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Fri, 09 Oct 2020 09:17:47 -0700 |
parents | 64a4b85c4a00 |
children | 61454026fa04 |
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 |
45662
64a4b85c4a00
salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45615
diff
changeset
|
143 copy_sd = ctx.repo().filecopiesmode == b'changeset-sidedata' |
64a4b85c4a00
salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45615
diff
changeset
|
144 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:
45615
diff
changeset
|
145 # XXX this `mergestate.read` could be duplicated with a the merge state |
64a4b85c4a00
salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45615
diff
changeset
|
146 # reading in _process_files So we could refactor further to reuse it in |
64a4b85c4a00
salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45615
diff
changeset
|
147 # some cases. |
64a4b85c4a00
salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45615
diff
changeset
|
148 ms = mergestate.mergestate.read(repo) |
64a4b85c4a00
salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45615
diff
changeset
|
149 if ms.active(): |
64a4b85c4a00
salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45615
diff
changeset
|
150 for fname in sorted(ms._stateextras.keys()): |
64a4b85c4a00
salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45615
diff
changeset
|
151 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:
45615
diff
changeset
|
152 if might_removed == b'yes': |
64a4b85c4a00
salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45615
diff
changeset
|
153 if fname in ctx: |
64a4b85c4a00
salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45615
diff
changeset
|
154 files.mark_salvaged(fname) |
64a4b85c4a00
salvaged: record salvaged in ChangingFiles at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45615
diff
changeset
|
155 |
45344
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45277
diff
changeset
|
156 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
|
157 |
13814622b3b1
commitctx: extract all the file preparation logic in a new function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45265
diff
changeset
|
158 |
45263
0c468fef09b3
commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45262
diff
changeset
|
159 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
|
160 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
|
161 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
|
162 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
|
163 |
0c468fef09b3
commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45262
diff
changeset
|
164 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
|
165 |
0c468fef09b3
commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45262
diff
changeset
|
166 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
|
167 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
|
168 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
|
169 |
0c468fef09b3
commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45262
diff
changeset
|
170 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
|
171 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
|
172 m2 = m2ctx.read() |
45454
037e88d453fa
commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45443
diff
changeset
|
173 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
|
174 |
45353
54eeb1a0e325
commitctx: directly update the touched and added set of files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45352
diff
changeset
|
175 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
|
176 |
45263
0c468fef09b3
commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45262
diff
changeset
|
177 # 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
|
178 added = [] |
0c468fef09b3
commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45262
diff
changeset
|
179 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
|
180 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
|
181 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
|
182 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
|
183 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
|
184 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
|
185 try: |
0c468fef09b3
commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45262
diff
changeset
|
186 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
|
187 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
|
188 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
|
189 else: |
0c468fef09b3
commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45262
diff
changeset
|
190 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
|
191 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
|
192 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
|
193 ) |
0c468fef09b3
commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45262
diff
changeset
|
194 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
|
195 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
|
196 files.mark_added(f) |
45615
094a91a183f1
changing-files: record merged files at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45588
diff
changeset
|
197 elif is_touched == 'merged': |
094a91a183f1
changing-files: record merged files at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45588
diff
changeset
|
198 files.mark_merged(f) |
45353
54eeb1a0e325
commitctx: directly update the touched and added set of files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45352
diff
changeset
|
199 else: |
54eeb1a0e325
commitctx: directly update the touched and added set of files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45352
diff
changeset
|
200 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
|
201 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
|
202 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
|
203 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
|
204 raise |
0c468fef09b3
commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45262
diff
changeset
|
205 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
|
206 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
|
207 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
|
208 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
|
209 raise |
0c468fef09b3
commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45262
diff
changeset
|
210 |
0c468fef09b3
commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45262
diff
changeset
|
211 # 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
|
212 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
|
213 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
|
214 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
|
215 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
|
216 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
|
217 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
|
218 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
|
219 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
|
220 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
|
221 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
|
222 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
|
223 |
45351
a852e5058e69
commitctx: create the `ChangingFiles` object sooner
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45350
diff
changeset
|
224 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
|
225 |
dcbad0f17d76
commitctx: move ChangingFiles creation directly inside `_process_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45349
diff
changeset
|
226 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
|
227 |
0c468fef09b3
commitctx: extract all the manual logic to process the files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45262
diff
changeset
|
228 |
45240
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
229 def _filecommit( |
45454
037e88d453fa
commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45443
diff
changeset
|
230 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
|
231 ): |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
232 """ |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
233 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
|
234 |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
235 input: |
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 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
|
238 manifest1: manifest of changeset first parent |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
239 manifest2: manifest of changeset second parent |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
240 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
|
241 tr: current transation |
45443
f52b0297acc8
commit: fix a wrong argument name in documentation
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45402
diff
changeset
|
242 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
|
243 (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
|
244 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
|
245 ms: mergestate object |
45240
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
246 |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
247 output: (filenode, touched) |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
248 |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
249 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
|
250 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
|
251 """ |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
252 |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
253 fname = fctx.path() |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
254 fparent1 = manifest1.get(fname, nullid) |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
255 fparent2 = manifest2.get(fname, nullid) |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
256 touched = None |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
257 if fparent1 == fparent2 == nullid: |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
258 touched = 'added' |
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 if isinstance(fctx, context.filectx): |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
261 # 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
|
262 # 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
|
263 # 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
|
264 node = fctx.filenode() |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
265 if node in [fparent1, fparent2]: |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
266 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
|
267 if ( |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
268 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
|
269 ) or ( |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
270 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
|
271 ): |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
272 touched = 'modified' |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
273 return node, touched |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
274 |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
275 flog = repo.file(fname) |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
276 meta = {} |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
277 cfname = fctx.copysource() |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
278 fnode = None |
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 if cfname and cfname != fname: |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
281 # 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
|
282 # 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
|
283 # 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
|
284 # 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
|
285 # 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
|
286 # |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
287 # 0 --- 1 --- 3 rev1 changes file foo |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
288 # \ / 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
|
289 # \- 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
|
290 # should record that bar descends from |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
291 # bar in rev2 and foo in rev1 |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
292 # |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
293 # this allows this merge to succeed: |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
294 # |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
295 # 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
|
296 # \ / 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
|
297 # \- 2 --- 4 as the merge base |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
298 # |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
299 |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
300 cnode = manifest1.get(cfname) |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
301 newfparent = fparent2 |
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 manifest2: # branch merge |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
304 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
|
305 if cfname in manifest2: |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
306 cnode = manifest2[cfname] |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
307 newfparent = fparent1 |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
308 |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
309 # 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
|
310 # 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
|
311 # 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
|
312 # 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
|
313 # 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
|
314 # 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
|
315 # 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
|
316 # behavior in this circumstance. |
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 if cnode: |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
319 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
|
320 if includecopymeta: |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
321 meta[b"copy"] = cfname |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
322 meta[b"copyrev"] = hex(cnode) |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
323 fparent1, fparent2 = nullid, newfparent |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
324 else: |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
325 repo.ui.warn( |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
326 _( |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
327 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
|
328 b"copied from '%s'!\n" |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
329 ) |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
330 % (fname, cfname) |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
331 ) |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
332 |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
333 elif fparent1 == nullid: |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
334 fparent1, fparent2 = fparent2, nullid |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
335 elif fparent2 != nullid: |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
336 # 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
|
337 fparentancestors = flog.commonancestorsheads(fparent1, fparent2) |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
338 if fparent1 in fparentancestors: |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
339 fparent1, fparent2 = fparent2, nullid |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
340 elif fparent2 in fparentancestors: |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
341 fparent2 = nullid |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
342 elif not fparentancestors: |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
343 # 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
|
344 if ( |
037e88d453fa
commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45443
diff
changeset
|
345 ms.active() |
037e88d453fa
commit: pass mergestate into _filecommit() instead of re-reading it
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45443
diff
changeset
|
346 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
|
347 ): |
45240
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
348 fparent1, fparent2 = fparent2, nullid |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
349 |
45588
479cce8c9882
commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45454
diff
changeset
|
350 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:
45454
diff
changeset
|
351 # 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:
45454
diff
changeset
|
352 # 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:
45454
diff
changeset
|
353 # 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:
45454
diff
changeset
|
354 # 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:
45454
diff
changeset
|
355 if ( |
479cce8c9882
commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45454
diff
changeset
|
356 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:
45454
diff
changeset
|
357 and ms.active() |
479cce8c9882
commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45454
diff
changeset
|
358 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:
45454
diff
changeset
|
359 ): |
479cce8c9882
commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45454
diff
changeset
|
360 force_new_node = True |
45240
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
361 # is the file changed? |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
362 text = fctx.data() |
45588
479cce8c9882
commit: force create a new filenode if it was set in mergestate by merge
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45454
diff
changeset
|
363 if fparent2 != nullid or meta or flog.cmp(fparent1, text) or force_new_node: |
45240
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
364 if touched is None: # do not overwrite added |
45615
094a91a183f1
changing-files: record merged files at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45588
diff
changeset
|
365 if fparent2 == nullid: |
094a91a183f1
changing-files: record merged files at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45588
diff
changeset
|
366 touched = 'modified' |
094a91a183f1
changing-files: record merged files at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45588
diff
changeset
|
367 else: |
094a91a183f1
changing-files: record merged files at commit time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45588
diff
changeset
|
368 touched = 'merged' |
45240
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
369 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
|
370 # are just the flags changed during merge? |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
371 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
|
372 touched = 'modified' |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
373 fnode = fparent1 |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
374 else: |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
375 fnode = fparent1 |
ce9ee81df9ff
commitctx: extract _filecommit too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45239
diff
changeset
|
376 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
|
377 |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
378 |
45273
e15416c95b25
commitctx: explicitly pass `manifest` to _commit_manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45266
diff
changeset
|
379 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
|
380 """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
|
381 |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
382 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
|
383 - 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
|
384 - 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
|
385 - 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
|
386 |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
387 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
|
388 |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
389 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
|
390 """ |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
391 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
|
392 |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
393 md = None |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
394 |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
395 # 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
|
396 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
|
397 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
|
398 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
|
399 |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
400 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
|
401 |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
402 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
|
403 # 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
|
404 # 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
|
405 # 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
|
406 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
|
407 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
|
408 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
|
409 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
|
410 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
|
411 ) |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
412 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
|
413 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
|
414 # 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
|
415 # 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
|
416 # 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
|
417 # 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
|
418 # 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
|
419 # 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
|
420 # 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
|
421 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
|
422 tr, |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
423 linkrev, |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
424 p1.manifestnode(), |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
425 p2.manifestnode(), |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
426 added, |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
427 drop, |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
428 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
|
429 ) |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
430 else: |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
431 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
|
432 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
|
433 ) |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
434 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
|
435 |
f0d4d1343cb4
commitctx: extract the function that commit a new manifest
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45257
diff
changeset
|
436 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
|
437 |
b3040b6739ce
commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45274
diff
changeset
|
438 |
45344
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45277
diff
changeset
|
439 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
|
440 """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
|
441 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
|
442 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
|
443 filesadded = files.added |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45277
diff
changeset
|
444 filesremoved = files.removed |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45277
diff
changeset
|
445 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
|
446 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
|
447 # 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
|
448 # 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
|
449 # 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
|
450 # filelogs. |
0041a42c6f28
commitctx: gather more code dealing with copy-in-extra
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45276
diff
changeset
|
451 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
|
452 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
|
453 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
|
454 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
|
455 |
45275
b3040b6739ce
commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45274
diff
changeset
|
456 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
|
457 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
|
458 extra = {} |
b3040b6739ce
commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45274
diff
changeset
|
459 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
|
460 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
|
461 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
|
462 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
|
463 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
|
464 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
|
465 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
|
466 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
|
467 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
|
468 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
|
469 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
|
470 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
|
471 return extra |