annotate mercurial/merge.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 49ffaa4f65f6
children c4f14db3da1d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
1 # merge.py - directory-level update/merge handling for Mercurial
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
2 #
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
3 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8152
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9783
diff changeset
6 # GNU General Public License version 2 or any later version.
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
7
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
8 from __future__ import absolute_import
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
9
45313
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45312
diff changeset
10 import collections
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
11 import errno
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
12 import stat
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
13 import struct
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
14
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
15 from .i18n import _
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
16 from .node import (
30371
1070df141718 dirstate: change added/modified placeholder hash length to 20 bytes
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
17 addednodeid,
30372
3c6893ba2d36 merge: change modified indicator to be 20 bytes
Durham Goode <durham@fb.com>
parents: 30371
diff changeset
18 modifiednodeid,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
19 nullid,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
20 nullrev,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
21 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
22 from .thirdparty import attr
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
23 from . import (
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
24 copies,
39823
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39481
diff changeset
25 encoding,
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26570
diff changeset
26 error,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
27 filemerge,
31267
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31185
diff changeset
28 match as matchmod,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
29 mergestate as mergestatemod,
33152
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33107
diff changeset
30 obsutil,
43677
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
31 pathutil,
30528
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30495
diff changeset
32 pycompat,
27656
57c0d4888ca8 batchget: add support for backing up files
Siddharth Agarwal <sid0@fb.com>
parents: 27655
diff changeset
33 scmutil,
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
34 subrepoutil,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
35 util,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
36 worker,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
37 )
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
38
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
39 _pack = struct.pack
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
40 _unpack = struct.unpack
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
41
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
42
27740
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
43 def _getcheckunknownconfig(repo, section, name):
34522
bed1d2eaa108 configitems: register 'merge.checkunknown' and 'merge.checkignored'
Boris Feld <boris.feld@octobus.net>
parents: 34486
diff changeset
44 config = repo.ui.config(section, name)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
45 valid = [b'abort', b'ignore', b'warn']
27740
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
46 if config not in valid:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
47 validstr = b', '.join([b"'" + v + b"'" for v in valid])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
48 raise error.ConfigError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
49 _(b"%s.%s not valid ('%s' is none of %s)")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
50 % (section, name, config, validstr)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
51 )
27740
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
52 return config
da5634e1b8a3 merge: factor out code to get checkunknown config
Siddharth Agarwal <sid0@fb.com>
parents: 27657
diff changeset
53
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
54
23653
0297d8469350 merge: don't overwrite untracked file at directory rename target
Martin von Zweigbergk <martinvonz@google.com>
parents: 23652
diff changeset
55 def _checkunknownfile(repo, wctx, mctx, f, f2=None):
35297
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
56 if wctx.isinmemory():
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
57 # Nothing to do in IMM because nothing in the "working copy" can be an
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
58 # unknown file.
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
59 #
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
60 # Note that we should bail out here, not in ``_checkunknownfiles()``,
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
61 # because that function does other useful work.
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
62 return False
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
63
23653
0297d8469350 merge: don't overwrite untracked file at directory rename target
Martin von Zweigbergk <martinvonz@google.com>
parents: 23652
diff changeset
64 if f2 is None:
0297d8469350 merge: don't overwrite untracked file at directory rename target
Martin von Zweigbergk <martinvonz@google.com>
parents: 23652
diff changeset
65 f2 = f
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
66 return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
67 repo.wvfs.audit.check(f)
28088
19424f960bf5 checkunknown: audit path before checking if it's a file or link
Durham Goode <durham@fb.com>
parents: 28022
diff changeset
68 and repo.wvfs.isfileorlink(f)
16284
2b0a406d3043 merge: fix unknown file merge detection for case-folding systems
Matt Mackall <mpm@selenic.com>
parents: 16261
diff changeset
69 and repo.dirstate.normalize(f) not in repo.dirstate
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
70 and mctx[f2].cmp(wctx[f])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
71 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
72
16093
7e30f5f2285f merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents: 16092
diff changeset
73
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
74 class _unknowndirschecker(object):
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
75 """
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
76 Look for any unknown files or directories that may have a path conflict
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
77 with a file. If any path prefix of the file exists as a file or link,
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
78 then it conflicts. If the file itself is a directory that contains any
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
79 file that is not tracked, then it conflicts.
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
80
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
81 Returns the shortest path at which a conflict occurs, or None if there is
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
82 no conflict.
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
83 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
84
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
85 def __init__(self):
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
86 # A set of paths known to be good. This prevents repeated checking of
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
87 # dirs. It will be updated with any new dirs that are checked and found
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
88 # to be safe.
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
89 self._unknowndircache = set()
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
90
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
91 # A set of paths that are known to be absent. This prevents repeated
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
92 # checking of subdirectories that are known not to exist. It will be
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
93 # updated with any new dirs that are checked and found to be absent.
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
94 self._missingdircache = set()
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
95
35297
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
96 def __call__(self, repo, wctx, f):
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
97 if wctx.isinmemory():
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
98 # Nothing to do in IMM for the same reason as ``_checkunknownfile``.
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
99 return False
5db3c748ce8f merge: don't check for unknown files in IMM
Phil Cohen <phillco@fb.com>
parents: 35293
diff changeset
100
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
101 # Check for path prefixes that exist as unknown files.
43677
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
102 for p in reversed(list(pathutil.finddirs(f))):
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
103 if p in self._missingdircache:
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
104 return
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
105 if p in self._unknowndircache:
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
106 continue
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
107 if repo.wvfs.audit.check(p):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
108 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
109 repo.wvfs.isfileorlink(p)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
110 and repo.dirstate.normalize(p) not in repo.dirstate
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
111 ):
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
112 return p
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
113 if not repo.wvfs.lexists(p):
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
114 self._missingdircache.add(p)
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
115 return
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
116 self._unknowndircache.add(p)
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
117
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
118 # Check if the file conflicts with a directory containing unknown files.
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
119 if repo.wvfs.audit.check(f) and repo.wvfs.isdir(f):
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
120 # Does the directory contain any files that are not in the dirstate?
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
121 for p, dirs, files in repo.wvfs.walk(f):
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
122 for fn in files:
37089
658b1d28813c merge: pconvert paths in _unknowndirschecker before dirstate-normalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 36566
diff changeset
123 relf = util.pconvert(repo.wvfs.reljoin(p, fn))
37090
e4640ec346ac merge: add 'isknown=True' to a dirstate.normalize() in _unknowndirschecker
Matt Harbison <matt_harbison@yahoo.com>
parents: 37089
diff changeset
124 relf = repo.dirstate.normalize(relf, isknown=True)
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
125 if relf not in repo.dirstate:
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
126 return f
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
127 return None
34550
53e4bcab346b merge: add _checkunknowndirs function for detecting path conflicts
Mark Thomas <mbthomas@fb.com>
parents: 34549
diff changeset
128
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
129
45308
4ad6c4e9e35f merge: pass mergeresult instead of actions in _checkunknownfiles() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45307
diff changeset
130 def _checkunknownfiles(repo, wctx, mctx, force, mresult, mergeforce):
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
131 """
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
132 Considers any actions that care about the presence of conflicting unknown
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
133 files. For some actions, the result is to abort; for others, it is to
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
134 choose a different action.
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
135 """
34551
1609a5afc4f5 merge: rename conflicts to fileconflicts in _checkunknownfiles
Mark Thomas <mbthomas@fb.com>
parents: 34550
diff changeset
136 fileconflicts = set()
34552
33c8a6837181 merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34551
diff changeset
137 pathconflicts = set()
28018
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
138 warnconflicts = set()
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
139 abortconflicts = set()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
140 unknownconfig = _getcheckunknownconfig(repo, b'merge', b'checkunknown')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
141 ignoredconfig = _getcheckunknownconfig(repo, b'merge', b'checkignored')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
142 pathconfig = repo.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
143 b'experimental', b'merge.checkpathconflicts'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
144 )
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
145 if not force:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
146
27741
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
147 def collectconflicts(conflicts, config):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
148 if config == b'abort':
27741
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
149 abortconflicts.update(conflicts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
150 elif config == b'warn':
27741
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
151 warnconflicts.update(conflicts)
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
152
34997
b85962350bb3 merge: cache unknown dir checks (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34941
diff changeset
153 checkunknowndirs = _unknowndirschecker()
45366
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
154 for f in mresult.files(
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
155 (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
156 mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
157 mergestatemod.ACTION_DELETED_CHANGED,
45366
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
158 )
45314
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
159 ):
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
160 if _checkunknownfile(repo, wctx, mctx, f):
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
161 fileconflicts.add(f)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
162 elif pathconfig and f not in wctx:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
163 path = checkunknowndirs(repo, wctx, f)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
164 if path is not None:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
165 pathconflicts.add(path)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
166 for f, args, msg in mresult.getactions(
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
167 [mergestatemod.ACTION_LOCAL_DIR_RENAME_GET]
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
168 ):
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
169 if _checkunknownfile(repo, wctx, mctx, f, args[0]):
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
170 fileconflicts.add(f)
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
171
34552
33c8a6837181 merge: check for path conflicts when updating (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34551
diff changeset
172 allconflicts = fileconflicts | pathconflicts
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
173 ignoredconflicts = {c for c in allconflicts if repo.dirstate._ignore(c)}
34551
1609a5afc4f5 merge: rename conflicts to fileconflicts in _checkunknownfiles
Mark Thomas <mbthomas@fb.com>
parents: 34550
diff changeset
174 unknownconflicts = allconflicts - ignoredconflicts
27742
6b639caa1652 merge: split up checks for unknown and ignored files that differ
Siddharth Agarwal <sid0@fb.com>
parents: 27741
diff changeset
175 collectconflicts(ignoredconflicts, ignoredconfig)
6b639caa1652 merge: split up checks for unknown and ignored files that differ
Siddharth Agarwal <sid0@fb.com>
parents: 27741
diff changeset
176 collectconflicts(unknownconflicts, unknownconfig)
28022
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
177 else:
45361
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
178 for f, args, msg in list(
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
179 mresult.getactions([mergestatemod.ACTION_CREATED_MERGE])
45314
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
180 ):
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
181 fl2, anc = args
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
182 different = _checkunknownfile(repo, wctx, mctx, f)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
183 if repo.dirstate._ignore(f):
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
184 config = ignoredconfig
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
185 else:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
186 config = unknownconfig
28022
e397b58c0563 rebase: respect checkunknown and checkignored in more cases
Siddharth Agarwal <sid0@fb.com>
parents: 28020
diff changeset
187
45314
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
188 # The behavior when force is True is described by this table:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
189 # config different mergeforce | action backup
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
190 # * n * | get n
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
191 # * y y | merge -
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
192 # abort y n | merge - (1)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
193 # warn y n | warn + get y
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
194 # ignore y n | get y
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
195 #
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
196 # (1) this is probably the wrong behavior here -- we should
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
197 # probably abort, but some actions like rebases currently
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
198 # don't like an abort happening in the middle of
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
199 # merge.update.
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
200 if not different:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
201 mresult.addfile(
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
202 f,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
203 mergestatemod.ACTION_GET,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
204 (fl2, False),
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
205 b'remote created',
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
206 )
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
207 elif mergeforce or config == b'abort':
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
208 mresult.addfile(
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
209 f,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
210 mergestatemod.ACTION_MERGE,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
211 (f, f, None, False, anc),
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
212 b'remote differs from untracked local',
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
213 )
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
214 elif config == b'abort':
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
215 abortconflicts.add(f)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
216 else:
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
217 if config == b'warn':
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
218 warnconflicts.add(f)
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
219 mresult.addfile(
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
220 f, mergestatemod.ACTION_GET, (fl2, True), b'remote created',
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
221 )
27741
3951f132958f merge: determine what untracked conflicts cause warns and aborts separately
Siddharth Agarwal <sid0@fb.com>
parents: 27740
diff changeset
222
28018
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
223 for f in sorted(abortconflicts):
34553
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
224 warn = repo.ui.warn
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
225 if f in pathconflicts:
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
226 if repo.wvfs.isfileorlink(f):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
227 warn(_(b"%s: untracked file conflicts with directory\n") % f)
34553
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
228 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
229 warn(_(b"%s: untracked directory conflicts with file\n") % f)
34553
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
230 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
231 warn(_(b"%s: untracked file differs\n") % f)
28018
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
232 if abortconflicts:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
233 raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
234 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
235 b"untracked files in working directory "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
236 b"differ from files in requested revision"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
237 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
238 )
28018
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
239
3feadb0b6c34 merge: move abort/warn checks up to the top level of _checkunknownfiles
Siddharth Agarwal <sid0@fb.com>
parents: 28011
diff changeset
240 for f in sorted(warnconflicts):
34553
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
241 if repo.wvfs.isfileorlink(f):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
242 repo.ui.warn(_(b"%s: replacing untracked file\n") % f)
34553
0217d66846f7 merge: improve error messages for path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34552
diff changeset
243 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
244 repo.ui.warn(_(b"%s: replacing untracked files in directory\n") % f)
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
245
45361
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
246 for f, args, msg in list(
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
247 mresult.getactions([mergestatemod.ACTION_CREATED])
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
248 ):
45314
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
249 backup = (
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
250 f in fileconflicts
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
251 or f in pathconflicts
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
252 or any(p in pathconflicts for p in pathutil.finddirs(f))
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
253 )
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
254 (flags,) = args
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
255 mresult.addfile(f, mergestatemod.ACTION_GET, (flags, backup), msg)
23655
79235b46062c merge: extract method for checking for conflicting untracked file
Martin von Zweigbergk <martinvonz@google.com>
parents: 23654
diff changeset
256
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
257
45368
1aef38d973e8 merge: pass mergeresult obj in _forgetremoved() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45367
diff changeset
258 def _forgetremoved(wctx, mctx, branchmerge, mresult):
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
259 """
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
260 Forget removed files
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
261
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
262 If we're jumping between revisions (as opposed to merging), and if
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
263 neither the working directory nor the target rev has the file,
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
264 then we need to remove it from the dirstate, to prevent the
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
265 dirstate from listing the file when it is no longer in the
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
266 manifest.
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
267
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
268 If we're merging, and the other revision has removed a file
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
269 that is not present in the working directory, we need to mark it
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
270 as removed.
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
271 """
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
272
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
273 m = mergestatemod.ACTION_FORGET
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
274 if branchmerge:
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
275 m = mergestatemod.ACTION_REMOVE
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
276 for f in wctx.deleted():
6272
dd9bd227ae9a merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents: 6271
diff changeset
277 if f not in mctx:
45368
1aef38d973e8 merge: pass mergeresult obj in _forgetremoved() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45367
diff changeset
278 mresult.addfile(f, m, None, b"forget deleted")
6242
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
279
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
280 if not branchmerge:
a375ffc2aa1b merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
281 for f in wctx.removed():
6272
dd9bd227ae9a merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents: 6271
diff changeset
282 if f not in mctx:
45368
1aef38d973e8 merge: pass mergeresult obj in _forgetremoved() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45367
diff changeset
283 mresult.addfile(
1aef38d973e8 merge: pass mergeresult obj in _forgetremoved() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45367
diff changeset
284 f, mergestatemod.ACTION_FORGET, None, b"forget removed",
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
285 )
3107
3bd05ad67f45 merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3106
diff changeset
286
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
287
45354
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
288 def _checkcollision(repo, wmf, mresult):
38078
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
289 """
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
290 Check for case-folding collisions.
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
291 """
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
292 # If the repo is narrowed, filter out files outside the narrowspec.
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
293 narrowmatch = repo.narrowmatch()
18e6ea9ba81d narrow: filter set of files to check for case-folding to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38077
diff changeset
294 if not narrowmatch.always():
44333
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44318
diff changeset
295 pmmf = set(wmf.walk(narrowmatch))
45354
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
296 if mresult:
45366
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
297 for f in list(mresult.files()):
45354
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
298 if not narrowmatch(f):
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
299 mresult.removefile(f)
44333
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44318
diff changeset
300 else:
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44318
diff changeset
301 # build provisional merged manifest up
e76d98546bd2 merge: use manifestdict.walk() instead of manifestdict.matches()
Augie Fackler <augie@google.com>
parents: 44318
diff changeset
302 pmmf = set(wmf)
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
303
45354
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
304 if mresult:
37115
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
305 # KEEP and EXEC are no-op
45366
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
306 for f in mresult.files(
45354
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
307 (
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
308 mergestatemod.ACTION_ADD,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
309 mergestatemod.ACTION_ADD_MODIFIED,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
310 mergestatemod.ACTION_FORGET,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
311 mergestatemod.ACTION_GET,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
312 mergestatemod.ACTION_CHANGED_DELETED,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
313 mergestatemod.ACTION_DELETED_CHANGED,
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
314 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
315 ):
45354
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
316 pmmf.add(f)
45366
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
317 for f in mresult.files((mergestatemod.ACTION_REMOVE,)):
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
318 pmmf.discard(f)
45354
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
319 for f, args, msg in mresult.getactions(
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
320 [mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL]
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
321 ):
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
322 f2, flags = args
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
323 pmmf.discard(f2)
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
324 pmmf.add(f)
45366
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
325 for f in mresult.files((mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,)):
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
326 pmmf.add(f)
45354
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
327 for f, args, msg in mresult.getactions([mergestatemod.ACTION_MERGE]):
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
328 f1, f2, fa, move, anc = args
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
329 if move:
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
330 pmmf.discard(f1)
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
331 pmmf.add(f)
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
332
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
333 # check case-folding collision in provisional merged manifest
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
334 foldmap = {}
33829
055fee3547df merge: removed sorting in casefolding detection, for a slight performance win
Alex Gaynor <agaynor@mozilla.com>
parents: 33499
diff changeset
335 for f in pmmf:
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
336 fold = util.normcase(f)
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
337 if fold in foldmap:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
338 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
339 _(b"case-folding collision between %s and %s")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
340 % (f, foldmap[fold])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
341 )
19105
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
342 foldmap[fold] = f
c60a7f5a741f icasefs: rewrite case-folding collision detection (issue3452)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19095
diff changeset
343
26661
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
344 # check case-folding of directories
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
345 foldprefix = unfoldprefix = lastfull = b''
26661
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
346 for fold, f in sorted(foldmap.items()):
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
347 if fold.startswith(foldprefix) and not f.startswith(unfoldprefix):
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
348 # the folded prefix matches but actual casing is different
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
349 raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
350 _(b"case-folding collision between %s and directory of %s")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
351 % (lastfull, f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
352 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
353 foldprefix = fold + b'/'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
354 unfoldprefix = f + b'/'
26661
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
355 lastfull = f
2b955fec91e0 merge: abort on file/directory case folding collisions (issue4892)
Mads Kiilerich <madski@unity3d.com>
parents: 26651
diff changeset
356
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
357
26785
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
358 def driverpreprocess(repo, ms, wctx, labels=None):
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
359 """run the preprocess step of the merge driver, if any
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
360
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
361 This is currently not implemented -- it's an extension point."""
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
362 return True
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
363
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
364
26785
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
365 def driverconclude(repo, ms, wctx, labels=None):
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
366 """run the conclude step of the merge driver, if any
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
367
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
368 This is currently not implemented -- it's an extension point."""
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
369 return True
e9a0d5f5c225 merge: add stubs for preprocess and conclude steps of merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26769
diff changeset
370
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
371
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
372 def _filesindirs(repo, manifest, dirs):
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
373 """
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
374 Generator that yields pairs of all the files in the manifest that are found
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
375 inside the directories listed in dirs, and which directory they are found
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
376 in.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
377 """
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
378 for f in manifest:
43677
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
379 for p in pathutil.finddirs(f):
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
380 if p in dirs:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
381 yield f, p
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
382 break
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
383
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
384
45305
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45304
diff changeset
385 def checkpathconflicts(repo, wctx, mctx, mresult):
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
386 """
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
387 Check if any actions introduce path conflicts in the repository, updating
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
388 actions to record or handle the path conflict accordingly.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
389 """
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
390 mf = wctx.manifest()
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
391
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
392 # The set of local files that conflict with a remote directory.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
393 localconflicts = set()
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
394
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
395 # The set of directories that conflict with a remote file, and so may cause
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
396 # conflicts if they still contain any files after the merge.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
397 remoteconflicts = set()
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
398
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
399 # The set of directories that appear as both a file and a directory in the
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
400 # remote manifest. These indicate an invalid remote manifest, which
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
401 # can't be updated to cleanly.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
402 invalidconflicts = set()
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
403
34998
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
404 # The set of directories that contain files that are being created.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
405 createdfiledirs = set()
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
406
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
407 # The set of files deleted by all the actions.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
408 deletedfiles = set()
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
409
45366
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
410 for f in mresult.files(
45363
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
411 (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
412 mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
413 mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
414 mergestatemod.ACTION_MERGE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
415 mergestatemod.ACTION_CREATED_MERGE,
45363
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
416 )
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
417 ):
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
418 # This action may create a new local file.
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
419 createdfiledirs.update(pathutil.finddirs(f))
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
420 if mf.hasdir(f):
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
421 # The file aliases a local directory. This might be ok if all
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
422 # the files in the local directory are being deleted. This
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
423 # will be checked once we know what all the deleted files are.
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
424 remoteconflicts.add(f)
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
425 # Track the names of all deleted files.
45366
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
426 for f in mresult.files((mergestatemod.ACTION_REMOVE,)):
45363
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
427 deletedfiles.add(f)
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
428 for (f, args, msg) in mresult.getactions((mergestatemod.ACTION_MERGE,)):
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
429 f1, f2, fa, move, anc = args
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
430 if move:
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
431 deletedfiles.add(f1)
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
432 for (f, args, msg) in mresult.getactions(
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
433 (mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL,)
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
434 ):
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
435 f2, flags = args
150900a17ec2 merge: rework iteration over mergeresult object in checkpathconflicts()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45362
diff changeset
436 deletedfiles.add(f2)
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
437
34998
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
438 # Check all directories that contain created files for path conflicts.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
439 for p in createdfiledirs:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
440 if p in mf:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
441 if p in mctx:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
442 # A file is in a directory which aliases both a local
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
443 # and a remote file. This is an internal inconsistency
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
444 # within the remote manifest.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
445 invalidconflicts.add(p)
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
446 else:
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
447 # A file is in a directory which aliases a local file.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
448 # We will need to rename the local file.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
449 localconflicts.add(p)
45365
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45364
diff changeset
450 pd = mresult.getfile(p)
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45364
diff changeset
451 if pd and pd[0] in (
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
452 mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
453 mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
454 mergestatemod.ACTION_MERGE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
455 mergestatemod.ACTION_CREATED_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
456 ):
34998
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
457 # The file is in a directory which aliases a remote file.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
458 # This is an internal inconsistency within the remote
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
459 # manifest.
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
460 invalidconflicts.add(p)
a92b9f8e11ba merge: check created file dirs for path conflicts only once (issue5716)
Mark Thomas <mbthomas@fb.com>
parents: 34997
diff changeset
461
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
462 # Rename all local conflicting files that have not been deleted.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
463 for p in localconflicts:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
464 if p not in deletedfiles:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
465 ctxname = bytes(wctx).rstrip(b'+')
45366
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
466 pnew = util.safename(p, ctxname, wctx, set(mresult.files()))
44980
818b4f19ef23 merge: move an inspection of the dirstate from record to calculate phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44915
diff changeset
467 porig = wctx[p].copysource() or p
45305
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45304
diff changeset
468 mresult.addfile(
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45304
diff changeset
469 pnew,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
470 mergestatemod.ACTION_PATH_CONFLICT_RESOLVE,
44980
818b4f19ef23 merge: move an inspection of the dirstate from record to calculate phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44915
diff changeset
471 (p, porig),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
472 b'local path conflict',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
473 )
45305
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45304
diff changeset
474 mresult.addfile(
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45304
diff changeset
475 p,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
476 mergestatemod.ACTION_PATH_CONFLICT,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
477 (pnew, b'l'),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
478 b'path conflict',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
479 )
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
480
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
481 if remoteconflicts:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
482 # Check if all files in the conflicting directories have been removed.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
483 ctxname = bytes(mctx).rstrip(b'+')
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
484 for f, p in _filesindirs(repo, mf, remoteconflicts):
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
485 if f not in deletedfiles:
45365
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45364
diff changeset
486 m, args, msg = mresult.getfile(p)
45366
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
487 pnew = util.safename(p, ctxname, wctx, set(mresult.files()))
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
488 if m in (
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
489 mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
490 mergestatemod.ACTION_MERGE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
491 ):
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
492 # Action was merge, just update target.
45305
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45304
diff changeset
493 mresult.addfile(pnew, m, args, msg)
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
494 else:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
495 # Action was create, change to renamed get action.
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
496 fl = args[0]
45305
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45304
diff changeset
497 mresult.addfile(
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45304
diff changeset
498 pnew,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
499 mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
500 (p, fl),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
501 b'remote path conflict',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
502 )
45305
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45304
diff changeset
503 mresult.addfile(
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45304
diff changeset
504 p,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
505 mergestatemod.ACTION_PATH_CONFLICT,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
506 (pnew, mergestatemod.ACTION_REMOVE),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
507 b'path conflict',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
508 )
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
509 remoteconflicts.remove(p)
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
510 break
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
511
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
512 if invalidconflicts:
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
513 for p in invalidconflicts:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
514 repo.ui.warn(_(b"%s: is both a file and a directory\n") % p)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
515 raise error.Abort(_(b"destination manifest contains path conflicts"))
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
516
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
517
45306
e7196f1da2b1 merge: pass mergeresult obj instead of actions in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45305
diff changeset
518 def _filternarrowactions(narrowmatch, branchmerge, mresult):
38077
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
519 """
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
520 Filters out actions that can ignored because the repo is narrowed.
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
521
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
522 Raise an exception if the merge cannot be completed because the repo is
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
523 narrowed.
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
524 """
45364
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45363
diff changeset
525 # TODO: handle with nonconflicttypes
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45363
diff changeset
526 nonconflicttypes = {
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45363
diff changeset
527 mergestatemod.ACTION_ADD,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45363
diff changeset
528 mergestatemod.ACTION_ADD_MODIFIED,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45363
diff changeset
529 mergestatemod.ACTION_CREATED,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45363
diff changeset
530 mergestatemod.ACTION_CREATED_MERGE,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45363
diff changeset
531 mergestatemod.ACTION_FORGET,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45363
diff changeset
532 mergestatemod.ACTION_GET,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45363
diff changeset
533 mergestatemod.ACTION_REMOVE,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45363
diff changeset
534 mergestatemod.ACTION_EXEC,
e3826f1dab60 merge: use ACTION_* constants instead of values in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45363
diff changeset
535 }
38077
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
536 # We mutate the items in the dict during iteration, so iterate
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
537 # over a copy.
45367
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45366
diff changeset
538 for f, action in mresult.filemap():
38077
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
539 if narrowmatch(f):
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
540 pass
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
541 elif not branchmerge:
45306
e7196f1da2b1 merge: pass mergeresult obj instead of actions in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45305
diff changeset
542 mresult.removefile(f) # just updating, ignore changes outside clone
45477
14b3dbfa4eeb mergeresult: introduce dedicated tuple for no-op actions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45473
diff changeset
543 elif action[0] in mergeresult.NO_OP_ACTIONS:
45306
e7196f1da2b1 merge: pass mergeresult obj instead of actions in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45305
diff changeset
544 mresult.removefile(f) # merge does not affect file
38077
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
545 elif action[0] in nonconflicttypes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
546 raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
547 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
548 b'merge affects file \'%s\' outside narrow, '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
549 b'which is not yet supported'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
550 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
551 % f,
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
552 hint=_(b'merging in the other direction may work'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
553 )
38077
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
554 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
555 raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
556 _(b'conflict in file \'%s\' is outside narrow clone') % f
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
557 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
558
38077
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
559
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
560 class mergeresult(object):
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
561 ''''An object representing result of merging manifests.
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
562
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
563 It has information about what actions need to be performed on dirstate
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
564 mapping of divergent renames and other such cases. '''
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
565
45478
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45477
diff changeset
566 NO_OP_ACTIONS = (
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45477
diff changeset
567 mergestatemod.ACTION_KEEP,
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45477
diff changeset
568 mergestatemod.ACTION_KEEP_ABSENT,
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45477
diff changeset
569 )
45477
14b3dbfa4eeb mergeresult: introduce dedicated tuple for no-op actions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45473
diff changeset
570
45302
fe2040abb183 merge: make mergeresult constructor initialize empty object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
571 def __init__(self):
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
572 """
45312
26fa2eebc291 mergeresult: rename _actions to _filemapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45311
diff changeset
573 filemapping: dict of filename as keys and action related info as values
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
574 diverge: mapping of source name -> list of dest name for
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
575 divergent renames
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
576 renamedelete: mapping of source name -> list of destinations for files
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
577 deleted on one side and renamed on other.
45296
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45295
diff changeset
578 commitinfo: dict containing data which should be used on commit
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45295
diff changeset
579 contains a filename -> info mapping
45320
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45317
diff changeset
580 actionmapping: dict of action names as keys and values are dict of
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45317
diff changeset
581 filename as key and related data as values
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
582 """
45312
26fa2eebc291 mergeresult: rename _actions to _filemapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45311
diff changeset
583 self._filemapping = {}
45302
fe2040abb183 merge: make mergeresult constructor initialize empty object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
584 self._diverge = {}
fe2040abb183 merge: make mergeresult constructor initialize empty object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
585 self._renamedelete = {}
45403
f970cca30989 merge: use collections.defaultdict() for mergeresult.commitinfo
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45370
diff changeset
586 self._commitinfo = collections.defaultdict(dict)
45320
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45317
diff changeset
587 self._actionmapping = collections.defaultdict(dict)
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
588
45404
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45403
diff changeset
589 def updatevalues(self, diverge, renamedelete):
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
590 self._diverge = diverge
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
591 self._renamedelete = renamedelete
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
592
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
593 def addfile(self, filename, action, data, message):
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
594 """ adds a new file to the mergeresult object
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
595
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
596 filename: file which we are adding
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
597 action: one of mergestatemod.ACTION_*
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
598 data: a tuple of information like fctx and ctx related to this merge
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
599 message: a message about the merge
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
600 """
45313
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45312
diff changeset
601 # if the file already existed, we need to delete it's old
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45312
diff changeset
602 # entry form _actionmapping too
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45312
diff changeset
603 if filename in self._filemapping:
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45312
diff changeset
604 a, d, m = self._filemapping[filename]
45320
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45317
diff changeset
605 del self._actionmapping[a][filename]
45313
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45312
diff changeset
606
45312
26fa2eebc291 mergeresult: rename _actions to _filemapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45311
diff changeset
607 self._filemapping[filename] = (action, data, message)
45320
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45317
diff changeset
608 self._actionmapping[action][filename] = (data, message)
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
609
45365
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45364
diff changeset
610 def getfile(self, filename, default_return=None):
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45364
diff changeset
611 """ returns (action, args, msg) about this file
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45364
diff changeset
612
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45364
diff changeset
613 returns default_return if the file is not present """
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45364
diff changeset
614 if filename in self._filemapping:
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45364
diff changeset
615 return self._filemapping[filename]
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45364
diff changeset
616 return default_return
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45364
diff changeset
617
45366
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
618 def files(self, actions=None):
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
619 """ returns files on which provided action needs to perfromed
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
620
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
621 If actions is None, all files are returned
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
622 """
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
623 # TODO: think whether we should return renamedelete and
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
624 # diverge filenames also
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
625 if actions is None:
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
626 for f in self._filemapping:
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
627 yield f
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
628
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
629 else:
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
630 for a in actions:
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
631 for f in self._actionmapping[a]:
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
632 yield f
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
633
45304
f1fb9a079131 merge: add removefile() to mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45303
diff changeset
634 def removefile(self, filename):
f1fb9a079131 merge: add removefile() to mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45303
diff changeset
635 """ removes a file from the mergeresult object as the file might
f1fb9a079131 merge: add removefile() to mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45303
diff changeset
636 not merging anymore """
45313
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45312
diff changeset
637 action, data, message = self._filemapping[filename]
45312
26fa2eebc291 mergeresult: rename _actions to _filemapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45311
diff changeset
638 del self._filemapping[filename]
45320
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45317
diff changeset
639 del self._actionmapping[action][filename]
45313
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45312
diff changeset
640
45357
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45356
diff changeset
641 def getactions(self, actions, sort=False):
45313
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45312
diff changeset
642 """ get list of files which are marked with these actions
45357
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45356
diff changeset
643 if sort is true, files for each action is sorted and then added
45313
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45312
diff changeset
644
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45312
diff changeset
645 Returns a list of tuple of form (filename, data, message)
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45312
diff changeset
646 """
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45312
diff changeset
647 for a in actions:
45357
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45356
diff changeset
648 if sort:
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45356
diff changeset
649 for f in sorted(self._actionmapping[a]):
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45356
diff changeset
650 args, msg = self._actionmapping[a][f]
45361
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
651 yield f, args, msg
45357
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45356
diff changeset
652 else:
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45356
diff changeset
653 for f, (args, msg) in pycompat.iteritems(
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45356
diff changeset
654 self._actionmapping[a]
27c6518b7287 mergeresult: add sort argument to getactions() method
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45356
diff changeset
655 ):
45361
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
656 yield f, args, msg
45304
f1fb9a079131 merge: add removefile() to mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45303
diff changeset
657
45359
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45358
diff changeset
658 def len(self, actions=None):
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45358
diff changeset
659 """ returns number of files which needs actions
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45358
diff changeset
660
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45358
diff changeset
661 if actions is passed, total of number of files in that action
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45358
diff changeset
662 only is returned """
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45358
diff changeset
663
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45358
diff changeset
664 if actions is None:
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45358
diff changeset
665 return len(self._filemapping)
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45358
diff changeset
666
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45358
diff changeset
667 return sum(len(self._actionmapping[a]) for a in actions)
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45358
diff changeset
668
45367
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45366
diff changeset
669 def filemap(self, sort=False):
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45366
diff changeset
670 if sorted:
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45366
diff changeset
671 for key, val in sorted(pycompat.iteritems(self._filemapping)):
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45366
diff changeset
672 yield key, val
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45366
diff changeset
673 else:
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45366
diff changeset
674 for key, val in pycompat.iteritems(self._filemapping):
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45366
diff changeset
675 yield key, val
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
676
45404
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45403
diff changeset
677 def addcommitinfo(self, filename, key, value):
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45403
diff changeset
678 """ adds key-value information about filename which will be required
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45403
diff changeset
679 while committing this merge """
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45403
diff changeset
680 self._commitinfo[filename][key] = value
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45403
diff changeset
681
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
682 @property
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
683 def diverge(self):
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
684 return self._diverge
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
685
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
686 @property
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
687 def renamedelete(self):
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
688 return self._renamedelete
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
689
45296
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45295
diff changeset
690 @property
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45295
diff changeset
691 def commitinfo(self):
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45295
diff changeset
692 return self._commitinfo
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45295
diff changeset
693
45300
f4a2b329717b merge: move conversion of file-key dict to action-key dict in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
694 @property
f4a2b329717b merge: move conversion of file-key dict to action-key dict in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
695 def actionsdict(self):
f4a2b329717b merge: move conversion of file-key dict to action-key dict in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
696 """ returns a dictionary of actions to be perfomed with action as key
f4a2b329717b merge: move conversion of file-key dict to action-key dict in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
697 and a list of files and related arguments as values """
45369
490607efc992 merge: remove emptyactions() and use collections.defaultdict(list) instead
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45368
diff changeset
698 res = collections.defaultdict(list)
45320
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45317
diff changeset
699 for a, d in pycompat.iteritems(self._actionmapping):
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45317
diff changeset
700 for f, (args, msg) in pycompat.iteritems(d):
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45317
diff changeset
701 res[a].append((f, args, msg))
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45317
diff changeset
702 return res
45300
f4a2b329717b merge: move conversion of file-key dict to action-key dict in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45299
diff changeset
703
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
704 def setactions(self, actions):
45312
26fa2eebc291 mergeresult: rename _actions to _filemapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45311
diff changeset
705 self._filemapping = actions
45320
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45317
diff changeset
706 self._actionmapping = collections.defaultdict(dict)
45313
69691c5b8ce4 mergeresult: introduce action -> (filename, data, msg) mapping and related API
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45312
diff changeset
707 for f, (act, data, msg) in pycompat.iteritems(self._filemapping):
45320
e98f7c5babd7 mergeresult: make actionmapping a dict of dict instead of dict of lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45317
diff changeset
708 self._actionmapping[act][f] = data, msg
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
709
45299
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45298
diff changeset
710 def hasconflicts(self):
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45298
diff changeset
711 """ tells whether this merge resulted in some actions which can
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45298
diff changeset
712 result in conflicts or not """
45314
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
713 for a in self._actionmapping.keys():
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
714 if (
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
715 a
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
716 not in (
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
717 mergestatemod.ACTION_GET,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
718 mergestatemod.ACTION_EXEC,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
719 mergestatemod.ACTION_REMOVE,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
720 mergestatemod.ACTION_PATH_CONFLICT_RESOLVE,
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
721 )
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
722 and self._actionmapping[a]
45477
14b3dbfa4eeb mergeresult: introduce dedicated tuple for no-op actions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45473
diff changeset
723 and a not in self.NO_OP_ACTIONS
45299
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45298
diff changeset
724 ):
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45298
diff changeset
725 return True
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45298
diff changeset
726
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45298
diff changeset
727 return False
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45298
diff changeset
728
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
729
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
730 def manifestmerge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
731 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
732 wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
733 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
734 pa,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
735 branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
736 force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
737 matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
738 acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
739 followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
740 forcefulldiff=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
741 ):
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
742 """
30096
98d3d8108db0 merge: update doc of manifestmerge() per 18c2184c27dc
Yuya Nishihara <yuya@tcha.org>
parents: 30060
diff changeset
743 Merge wctx and p2 with ancestor pa and generate merge action list
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
744
18605
bcf29565d89f manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents: 18544
diff changeset
745 branchmerge and force are as passed in to update
27346
ba0da4b7397d merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents: 27345
diff changeset
746 matcher = matcher to filter file lists
18778
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
747 acceptremote = accept the incoming changes without prompting
45168
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
748
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
749 Returns an object of mergeresult class
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
750 """
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
751 mresult = mergeresult()
27346
ba0da4b7397d merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents: 27345
diff changeset
752 if matcher is not None and matcher.always():
ba0da4b7397d merge: rework manifestmerge to use a matcher
Augie Fackler <augie@google.com>
parents: 27345
diff changeset
753 matcher = None
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
754
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
755 # manifests fetched in order are going to be faster, so prime the caches
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
756 [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
757 x.manifest()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
758 for x in sorted(wctx.parents() + [p2, pa], key=scmutil.intrev)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
759 ]
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
760
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
761 branch_copies1 = copies.branch_copies()
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
762 branch_copies2 = copies.branch_copies()
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
763 diverge = {}
45296
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45295
diff changeset
764 # information from merge which is needed at commit time
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45295
diff changeset
765 # for example choosing filelog of which parent to commit
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45295
diff changeset
766 # TODO: use specific constants in future for this mapping
18651
e556659340f0 manifestmerge: fix order in which manifests are fetched
Siddharth Agarwal <sid0@fb.com>
parents: 18650
diff changeset
767 if followcopies:
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
768 branch_copies1, branch_copies2, diverge = copies.mergecopies(
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
769 repo, wctx, p2, pa
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
770 )
8753
af5f099d932b merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents: 8752
diff changeset
771
32664
49e1e5acb8ff py3: convert bool variables to bytes before passing into ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32635
diff changeset
772 boolbm = pycompat.bytestr(bool(branchmerge))
49e1e5acb8ff py3: convert bool variables to bytes before passing into ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32635
diff changeset
773 boolf = pycompat.bytestr(bool(force))
49e1e5acb8ff py3: convert bool variables to bytes before passing into ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32635
diff changeset
774 boolm = pycompat.bytestr(bool(matcher))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
775 repo.ui.note(_(b"resolving manifests\n"))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
776 repo.ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
777 b" branchmerge: %s, force: %s, partial: %s\n" % (boolbm, boolf, boolm)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
778 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
779 repo.ui.debug(b" ancestor: %s, local: %s, remote: %s\n" % (pa, wctx, p2))
8753
af5f099d932b merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents: 8752
diff changeset
780
18611
18c2184c27dc merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents: 18606
diff changeset
781 m1, m2, ma = wctx.manifest(), p2.manifest(), pa.manifest()
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
782 copied1 = set(branch_copies1.copy.values())
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
783 copied1.update(branch_copies1.movewithdir.values())
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
784 copied2 = set(branch_copies2.copy.values())
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
785 copied2.update(branch_copies2.movewithdir.values())
3295
72d1e521da77 merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents: 3292
diff changeset
786
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
787 if b'.hgsubstate' in m1 and wctx.rev() is None:
37878
1322ae04d3d7 merge: do not fill manifest of committed revision with pseudo node (issue5526)
Yuya Nishihara <yuya@tcha.org>
parents: 37762
diff changeset
788 # Check whether sub state is modified, and overwrite the manifest
1322ae04d3d7 merge: do not fill manifest of committed revision with pseudo node (issue5526)
Yuya Nishihara <yuya@tcha.org>
parents: 37762
diff changeset
789 # to flag the change. If wctx is a committed revision, we shouldn't
1322ae04d3d7 merge: do not fill manifest of committed revision with pseudo node (issue5526)
Yuya Nishihara <yuya@tcha.org>
parents: 37762
diff changeset
790 # care for the dirty state of the working directory.
28226
377f0d8ff874 merge: use any() instead of for loop when checking for dirty subrepos
Martin von Zweigbergk <martinvonz@google.com>
parents: 28200
diff changeset
791 if any(wctx.sub(s).dirty() for s in wctx.substate):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
792 m1[b'.hgsubstate'] = modifiednodeid
9783
ee00ef6f9be7 submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents: 9780
diff changeset
793
32200
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
794 # Don't use m2-vs-ma optimization if:
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
795 # - ma is the same as m1 or m2, which we're just going to diff again later
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
796 # - The caller specifically asks for a full diff, which is useful during bid
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
797 # merge.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
798 if pa not in ([wctx, p2] + wctx.parents()) and not forcefulldiff:
32200
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
799 # Identify which files are relevant to the merge, so we can limit the
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
800 # total m1-vs-m2 diff to just those files. This has significant
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
801 # performance benefits in large repositories.
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
802 relevantfiles = set(ma.diff(m2).keys())
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
803
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
804 # For copied and moved files, we need to add the source file too.
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
805 for copykey, copyvalue in pycompat.iteritems(branch_copies1.copy):
32200
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
806 if copyvalue in relevantfiles:
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
807 relevantfiles.add(copykey)
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
808 for movedirkey in branch_copies1.movewithdir:
32200
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
809 relevantfiles.add(movedirkey)
32531
bd56bea5ecf8 merge: use intersectmatchers() in "m2-vs-ma optimization"
Martin von Zweigbergk <martinvonz@google.com>
parents: 32390
diff changeset
810 filesmatcher = scmutil.matchfiles(repo, relevantfiles)
bd56bea5ecf8 merge: use intersectmatchers() in "m2-vs-ma optimization"
Martin von Zweigbergk <martinvonz@google.com>
parents: 32390
diff changeset
811 matcher = matchmod.intersectmatchers(matcher, filesmatcher)
32200
4d504e541d3d rebase: use matcher to optimize manifestmerge
Durham Goode <durham@fb.com>
parents: 31651
diff changeset
812
31267
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31185
diff changeset
813 diff = m1.diff(m2, match=matcher)
11831d755b51 merge: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31185
diff changeset
814
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
815 for f, ((n1, fl1), (n2, fl2)) in pycompat.iteritems(diff):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
816 if n1 and n2: # file exists on both local and remote side
23396
6a254a2dd37c merge: separate out "both created" cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23395
diff changeset
817 if f not in ma:
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
818 # TODO: what if they're renamed from different sources?
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
819 fa = branch_copies1.copy.get(
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
820 f, None
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
821 ) or branch_copies2.copy.get(f, None)
45317
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45314
diff changeset
822 args, msg = None, None
23397
c7c95838be9a merge: break out "both renamed a -> b" case
Martin von Zweigbergk <martinvonz@google.com>
parents: 23396
diff changeset
823 if fa is not None:
45317
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45314
diff changeset
824 args = (f, f, fa, False, pa.node())
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45314
diff changeset
825 msg = b'both renamed from %s' % fa
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
826 else:
45317
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45314
diff changeset
827 args = (f, f, None, False, pa.node())
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45314
diff changeset
828 msg = b'both created'
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45314
diff changeset
829 mresult.addfile(f, mergestatemod.ACTION_MERGE, args, msg)
16094
0776a6cababe merge: don't use unknown()
Matt Mackall <mpm@selenic.com>
parents: 16093
diff changeset
830 else:
23396
6a254a2dd37c merge: separate out "both created" cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23395
diff changeset
831 a = ma[f]
6a254a2dd37c merge: separate out "both created" cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23395
diff changeset
832 fla = ma.flags(f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
833 nol = b'l' not in fl1 + fl2 + fla
23395
d9ebb475eede merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23387
diff changeset
834 if n2 == a and fl2 == fla:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
835 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
836 f, mergestatemod.ACTION_KEEP, (), b'remote unchanged',
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
837 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
838 elif n1 == a and fl1 == fla: # local unchanged - use remote
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
839 if n1 == n2: # optimization: keep local content
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
840 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
841 f,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
842 mergestatemod.ACTION_EXEC,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
843 (fl2,),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
844 b'update permissions',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
845 )
23395
d9ebb475eede merge: indent to prepare for next patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 23387
diff changeset
846 else:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
847 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
848 f,
45298
c515c54f6530 merge: remove no longer required ACTION_GET_OTHER_AND_STORE
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45297
diff changeset
849 mergestatemod.ACTION_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
850 (fl2, False),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
851 b'remote is newer',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
852 )
45296
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45295
diff changeset
853 if branchmerge:
45404
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45403
diff changeset
854 mresult.addcommitinfo(
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45403
diff changeset
855 f, b'filenode-source', b'other'
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45403
diff changeset
856 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
857 elif nol and n2 == a: # remote only changed 'x'
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
858 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
859 f,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
860 mergestatemod.ACTION_EXEC,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
861 (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
862 b'update permissions',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
863 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
864 elif nol and n1 == a: # local only changed 'x'
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
865 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
866 f,
45298
c515c54f6530 merge: remove no longer required ACTION_GET_OTHER_AND_STORE
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45297
diff changeset
867 mergestatemod.ACTION_GET,
44688
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
868 (fl1, False),
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
869 b'remote is newer',
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
870 )
45296
8e8d513941b4 merge: introduce 'commitinfo' in mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45295
diff changeset
871 if branchmerge:
45404
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45403
diff changeset
872 mresult.addcommitinfo(f, b'filenode-source', b'other')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
873 else: # both changed something
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
874 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
875 f,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
876 mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
877 (f, f, f, False, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
878 b'versions differ',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
879 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
880 elif n1: # file exists only on local side
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
881 if f in copied2:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
882 pass # we'll deal with it on m2 side
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
883 elif (
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
884 f in branch_copies1.movewithdir
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
885 ): # directory rename, move local
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
886 f2 = branch_copies1.movewithdir[f]
31522
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31482
diff changeset
887 if f2 in m2:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
888 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
889 f2,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
890 mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
891 (f, f2, None, True, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
892 b'remote directory rename, both created',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
893 )
23475
67f1d68861fb merge: don't ignore conflicting file in remote renamed directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 23474
diff changeset
894 else:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
895 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
896 f2,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
897 mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
898 (f, fl1),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
899 b'remote directory rename - move from %s' % f,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
900 )
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
901 elif f in branch_copies1.copy:
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
902 f2 = branch_copies1.copy[f]
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
903 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
904 f,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
905 mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
906 (f, f2, f2, False, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
907 b'local copied/moved from %s' % f2,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
908 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
909 elif f in ma: # clean, a different, no remote
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
910 if n1 != ma[f]:
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
911 if acceptremote:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
912 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
913 f,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
914 mergestatemod.ACTION_REMOVE,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
915 None,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
916 b'remote delete',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
917 )
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
918 else:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
919 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
920 f,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
921 mergestatemod.ACTION_CHANGED_DELETED,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
922 (f, None, f, False, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
923 b'prompt changed/deleted',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
924 )
30371
1070df141718 dirstate: change added/modified placeholder hash length to 20 bytes
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
925 elif n1 == addednodeid:
45118
d0ef8c1dddd4 manifest: tigher manifest parsing and flag use
Joerg Sonnenberger <joerg@bec.de>
parents: 45073
diff changeset
926 # This file was locally added. We should forget it instead of
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
927 # deleting it.
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
928 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
929 f, mergestatemod.ACTION_FORGET, None, b'remote deleted',
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
930 )
20639
1df033640a8e merge: handle acceptremove of create+delete early in manifest merge
Mads Kiilerich <madski@unity3d.com>
parents: 20620
diff changeset
931 else:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
932 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
933 f, mergestatemod.ACTION_REMOVE, None, b'other deleted',
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
934 )
45480
49ffaa4f65f6 merge: add missing ACTION_KEEP when both remote and ancestor are not present
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45479
diff changeset
935 else: # file not in ancestor, not in remote
49ffaa4f65f6 merge: add missing ACTION_KEEP when both remote and ancestor are not present
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45479
diff changeset
936 mresult.addfile(
49ffaa4f65f6 merge: add missing ACTION_KEEP when both remote and ancestor are not present
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45479
diff changeset
937 f,
49ffaa4f65f6 merge: add missing ACTION_KEEP when both remote and ancestor are not present
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45479
diff changeset
938 mergestatemod.ACTION_KEEP,
49ffaa4f65f6 merge: add missing ACTION_KEEP when both remote and ancestor are not present
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45479
diff changeset
939 None,
49ffaa4f65f6 merge: add missing ACTION_KEEP when both remote and ancestor are not present
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45479
diff changeset
940 b'ancestor missing, remote missing',
49ffaa4f65f6 merge: add missing ACTION_KEEP when both remote and ancestor are not present
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45479
diff changeset
941 )
49ffaa4f65f6 merge: add missing ACTION_KEEP when both remote and ancestor are not present
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45479
diff changeset
942
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
943 elif n2: # file exists only on remote side
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
944 if f in copied1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
945 pass # we'll deal with it on m1 side
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
946 elif f in branch_copies2.movewithdir:
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
947 f2 = branch_copies2.movewithdir[f]
31522
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31482
diff changeset
948 if f2 in m1:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
949 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
950 f2,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
951 mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
952 (f2, f, None, False, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
953 b'local directory rename, both created',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
954 )
23476
39a12719ec65 merge: don't overwrite conflicting file in locally renamed directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 23475
diff changeset
955 else:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
956 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
957 f2,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
958 mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
959 (f, fl2),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
960 b'local directory rename - get from %s' % f,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
961 )
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
962 elif f in branch_copies2.copy:
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
963 f2 = branch_copies2.copy[f]
45317
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45314
diff changeset
964 msg, args = None, None
31522
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31482
diff changeset
965 if f2 in m2:
45317
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45314
diff changeset
966 args = (f2, f, f2, False, pa.node())
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45314
diff changeset
967 msg = b'remote copied from %s' % f2
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
968 else:
45317
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45314
diff changeset
969 args = (f2, f, f2, True, pa.node())
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45314
diff changeset
970 msg = b'remote moved from %s' % f2
cb0cd87e16b4 merge: unify logic of couple of if-else's in manifestmerge()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45314
diff changeset
971 mresult.addfile(f, mergestatemod.ACTION_MERGE, args, msg)
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
972 elif f not in ma:
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
973 # local unknown, remote created: the logic is described by the
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
974 # following table:
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
975 #
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
976 # force branchmerge different | action
23651
72da02d7f126 merge: collect checking for unknown files at end of manifestmerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23650
diff changeset
977 # n * * | create
23650
b85c548ab14d merge: introduce 'c' action like 'g', but with additional safety
Martin von Zweigbergk <martinvonz@google.com>
parents: 23649
diff changeset
978 # y n * | create
b85c548ab14d merge: introduce 'c' action like 'g', but with additional safety
Martin von Zweigbergk <martinvonz@google.com>
parents: 23649
diff changeset
979 # y y n | create
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
980 # y y y | merge
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
981 #
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
982 # Checking whether the files are different is expensive, so we
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
983 # don't do that when we can avoid it.
23649
18ab5e5955df merge: structure 'remote created' code to match table
Martin von Zweigbergk <martinvonz@google.com>
parents: 23641
diff changeset
984 if not force:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
985 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
986 f,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
987 mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
988 (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
989 b'remote created',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
990 )
23649
18ab5e5955df merge: structure 'remote created' code to match table
Martin von Zweigbergk <martinvonz@google.com>
parents: 23641
diff changeset
991 elif not branchmerge:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
992 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
993 f,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
994 mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
995 (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
996 b'remote created',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
997 )
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
998 else:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
999 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
1000 f,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1001 mergestatemod.ACTION_CREATED_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1002 (fl2, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1003 b'remote created, get or merge',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1004 )
23473
922b10c870c5 merge: branch code into {n1 and n2, n1, n2} top-level cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 23448
diff changeset
1005 elif n2 != ma[f]:
30586
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30528
diff changeset
1006 df = None
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
1007 for d in branch_copies1.dirmove:
30586
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30528
diff changeset
1008 if f.startswith(d):
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30528
diff changeset
1009 # new file added in a directory that was moved
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
1010 df = branch_copies1.dirmove[d] + f[len(d) :]
30586
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30528
diff changeset
1011 break
31522
527a247f114f merge: remove unnecessary matcher checks
Durham Goode <durham@fb.com>
parents: 31482
diff changeset
1012 if df is not None and df in m1:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
1013 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
1014 df,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1015 mergestatemod.ACTION_MERGE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1016 (df, f, f, False, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1017 b'local directory rename - respect move '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1018 b'from %s' % f,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1019 )
30586
43a9e02a7b7f graft: support grafting changes to new file in renamed directory (issue5436)
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30528
diff changeset
1020 elif acceptremote:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
1021 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
1022 f,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1023 mergestatemod.ACTION_CREATED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1024 (fl2,),
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1025 b'remote recreating',
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1026 )
18606
95773237df7f manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents: 18605
diff changeset
1027 else:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
1028 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
1029 f,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1030 mergestatemod.ACTION_DELETED_CHANGED,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1031 (None, f, f, False, pa.node()),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1032 b'prompt deleted/changed',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1033 )
45479
09edbff6ae8d merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45478
diff changeset
1034 else:
09edbff6ae8d merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45478
diff changeset
1035 mresult.addfile(
09edbff6ae8d merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45478
diff changeset
1036 f,
09edbff6ae8d merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45478
diff changeset
1037 mergestatemod.ACTION_KEEP_ABSENT,
09edbff6ae8d merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45478
diff changeset
1038 None,
09edbff6ae8d merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45478
diff changeset
1039 b'local not present, remote unchanged',
09edbff6ae8d merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45478
diff changeset
1040 )
23651
72da02d7f126 merge: collect checking for unknown files at end of manifestmerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23650
diff changeset
1041
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1042 if repo.ui.configbool(b'experimental', b'merge.checkpathconflicts'):
34941
37450a122128 merge: add a config option to disable path conflict checking
Siddharth Agarwal <sid0@fb.com>
parents: 34919
diff changeset
1043 # If we are merging, look for path conflicts.
45305
31c454a5f1a8 merge: pass mergeresult in checkpassconflicts() instead of actions (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45304
diff changeset
1044 checkpathconflicts(repo, wctx, p2, mresult)
34555
989e884d1be9 merge: check for path conflicts when merging (issue5628)
Mark Thomas <mbthomas@fb.com>
parents: 34553
diff changeset
1045
38077
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
1046 narrowmatch = repo.narrowmatch()
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
1047 if not narrowmatch.always():
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
1048 # Updates "actions" in place
45306
e7196f1da2b1 merge: pass mergeresult obj instead of actions in _filternarrowactions()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45305
diff changeset
1049 _filternarrowactions(narrowmatch, branchmerge, mresult)
38077
8f37b5fc5abf narrow: filter merge actions in core
Martin von Zweigbergk <martinvonz@google.com>
parents: 38003
diff changeset
1050
44275
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
1051 renamedelete = branch_copies1.renamedelete
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
1052 renamedelete.update(branch_copies2.renamedelete)
fa9ad1da2e77 merge: start using the per-side copy dicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44274
diff changeset
1053
45404
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45403
diff changeset
1054 mresult.updatevalues(diverge, renamedelete)
45302
fe2040abb183 merge: make mergeresult constructor initialize empty object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
1055 return mresult
3105
7c7469d41ade merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents: 3104
diff changeset
1056
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1057
45307
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45306
diff changeset
1058 def _resolvetrivial(repo, wctx, mctx, ancestor, mresult):
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
1059 """Resolves false conflicts where the nodeid changed but the content
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
1060 remained the same."""
36349
759579bac31d merge: make a copy of dict.items() before mutating the dict during iteration
Augie Fackler <augie@google.com>
parents: 36215
diff changeset
1061 # We force a copy of actions.items() because we're going to mutate
759579bac31d merge: make a copy of dict.items() before mutating the dict during iteration
Augie Fackler <augie@google.com>
parents: 36215
diff changeset
1062 # actions as we resolve trivial conflicts.
45366
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
1063 for f in list(mresult.files((mergestatemod.ACTION_CHANGED_DELETED,))):
45314
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
1064 if f in ancestor and not wctx[f].cmp(ancestor[f]):
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
1065 # local did change but ended up with same content
45307
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45306
diff changeset
1066 mresult.addfile(
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45306
diff changeset
1067 f, mergestatemod.ACTION_REMOVE, None, b'prompt same'
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45306
diff changeset
1068 )
45314
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
1069
45366
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
1070 for f in list(mresult.files((mergestatemod.ACTION_DELETED_CHANGED,))):
45314
4e6a2889dd1d merge: use the new action based mapping introduced in mergeresult obj
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45313
diff changeset
1071 if f in ancestor and not mctx[f].cmp(ancestor[f]):
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
1072 # remote did change but ended up with same content
45307
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45306
diff changeset
1073 mresult.removefile(f) # don't get = keep local deleted
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1074
23531
416c133145ee merge: extract _resolvetrivial() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 23526
diff changeset
1075
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1076 def calculateupdates(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1077 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1078 wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1079 mctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1080 ancestors,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1081 branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1082 force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1083 acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1084 followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1085 matcher=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1086 mergeforce=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1087 ):
45168
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
1088 """
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
1089 Calculate the actions needed to merge mctx into wctx using ancestors
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
1090
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
1091 Uses manifestmerge() to merge manifest and get list of actions required to
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
1092 perform for merging two manifests. If there are multiple ancestors, uses bid
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
1093 merge if enabled.
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
1094
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
1095 Also filters out actions which are unrequired if repository is sparse.
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
1096
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
1097 Returns mergeresult object same as manifestmerge().
45168
4f71d1a99e45 merge: document return values of manifestmerge() and calculateupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45167
diff changeset
1098 """
33323
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
1099 # Avoid cycle.
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
1100 from . import sparse
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
1101
45302
fe2040abb183 merge: make mergeresult constructor initialize empty object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
1102 mresult = None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1103 if len(ancestors) == 1: # default
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
1104 mresult = manifestmerge(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1105 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1106 wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1107 mctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1108 ancestors[0],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1109 branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1110 force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1111 matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1112 acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1113 followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1114 )
45308
4ad6c4e9e35f merge: pass mergeresult instead of actions in _checkunknownfiles() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45307
diff changeset
1115 _checkunknownfiles(repo, wctx, mctx, force, mresult, mergeforce)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1116
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1117 else: # only when merge.preferancestor=* - the default
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1118 repo.ui.note(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1119 _(b"note: merging %s and %s using bids from ancestors %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1120 % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1121 wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1122 mctx,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1123 _(b' and ').join(pycompat.bytestr(anc) for anc in ancestors),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1124 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1125 )
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1126
45301
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
1127 # mapping filename to bids (action method to list af actions)
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
1128 # {FILENAME1 : BID1, FILENAME2 : BID2}
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
1129 # BID is another dictionary which contains
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
1130 # mapping of following form:
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
1131 # {ACTION_X : [info, ..], ACTION_Y : [info, ..]}
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
1132 fbids = {}
45481
6e474eec4be6 merge: update commitinfo from all mergeresults during bid merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45480
diff changeset
1133 mresult = mergeresult()
23526
a5887f2da5e6 merge: don't treat 'diverge' and 'renamedelete' like actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23525
diff changeset
1134 diverge, renamedelete = None, None
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1135 for ancestor in ancestors:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1136 repo.ui.note(_(b'\ncalculating bids for ancestor %s\n') % ancestor)
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
1137 mresult1 = manifestmerge(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1138 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1139 wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1140 mctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1141 ancestor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1142 branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1143 force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1144 matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1145 acceptremote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1146 followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1147 forcefulldiff=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1148 )
45308
4ad6c4e9e35f merge: pass mergeresult instead of actions in _checkunknownfiles() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45307
diff changeset
1149 _checkunknownfiles(repo, wctx, mctx, force, mresult1, mergeforce)
26318
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
1150
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
1151 # Track the shortest set of warning on the theory that bid
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
1152 # merge will correctly incorporate more information
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
1153 if diverge is None or len(mresult1.diverge) < len(diverge):
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
1154 diverge = mresult1.diverge
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
1155 if renamedelete is None or len(renamedelete) < len(
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
1156 mresult1.renamedelete
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
1157 ):
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
1158 renamedelete = mresult1.renamedelete
26318
d3bd6cefd742 bidmerge: choose shortest list of diverge and rename/delete warnings
Matt Mackall <mpm@selenic.com>
parents: 26304
diff changeset
1159
45481
6e474eec4be6 merge: update commitinfo from all mergeresults during bid merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45480
diff changeset
1160 # blindly update final mergeresult commitinfo with what we get
6e474eec4be6 merge: update commitinfo from all mergeresults during bid merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45480
diff changeset
1161 # from mergeresult object for each ancestor
6e474eec4be6 merge: update commitinfo from all mergeresults during bid merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45480
diff changeset
1162 # TODO: some commitinfo depends on what bid merge choose and hence
6e474eec4be6 merge: update commitinfo from all mergeresults during bid merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45480
diff changeset
1163 # we will need to make commitinfo also depend on bid merge logic
6e474eec4be6 merge: update commitinfo from all mergeresults during bid merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45480
diff changeset
1164 mresult._commitinfo.update(mresult1._commitinfo)
6e474eec4be6 merge: update commitinfo from all mergeresults during bid merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45480
diff changeset
1165
45367
3c783ff08d40 mergeresult: introduce filemap() which yields filename based mapping
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45366
diff changeset
1166 for f, a in mresult1.filemap(sort=True):
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
1167 m, args, msg = a
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1168 repo.ui.debug(b' %s: %s -> %s\n' % (f, msg, m))
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
1169 if f in fbids:
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
1170 d = fbids[f]
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
1171 if m in d:
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
1172 d[m].append(a)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1173 else:
23638
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
1174 d[m] = [a]
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
1175 else:
09be050ca98c merge: let bid merge work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23637
diff changeset
1176 fbids[f] = {m: [a]}
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1177
45301
98218c83242f merge: improve documentation of fbid dict used for merge bid
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
1178 # Call for bids
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1179 # Pick the best bid for each file
45458
e7c8a5030a90 merge: show number of ancestors in bid merge debug notes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45405
diff changeset
1180 repo.ui.note(
e7c8a5030a90 merge: show number of ancestors in bid merge debug notes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45405
diff changeset
1181 _(b'\nauction for merging merge bids (%d ancestors)\n')
e7c8a5030a90 merge: show number of ancestors in bid merge debug notes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45405
diff changeset
1182 % len(ancestors)
e7c8a5030a90 merge: show number of ancestors in bid merge debug notes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45405
diff changeset
1183 )
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1184 for f, bids in sorted(fbids.items()):
45470
ccd3bf4490c1 merge: show list of bids for each file in bid-merge in ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45458
diff changeset
1185 if repo.ui.debugflag:
ccd3bf4490c1 merge: show list of bids for each file in bid-merge in ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45458
diff changeset
1186 repo.ui.debug(b" list of bids for %s:\n" % f)
ccd3bf4490c1 merge: show list of bids for each file in bid-merge in ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45458
diff changeset
1187 for m, l in sorted(bids.items()):
ccd3bf4490c1 merge: show list of bids for each file in bid-merge in ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45458
diff changeset
1188 for _f, args, msg in l:
ccd3bf4490c1 merge: show list of bids for each file in bid-merge in ui.debug()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45458
diff changeset
1189 repo.ui.debug(b' %s -> %s\n' % (msg, m))
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1190 # bids is a mapping from action method to list af actions
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1191 # Consensus?
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1192 if len(bids) == 1: # all bids are the same kind of method
34355
1a5abc45e2fa py3: explicitly convert dict.keys() and dict.items() into a list
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34309
diff changeset
1193 m, l = list(bids.items())[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1194 if all(a == l[0] for a in l[1:]): # len(bids) is > 1
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1195 repo.ui.note(_(b" %s: consensus for %s\n") % (f, m))
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
1196 mresult.addfile(f, *l[0])
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1197 continue
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1198 # If keep is an option, just do it.
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1199 if mergestatemod.ACTION_KEEP in bids:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1200 repo.ui.note(_(b" %s: picking 'keep' action\n") % f)
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
1201 mresult.addfile(f, *bids[mergestatemod.ACTION_KEEP][0])
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1202 continue
45478
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45477
diff changeset
1203 # If keep absent is an option, just do that
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45477
diff changeset
1204 if mergestatemod.ACTION_KEEP_ABSENT in bids:
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45477
diff changeset
1205 repo.ui.note(_(b" %s: picking 'keep absent' action\n") % f)
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45477
diff changeset
1206 mresult.addfile(f, *bids[mergestatemod.ACTION_KEEP_ABSENT][0])
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45477
diff changeset
1207 continue
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1208 # If there are gets and they all agree [how could they not?], do it.
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1209 if mergestatemod.ACTION_GET in bids:
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1210 ga0 = bids[mergestatemod.ACTION_GET][0]
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1211 if all(a == ga0 for a in bids[mergestatemod.ACTION_GET][1:]):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1212 repo.ui.note(_(b" %s: picking 'get' action\n") % f)
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
1213 mresult.addfile(f, *ga0)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1214 continue
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1215 # TODO: Consider other simple actions such as mode changes
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1216 # Handle inefficient democrazy.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1217 repo.ui.note(_(b' %s: multiple bids for merge action:\n') % f)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1218 for m, l in sorted(bids.items()):
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1219 for _f, args, msg in l:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1220 repo.ui.note(b' %s -> %s\n' % (msg, m))
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1221 # Pick random action. TODO: Instead, prompt user when resolving
34355
1a5abc45e2fa py3: explicitly convert dict.keys() and dict.items() into a list
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34309
diff changeset
1222 m, l = list(bids.items())[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1223 repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1224 _(b' %s: ambiguous merge - picked %s action\n') % (f, m)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1225 )
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
1226 mresult.addfile(f, *l[0])
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1227 continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1228 repo.ui.note(_(b'end of auction\n\n'))
45404
72e503a24715 merge: introduce `addcommitinfo()` on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45403
diff changeset
1229 mresult.updatevalues(diverge, renamedelete)
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1230
23640
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
1231 if wctx.rev() is None:
45368
1aef38d973e8 merge: pass mergeresult obj in _forgetremoved() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45367
diff changeset
1232 _forgetremoved(wctx, mctx, branchmerge, mresult)
23640
b46b9865dd08 merge: let _forgetremoved() work on the file->action dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 23639
diff changeset
1233
45311
d70c972cec74 sparse: pass mergeresult obj in sparse.filterupdatesactions() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45310
diff changeset
1234 sparse.filterupdatesactions(repo, wctx, mctx, branchmerge, mresult)
45307
00e9c5edcd58 merge: pass mergeresult obj instead of actions dict in _resolvetrivial()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45306
diff changeset
1235 _resolvetrivial(repo, wctx, mctx, ancestors[0], mresult)
33323
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
1236
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
1237 return mresult
23385
91c24457c16a merge: move calculateupdates() before applyupdated()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23384
diff changeset
1238
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1239
34157
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
1240 def _getcwd():
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
1241 try:
39823
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39481
diff changeset
1242 return encoding.getcwd()
34157
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
1243 except OSError as err:
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
1244 if err.errno == errno.ENOENT:
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
1245 return None
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
1246 raise
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
1247
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1248
33093
6582dc01aca3 merge: pass wctx to batchremove and batchget
Phil Cohen <phillco@fb.com>
parents: 32881
diff changeset
1249 def batchremove(repo, wctx, actions):
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1250 """apply removes to the working directory
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
1251
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
1252 yields tuples for progress updates
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
1253 """
18640
a8648f32b8ed merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents: 18639
diff changeset
1254 verbose = repo.ui.verbose
34157
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
1255 cwd = _getcwd()
18633
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
1256 i = 0
21545
43eecb4e23f8 merge: use separate lists for each action type
Mads Kiilerich <madski@unity3d.com>
parents: 21524
diff changeset
1257 for f, args, msg in actions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1258 repo.ui.debug(b" %s: %s -> r\n" % (f, msg))
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1259 if verbose:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1260 repo.ui.note(_(b"removing %s\n") % f)
33098
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33097
diff changeset
1261 wctx[f].audit()
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1262 try:
33094
f9e50ee4c52b merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com>
parents: 33093
diff changeset
1263 wctx[f].remove(ignoremissing=True)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25151
diff changeset
1264 except OSError as inst:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1265 repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1266 _(b"update failed to remove %s: %s!\n") % (f, inst.strerror)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1267 )
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1268 if i == 100:
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1269 yield i, f
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1270 i = 0
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1271 i += 1
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1272 if i > 0:
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1273 yield i, f
34157
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
1274
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
1275 if cwd and not _getcwd():
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
1276 # cwd was removed in the course of removing files; print a helpful
24bf823377fc merge: move cwd-missing detection to helper functions
Phil Cohen <phillco@fb.com>
parents: 34140
diff changeset
1277 # warning.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1278 repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1279 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1280 b"current directory was removed\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1281 b"(consider changing to repo root: %s)\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1282 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1283 % repo.root
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1284 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1285
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1286
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1287 def batchget(repo, mctx, wctx, wantfiledata, actions):
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1288 """apply gets to the working directory
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1289
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1290 mctx is the context to get from
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1291
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1292 Yields arbitrarily many (False, tuple) for progress updates, followed by
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1293 exactly one (True, filedata). When wantfiledata is false, filedata is an
42529
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42472
diff changeset
1294 empty dict. When wantfiledata is true, filedata[f] is a triple (mode, size,
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42472
diff changeset
1295 mtime) of the file f written for each action.
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1296 """
42529
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42472
diff changeset
1297 filedata = {}
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1298 verbose = repo.ui.verbose
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1299 fctx = mctx.filectx
27656
57c0d4888ca8 batchget: add support for backing up files
Siddharth Agarwal <sid0@fb.com>
parents: 27655
diff changeset
1300 ui = repo.ui
21392
b1ce47dadbdf merge: separate worker functions for batch remove and batch get
Mads Kiilerich <madski@unity3d.com>
parents: 21391
diff changeset
1301 i = 0
28200
588695ccbb22 merge: perform background file closing in batchget
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28199
diff changeset
1302 with repo.wvfs.backgroundclosing(ui, expectedcount=len(actions)):
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
1303 for f, (flags, backup), msg in actions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1304 repo.ui.debug(b" %s: %s -> g\n" % (f, msg))
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
1305 if verbose:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1306 repo.ui.note(_(b"getting %s\n") % f)
27656
57c0d4888ca8 batchget: add support for backing up files
Siddharth Agarwal <sid0@fb.com>
parents: 27655
diff changeset
1307
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
1308 if backup:
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
1309 # If a file or directory exists with the same name, back that
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
1310 # up. Otherwise, look to see if there is a file that conflicts
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
1311 # with a directory this file is in, and if so, back that up.
41584
1f2714052d7e merge: don't unnecessarily calculate absolute path
Martin von Zweigbergk <martinvonz@google.com>
parents: 41583
diff changeset
1312 conflicting = f
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
1313 if not repo.wvfs.lexists(f):
43677
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43421
diff changeset
1314 for p in pathutil.finddirs(f):
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
1315 if repo.wvfs.isfileorlink(p):
41584
1f2714052d7e merge: don't unnecessarily calculate absolute path
Martin von Zweigbergk <martinvonz@google.com>
parents: 41583
diff changeset
1316 conflicting = p
34549
a991e1d6bc82 merge: backup conflicting directories when getting files
Mark Thomas <mbthomas@fb.com>
parents: 34548
diff changeset
1317 break
41584
1f2714052d7e merge: don't unnecessarily calculate absolute path
Martin von Zweigbergk <martinvonz@google.com>
parents: 41583
diff changeset
1318 if repo.wvfs.lexists(conflicting):
41614
ac8cf125d8d5 merge: migrate to scmutil.backuppath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41584
diff changeset
1319 orig = scmutil.backuppath(ui, repo, conflicting)
ac8cf125d8d5 merge: migrate to scmutil.backuppath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41584
diff changeset
1320 util.rename(repo.wjoin(conflicting), orig)
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1321 wfctx = wctx[f]
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1322 wfctx.clearunknown()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1323 atomictemp = ui.configbool(b"experimental", b"update.atomic-file")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1324 size = wfctx.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1325 fctx(f).data(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1326 flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1327 backgroundclose=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1328 atomictemp=atomictemp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1329 )
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1330 if wantfiledata:
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1331 s = wfctx.lstat()
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1332 mode = s.st_mode
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1333 mtime = s[stat.ST_MTIME]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1334 filedata[f] = (mode, size, mtime) # for dirstate.normal
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
1335 if i == 100:
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1336 yield False, (i, f)
28199
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
1337 i = 0
d49793aac1ac merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28088
diff changeset
1338 i += 1
18633
6390dd22b12f merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents: 18632
diff changeset
1339 if i > 0:
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1340 yield False, (i, f)
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1341 yield True, filedata
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
1342
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1343
45356
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45355
diff changeset
1344 def _prefetchfiles(repo, ctx, mresult):
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37174
diff changeset
1345 """Invoke ``scmutil.prefetchfiles()`` for the files relevant to the dict
36180
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36080
diff changeset
1346 of merge actions. ``ctx`` is the context being merged in."""
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36080
diff changeset
1347
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36080
diff changeset
1348 # Skipping 'a', 'am', 'f', 'r', 'dm', 'e', 'k', 'p' and 'pr', because they
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36080
diff changeset
1349 # don't touch the context to be merged in. 'cd' is skipped, because
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36080
diff changeset
1350 # changed/deleted never resolves to something from the remote side.
45366
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
1351 files = mresult.files(
45356
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45355
diff changeset
1352 [
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1353 mergestatemod.ACTION_GET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1354 mergestatemod.ACTION_DELETED_CHANGED,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1355 mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1356 mergestatemod.ACTION_MERGE,
45356
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45355
diff changeset
1357 ]
45366
e5b4061f32be mergeresult: add `files()` and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45365
diff changeset
1358 )
45356
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45355
diff changeset
1359
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37174
diff changeset
1360 prefetch = scmutil.prefetchfiles
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37174
diff changeset
1361 matchfiles = scmutil.matchfiles
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1362 prefetch(
45356
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45355
diff changeset
1363 repo, [(ctx.rev(), matchfiles(repo, files),)],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1364 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1365
34139
b90e5b2a9c82 merge: flush any deferred writes before, and after, running any workers
Phil Cohen <phillco@fb.com>
parents: 34137
diff changeset
1366
37110
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
1367 @attr.s(frozen=True)
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
1368 class updateresult(object):
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
1369 updatedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
1370 mergedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
1371 removedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
1372 unresolvedcount = attr.ib()
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
1373
37128
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37115
diff changeset
1374 def isempty(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1375 return not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1376 self.updatedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1377 or self.mergedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1378 or self.removedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1379 or self.unresolvedcount
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1380 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1381
37128
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37115
diff changeset
1382
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1383 def applyupdates(
45370
442823f66889 merge: drop commitinfo argument to applyupdates (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45369
diff changeset
1384 repo, mresult, wctx, mctx, overwrite, wantfiledata, labels=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1385 ):
11454
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
1386 """apply the merge action list to the working directory
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
1387
45355
b9b055f15035 merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45354
diff changeset
1388 mresult is a mergeresult object representing result of the merge
11454
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
1389 wctx is the working copy context
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
1390 mctx is the context to be merged into the working copy
13162
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13158
diff changeset
1391
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1392 Return a tuple of (counts, filedata), where counts is a tuple
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1393 (updated, merged, removed, unresolved) that describes how many
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1394 files were affected by the update, and filedata is as described in
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1395 batchget.
11454
9b0406b23be0 merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11451
diff changeset
1396 """
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
1397
45356
2c96fd8e05f6 merge: pass mergeresult obj in merge._prefetchfiles()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45355
diff changeset
1398 _prefetchfiles(repo, mctx, mresult)
36180
60dd840a7fdb merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents: 36080
diff changeset
1399
27078
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
1400 updated, merged, removed = 0, 0, 0
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1401 ms = mergestatemod.mergestate.clean(
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1402 repo, wctx.p1().node(), mctx.node(), labels
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1403 )
44688
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
1404
45370
442823f66889 merge: drop commitinfo argument to applyupdates (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45369
diff changeset
1405 for f, op in pycompat.iteritems(mresult.commitinfo):
45297
cb6a72dc0511 merge: pass commitinfo to applyupdates() and get it stored in mergestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
1406 # the other side of filenode was choosen while merging, store this in
cb6a72dc0511 merge: pass commitinfo to applyupdates() and get it stored in mergestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
1407 # mergestate so that it can be reused on commit
45405
05d19ca33b33 mergestate: replace `addmergedother()` with generic `addcommitinfo()` (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45404
diff changeset
1408 ms.addcommitinfo(f, op)
45297
cb6a72dc0511 merge: pass commitinfo to applyupdates() and get it stored in mergestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45296
diff changeset
1409
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
1410 moves = []
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
1411
27137
25e4b2f000c5 merge: move almost all change/delete conflicts to resolve phase (BC) (API)
Siddharth Agarwal <sid0@fb.com>
parents: 27132
diff changeset
1412 # 'cd' and 'dc' actions are treated like other merge conflicts
45361
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
1413 mergeactions = list(
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
1414 mresult.getactions(
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
1415 [
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
1416 mergestatemod.ACTION_CHANGED_DELETED,
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
1417 mergestatemod.ACTION_DELETED_CHANGED,
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
1418 mergestatemod.ACTION_MERGE,
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
1419 ],
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
1420 sort=True,
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
1421 )
45358
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1422 )
27137
25e4b2f000c5 merge: move almost all change/delete conflicts to resolve phase (BC) (API)
Siddharth Agarwal <sid0@fb.com>
parents: 27132
diff changeset
1423 for f, args, msg in mergeactions:
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1424 f1, f2, fa, move, anc = args
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1425 if f == b'.hgsubstate': # merged internally
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1426 continue
27091
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
1427 if f1 is None:
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
1428 fcl = filemerge.absentfilectx(wctx, fa)
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
1429 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1430 repo.ui.debug(b" preserving %s for resolve of %s\n" % (f1, f))
27091
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
1431 fcl = wctx[f1]
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
1432 if f2 is None:
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
1433 fco = filemerge.absentfilectx(mctx, fa)
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
1434 else:
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
1435 fco = mctx[f2]
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1436 actx = repo[anc]
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1437 if fa in actx:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1438 fca = actx[fa]
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1439 else:
27091
2ce00de5cc0e merge.applyupdates: create absentfilectxes for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27090
diff changeset
1440 # TODO: move to absentfilectx
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1441 fca = repo.filectx(f1, fileid=nullrev)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1442 ms.add(fcl, fco, fca, f)
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1443 if f1 != f and move:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1444 moves.append(f1)
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
1445
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
1446 # remove renamed files after safely stored
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
1447 for f in moves:
33283
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33152
diff changeset
1448 if wctx[f].lexists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1449 repo.ui.debug(b"removing %s\n" % f)
33098
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33097
diff changeset
1450 wctx[f].audit()
33094
f9e50ee4c52b merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com>
parents: 33093
diff changeset
1451 wctx[f].remove()
5042
f191bc3916f7 merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents: 4997
diff changeset
1452
45477
14b3dbfa4eeb mergeresult: introduce dedicated tuple for no-op actions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45473
diff changeset
1453 numupdates = mresult.len() - mresult.len(mergeresult.NO_OP_ACTIONS)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1454 progress = repo.ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1455 _(b'updating'), unit=_(b'files'), total=numupdates
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1456 )
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
1457
45358
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1458 if b'.hgsubstate' in mresult._actionmapping[mergestatemod.ACTION_REMOVE]:
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
1459 subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels)
18632
3e20079117c5 merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents: 18630
diff changeset
1460
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
1461 # record path conflicts
45358
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1462 for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1463 [mergestatemod.ACTION_PATH_CONFLICT], sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1464 ):
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
1465 f1, fo = args
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
1466 s = repo.ui.status
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1467 s(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1468 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1469 b"%s: path conflict - a file or link has the same name as a "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1470 b"directory\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1471 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1472 % f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1473 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1474 if fo == b'l':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1475 s(_(b"the local file has been renamed to %s\n") % f1)
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
1476 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1477 s(_(b"the remote file has been renamed to %s\n") % f1)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1478 s(_(b"resolve manually then use 'hg resolve --mark %s'\n") % f)
45159
e05a488cbed0 mergestate: rename addpath() -> addpathonflict() to prevent confusion
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45118
diff changeset
1479 ms.addpathconflict(f, f1, fo)
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
1480 progress.increment(item=f)
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 34545
diff changeset
1481
34786
9c899660700a merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents: 34680
diff changeset
1482 # When merging in-memory, we can't support worker processes, so set the
9c899660700a merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents: 34680
diff changeset
1483 # per-item cost at 0 in that case.
9c899660700a merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents: 34680
diff changeset
1484 cost = 0 if wctx.isinmemory() else 0.001
9c899660700a merge: don't use workers in in-memory mode
Phil Cohen <phillco@fb.com>
parents: 34680
diff changeset
1485
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
1486 # remove in parallel (must come before resolving path conflicts and getting)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1487 prog = worker.worker(
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1488 repo.ui,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1489 cost,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1490 batchremove,
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1491 (repo, wctx),
45361
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
1492 list(mresult.getactions([mergestatemod.ACTION_REMOVE], sort=True)),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1493 )
19095
5cc71484ee9c merge: increase safety of parallel updating/removing on icasefs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18985
diff changeset
1494 for i, item in prog:
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
1495 progress.increment(step=i, item=item)
45359
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45358
diff changeset
1496 removed = mresult.len((mergestatemod.ACTION_REMOVE,))
21390
26b84128c54d merge: move constant assignments a bit and use them more
Mads Kiilerich <madski@unity3d.com>
parents: 21389
diff changeset
1497
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
1498 # resolve path conflicts (must come before getting)
45358
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1499 for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1500 [mergestatemod.ACTION_PATH_CONFLICT_RESOLVE], sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1501 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1502 repo.ui.debug(b" %s: %s -> pr\n" % (f, msg))
44980
818b4f19ef23 merge: move an inspection of the dirstate from record to calculate phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44915
diff changeset
1503 (f0, origf0) = args
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
1504 if wctx[f0].lexists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1505 repo.ui.note(_(b"moving %s to %s\n") % (f0, f))
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
1506 wctx[f].audit()
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
1507 wctx[f].write(wctx.filectx(f0).data(), wctx.filectx(f0).flags())
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
1508 wctx[f0].remove()
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
1509 progress.increment(item=f)
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
1510
38732
be4984261611 merge: mark file gets as not thread safe (issue5933)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38498
diff changeset
1511 # get in parallel.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1512 threadsafe = repo.ui.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1513 b'experimental', b'worker.wdir-get-thread-safe'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1514 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1515 prog = worker.worker(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1516 repo.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1517 cost,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1518 batchget,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1519 (repo, mctx, wctx, wantfiledata),
45361
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
1520 list(mresult.getactions([mergestatemod.ACTION_GET], sort=True)),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1521 threadsafe=threadsafe,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1522 hasretval=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1523 )
42529
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42472
diff changeset
1524 getfiledata = {}
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1525 for final, res in prog:
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1526 if final:
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1527 getfiledata = res
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1528 else:
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1529 i, item = res
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1530 progress.increment(step=i, item=item)
18630
9b9e2d9e83a1 merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents: 18612
diff changeset
1531
45358
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1532 if b'.hgsubstate' in mresult._actionmapping[mergestatemod.ACTION_GET]:
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
1533 subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels)
18632
3e20079117c5 merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents: 18630
diff changeset
1534
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1535 # forget (manifest only, just log it) (must come first)
45358
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1536 for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1537 (mergestatemod.ACTION_FORGET,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1538 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1539 repo.ui.debug(b" %s: %s -> f\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
1540 progress.increment(item=f)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
1541
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1542 # re-add (manifest only, just log it)
45358
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1543 for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1544 (mergestatemod.ACTION_ADD,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1545 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1546 repo.ui.debug(b" %s: %s -> a\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
1547 progress.increment(item=f)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
1548
27131
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
1549 # re-add/mark as modified (manifest only, just log it)
45358
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1550 for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1551 (mergestatemod.ACTION_ADD_MODIFIED,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1552 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1553 repo.ui.debug(b" %s: %s -> am\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
1554 progress.increment(item=f)
27131
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
1555
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1556 # keep (noop, just log it)
45358
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1557 for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1558 (mergestatemod.ACTION_KEEP,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1559 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1560 repo.ui.debug(b" %s: %s -> k\n" % (f, msg))
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1561 # no progress
45478
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45477
diff changeset
1562 for f, args, msg in mresult.getactions(
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45477
diff changeset
1563 (mergestatemod.ACTION_KEEP_ABSENT,), sort=True
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45477
diff changeset
1564 ):
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45477
diff changeset
1565 repo.ui.debug(b" %s: %s -> ka\n" % (f, msg))
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45477
diff changeset
1566 # no progress
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
1567
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1568 # directory rename, move local
45358
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1569 for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1570 (mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1571 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1572 repo.ui.debug(b" %s: %s -> dm\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
1573 progress.increment(item=f)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1574 f0, flags = args
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1575 repo.ui.note(_(b"moving %s to %s\n") % (f0, f))
33098
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33097
diff changeset
1576 wctx[f].audit()
33095
05c680ebf512 merge: convert repo.wwrite() calls to wctx[f].write()
Phil Cohen <phillco@fb.com>
parents: 33094
diff changeset
1577 wctx[f].write(wctx.filectx(f0).data(), flags)
33094
f9e50ee4c52b merge: replace repo.wvfs.unlinkpath() with calls to wctx[f].remove()
Phil Cohen <phillco@fb.com>
parents: 33093
diff changeset
1578 wctx[f0].remove()
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
1579
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1580 # local directory rename, get
45358
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1581 for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1582 (mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1583 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1584 repo.ui.debug(b" %s: %s -> dg\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
1585 progress.increment(item=f)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1586 f0, flags = args
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1587 repo.ui.note(_(b"getting %s to %s\n") % (f0, f))
33095
05c680ebf512 merge: convert repo.wwrite() calls to wctx[f].write()
Phil Cohen <phillco@fb.com>
parents: 33094
diff changeset
1588 wctx[f].write(mctx.filectx(f0).data(), flags)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
1589
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
1590 # exec
45358
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1591 for f, args, msg in mresult.getactions(
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1592 (mergestatemod.ACTION_EXEC,), sort=True
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1593 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1594 repo.ui.debug(b" %s: %s -> e\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
1595 progress.increment(item=f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1596 (flags,) = args
33098
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33097
diff changeset
1597 wctx[f].audit()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1598 wctx[f].setflags(b'l' in flags, b'x' in flags)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
1599
45362
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45361
diff changeset
1600 # these actions updates the file
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45361
diff changeset
1601 updated = mresult.len(
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45361
diff changeset
1602 (
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45361
diff changeset
1603 mergestatemod.ACTION_GET,
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45361
diff changeset
1604 mergestatemod.ACTION_EXEC,
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45361
diff changeset
1605 mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45361
diff changeset
1606 mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL,
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45361
diff changeset
1607 )
e335936cd4e1 applyupdates: simplfy calculation of number of updated files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45361
diff changeset
1608 )
26786
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1609 # the ordering is important here -- ms.mergedriver will raise if the merge
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1610 # driver has changed, and we want to be able to bypass it when overwrite is
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1611 # True
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1612 usemergedriver = not overwrite and mergeactions and ms.mergedriver
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1613
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1614 if usemergedriver:
35504
87918218da70 merge: raise before running mergedriver if using IMM
Phil Cohen <phillco@fb.com>
parents: 35297
diff changeset
1615 if wctx.isinmemory():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1616 raise error.InMemoryMergeConflictsError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
1617 b"in-memory merge does not support mergedriver"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1618 )
26786
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1619 ms.commit()
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1620 proceed = driverpreprocess(repo, ms, wctx, labels=labels)
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1621 # the driver might leave some files unresolved
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1622 unresolvedf = set(ms.unresolved())
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1623 if not proceed:
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1624 # XXX setting unresolved to at least 1 is a hack to make sure we
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1625 # error out
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1626 return updateresult(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1627 updated, merged, removed, max(len(unresolvedf), 1)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1628 )
26786
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1629 newactions = []
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1630 for f, args, msg in mergeactions:
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1631 if f in unresolvedf:
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1632 newactions.append((f, args, msg))
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1633 mergeactions = newactions
121f80d14e4b merge.applyupdates: call driverpreprocess before starting merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26785
diff changeset
1634
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
1635 try:
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
1636 # premerge
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
1637 tocomplete = []
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
1638 for f, args, msg in mergeactions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1639 repo.ui.debug(b" %s: %s -> m (premerge)\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
1640 progress.increment(item=f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1641 if f == b'.hgsubstate': # subrepo states need updating
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1642 subrepoutil.submerge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1643 repo, wctx, mctx, wctx.ancestor(mctx), overwrite, labels
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1644 )
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
1645 continue
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
1646 wctx[f].audit()
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
1647 complete, r = ms.preresolve(f, wctx)
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
1648 if not complete:
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
1649 numupdates += 1
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
1650 tocomplete.append((f, args, msg))
26618
8e6d5b7317e6 merge.mergestate: perform all premerges before any merges (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 26617
diff changeset
1651
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
1652 # merge
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
1653 for f, args, msg in tocomplete:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1654 repo.ui.debug(b" %s: %s -> m (merge)\n" % (f, msg))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38078
diff changeset
1655 progress.increment(item=f, total=numupdates)
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
1656 ms.resolve(f, wctx)
26292
007ac1acfcac merge: move merge step to the end
Siddharth Agarwal <sid0@fb.com>
parents: 25959
diff changeset
1657
34680
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
1658 finally:
c0a524f77e8a merge: ensure that we always commit the mergestate
Ryan McElroy <rmcelroy@fb.com>
parents: 34560
diff changeset
1659 ms.commit()
26787
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
1660
27078
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
1661 unresolved = ms.unresolvedcount()
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
1662
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1663 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1664 usemergedriver
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1665 and not unresolved
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1666 and ms.mdstate() != mergestatemod.MERGE_DRIVER_STATE_SUCCESS
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1667 ):
26787
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
1668 if not driverconclude(repo, ms, wctx, labels=labels):
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
1669 # XXX setting unresolved to at least 1 is a hack to make sure we
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
1670 # error out
26975
6618dfd3ea1c merge.applyupdates: don't return early if merge driver's conclude failed
Siddharth Agarwal <sid0@fb.com>
parents: 26962
diff changeset
1671 unresolved = max(unresolved, 1)
26787
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
1672
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
1673 ms.commit()
64848559413a merge.applyupdates: call driverconclude after performing merge actions
Siddharth Agarwal <sid0@fb.com>
parents: 26786
diff changeset
1674
27078
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
1675 msupdated, msmerged, msremoved = ms.counts()
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
1676 updated += msupdated
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
1677 merged += msmerged
a421debae31d merge.applyupdates: use counters from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27077
diff changeset
1678 removed += msremoved
27080
ae2d3782d818 merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27079
diff changeset
1679
ae2d3782d818 merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27079
diff changeset
1680 extraactions = ms.actions()
29842
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
1681 if extraactions:
45358
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1682 mfiles = {
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1683 a[0] for a in mresult.getactions((mergestatemod.ACTION_MERGE,))
5ce63ee1fe3d merge: replace use of actions dict with mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45357
diff changeset
1684 }
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
1685 for k, acts in pycompat.iteritems(extraactions):
45355
b9b055f15035 merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45354
diff changeset
1686 for a in acts:
b9b055f15035 merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45354
diff changeset
1687 mresult.addfile(a[0], k, *a[1:])
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1688 if k == mergestatemod.ACTION_GET and wantfiledata:
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1689 # no filedata until mergestate is updated to provide it
42529
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42472
diff changeset
1690 for a in acts:
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42472
diff changeset
1691 getfiledata[a[0]] = None
37115
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
1692 # Remove these files from actions[ACTION_MERGE] as well. This is
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
1693 # important because in recordupdates, files in actions[ACTION_MERGE]
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
1694 # are processed after files in other actions, and the merge driver
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
1695 # might add files to those actions via extraactions above. This can
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
1696 # lead to a file being recorded twice, with poor results. This is
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
1697 # especially problematic for actions[ACTION_REMOVE] (currently only
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
1698 # possible with the merge driver in the initial merge process;
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37114
diff changeset
1699 # interrupted merges don't go through this flow).
29842
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
1700 #
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
1701 # The real fix here is to have indexes by both file and action so
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
1702 # that when the action for a file is changed it is automatically
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
1703 # reflected in the other action lists. But that involves a more
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
1704 # complex data structure, so this will do for now.
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
1705 #
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
1706 # We don't need to do the same operation for 'dc' and 'cd' because
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
1707 # those lists aren't consulted again.
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
1708 mfiles.difference_update(a[0] for a in acts)
1316c7cccc76 merge: remove files with extra actions from merge action list
Siddharth Agarwal <sid0@fb.com>
parents: 29786
diff changeset
1709
45361
cdc50e1929b0 mergeresult: yield from getactions() instead of buidling a list and returning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45359
diff changeset
1710 for a in list(mresult.getactions((mergestatemod.ACTION_MERGE,))):
45355
b9b055f15035 merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45354
diff changeset
1711 if a[0] not in mfiles:
b9b055f15035 merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45354
diff changeset
1712 mresult.removefile(a[0])
27080
ae2d3782d818 merge.applyupdates: extend action queues with ones returned from mergestate
Siddharth Agarwal <sid0@fb.com>
parents: 27079
diff changeset
1713
38379
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38351
diff changeset
1714 progress.complete()
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1715 assert len(getfiledata) == (
45359
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45358
diff changeset
1716 mresult.len((mergestatemod.ACTION_GET,)) if wantfiledata else 0
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1717 )
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
1718 return updateresult(updated, merged, removed, unresolved), getfiledata
3111
5cc62d99b785 merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents: 3110
diff changeset
1719
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1720
45167
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1721 def _advertisefsmonitor(repo, num_gets, p1node):
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1722 # Advertise fsmonitor when its presence could be useful.
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1723 #
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1724 # We only advertise when performing an update from an empty working
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1725 # directory. This typically only occurs during initial clone.
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1726 #
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1727 # We give users a mechanism to disable the warning in case it is
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1728 # annoying.
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1729 #
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1730 # We only allow on Linux and MacOS because that's where fsmonitor is
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1731 # considered stable.
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1732 fsmonitorwarning = repo.ui.configbool(b'fsmonitor', b'warn_when_unused')
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1733 fsmonitorthreshold = repo.ui.configint(
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1734 b'fsmonitor', b'warn_update_file_count'
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1735 )
45473
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45470
diff changeset
1736 # avoid cycle dirstate -> sparse -> merge -> dirstate
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45470
diff changeset
1737 from . import dirstate
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45470
diff changeset
1738
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45470
diff changeset
1739 if dirstate.rustmod is not None:
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45470
diff changeset
1740 # When using rust status, fsmonitor becomes necessary at higher sizes
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45470
diff changeset
1741 fsmonitorthreshold = repo.ui.configint(
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45470
diff changeset
1742 b'fsmonitor', b'warn_update_file_count_rust',
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45470
diff changeset
1743 )
c1d6e930ac8a fsmonitor: increase the threshold before we recommend it, when using rust
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 45470
diff changeset
1744
45167
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1745 try:
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1746 # avoid cycle: extensions -> cmdutil -> merge
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1747 from . import extensions
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1748
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1749 extensions.find(b'fsmonitor')
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1750 fsmonitorenabled = repo.ui.config(b'fsmonitor', b'mode') != b'off'
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1751 # We intentionally don't look at whether fsmonitor has disabled
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1752 # itself because a) fsmonitor may have already printed a warning
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1753 # b) we only care about the config state here.
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1754 except KeyError:
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1755 fsmonitorenabled = False
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1756
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1757 if (
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1758 fsmonitorwarning
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1759 and not fsmonitorenabled
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1760 and p1node == nullid
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1761 and num_gets >= fsmonitorthreshold
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1762 and pycompat.sysplatform.startswith((b'linux', b'darwin'))
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1763 ):
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1764 repo.ui.warn(
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1765 _(
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1766 b'(warning: large working directory being used without '
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1767 b'fsmonitor enabled; enable fsmonitor to improve performance; '
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1768 b'see "hg help -e fsmonitor")\n'
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1769 )
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1770 )
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1771
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
1772
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1773 UPDATECHECK_ABORT = b'abort' # handled at higher layers
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1774 UPDATECHECK_NONE = b'none'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1775 UPDATECHECK_LINEAR = b'linear'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1776 UPDATECHECK_NO_CONFLICT = b'noconflict'
42972
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42961
diff changeset
1777
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1778
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1779 def update(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1780 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1781 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1782 branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1783 force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1784 ancestor=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1785 mergeancestor=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1786 labels=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1787 matcher=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1788 mergeforce=False,
44318
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
1789 updatedirstate=True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1790 updatecheck=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1791 wc=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1792 ):
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
1793 """
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
1794 Perform a merge between the working directory and the given node
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
1795
30931
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30930
diff changeset
1796 node = the node to update to
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
1797 branchmerge = whether to merge between branches
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
1798 force = whether to force branch merging or file overwriting
27344
43c00ca887d1 merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents: 27316
diff changeset
1799 matcher = a matcher to filter file lists (dirstate not updated)
18778
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
1800 mergeancestor = whether it is merging with an ancestor. If true,
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
1801 we should accept the incoming changes for any prompts that occur.
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
1802 If false, merging with an ancestor (fast-forward) is only allowed
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
1803 between different named branches. This flag is used by rebase extension
1ef89df2c248 rebase: fix --collapse when a file was added then removed
Durham Goode <durham@fb.com>
parents: 18651
diff changeset
1804 as a temporary fix and should be avoided in general.
28019
e81d11794036 merge: add missing doc for 'labels' parameter
Siddharth Agarwal <sid0@fb.com>
parents: 28018
diff changeset
1805 labels = labels to use for base, local and other
28020
cffa46cbdb8f merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents: 28019
diff changeset
1806 mergeforce = whether the merge was run with 'merge --force' (deprecated): if
cffa46cbdb8f merge: tell _checkunknownfiles about whether this was merge --force
Siddharth Agarwal <sid0@fb.com>
parents: 28019
diff changeset
1807 this is True, then 'force' should be True as well.
9716
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
1808
34919
1856de4d1297 update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents: 34885
diff changeset
1809 The table below shows all the behaviors of the update command given the
1856de4d1297 update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents: 34885
diff changeset
1810 -c/--check and -C/--clean or no options, whether the working directory is
1856de4d1297 update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents: 34885
diff changeset
1811 dirty, whether a revision is specified, and the relationship of the parent
1856de4d1297 update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents: 34885
diff changeset
1812 rev to the target rev (linear or not). Match from top first. The -n
1856de4d1297 update: mention long options explicitly in description of merge.update()
muxator <a.mux@inwind.it>
parents: 34885
diff changeset
1813 option doesn't exist on the command line, but represents the
31178
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1814 experimental.updatecheck=noconflict option.
9716
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
1815
12279
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 12032
diff changeset
1816 This logic is tested by test-update-branches.t.
9716
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
1817
31178
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1818 -c -C -n -m dirty rev linear | result
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1819 y y * * * * * | (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1820 y * y * * * * | (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1821 y * * y * * * | (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1822 * y y * * * * | (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1823 * y * y * * * | (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1824 * * y y * * * | (1)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1825 * * * * * n n | x
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1826 * * * * n * * | ok
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1827 n n n n y * y | merge
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1828 n n n n y y n | (2)
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1829 n n n y y * * | merge
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1830 n n y n y * * | merge if no conflict
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1831 n y n n y * * | discard
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1832 y n n n y * * | (3)
9716
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
1833
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
1834 x = can't happen
ea8c207a0f78 update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents: 9467
diff changeset
1835 * = don't-care
31171
351207bfdde9 merge: move "incompatible options" case first in docstring table
Martin von Zweigbergk <martinvonz@google.com>
parents: 31170
diff changeset
1836 1 = incompatible options (checked in commands.py)
351207bfdde9 merge: move "incompatible options" case first in docstring table
Martin von Zweigbergk <martinvonz@google.com>
parents: 31170
diff changeset
1837 2 = abort: uncommitted changes (commit or update --clean to discard changes)
351207bfdde9 merge: move "incompatible options" case first in docstring table
Martin von Zweigbergk <martinvonz@google.com>
parents: 31170
diff changeset
1838 3 = abort: uncommitted changes (checked in commands.py)
13162
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13158
diff changeset
1839
34309
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34157
diff changeset
1840 The merge is performed inside ``wc``, a workingctx-like objects. It defaults
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34157
diff changeset
1841 to repo[None] if None is passed.
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34157
diff changeset
1842
13162
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13158
diff changeset
1843 Return the same tuple as applyupdates().
3315
38be819a1225 merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents: 3314
diff changeset
1844 """
33321
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
1845 # Avoid cycle.
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
1846 from . import sparse
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
1847
31176
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31175
diff changeset
1848 # This function used to find the default destination if node was None, but
30931
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30930
diff changeset
1849 # that's now in destutil.py.
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30930
diff changeset
1850 assert node is not None
31176
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31175
diff changeset
1851 if not branchmerge and not force:
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31175
diff changeset
1852 # TODO: remove the default once all callers that pass branchmerge=False
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31175
diff changeset
1853 # and force=False pass a value for updatecheck. We may want to allow
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31175
diff changeset
1854 # updatecheck='abort' to better suppport some of these callers.
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31175
diff changeset
1855 if updatecheck is None:
42972
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42961
diff changeset
1856 updatecheck = UPDATECHECK_LINEAR
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1857 if updatecheck not in (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1858 UPDATECHECK_NONE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1859 UPDATECHECK_LINEAR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1860 UPDATECHECK_NO_CONFLICT,
42974
71bb9363818c merge: check argument value with if/raise instead of an assert
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
1861 ):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1862 raise ValueError(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1863 r'Invalid updatecheck %r (can accept %r)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1864 % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1865 updatecheck,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1866 (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1867 UPDATECHECK_NONE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1868 UPDATECHECK_LINEAR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1869 UPDATECHECK_NO_CONFLICT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1870 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1871 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1872 )
45019
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44980
diff changeset
1873 if wc is not None and wc.isinmemory():
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44980
diff changeset
1874 maybe_wlock = util.nullcontextmanager()
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44980
diff changeset
1875 else:
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44980
diff changeset
1876 maybe_wlock = repo.wlock()
d1471dbbdd63 merge: don't grab wlock when merging in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 44980
diff changeset
1877 with maybe_wlock:
34309
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34157
diff changeset
1878 if wc is None:
440ece43024c merge: allow a custom working context to be passed to update
Phil Cohen <phillco@fb.com>
parents: 34157
diff changeset
1879 wc = repo[None]
20279
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
1880 pl = wc.parents()
5b4f963d21cc merge: refactor initialization of variables in update
Sean Farley <sean.michael.farley@gmail.com>
parents: 20278
diff changeset
1881 p1 = pl[0]
42428
72522fe7fb95 merge: reorder some initialization to make more sense
Martin von Zweigbergk <martinvonz@google.com>
parents: 42205
diff changeset
1882 p2 = repo[node]
23405
2a038deeac9a merge: 0 is a valid ancestor different from None
Mads Kiilerich <madski@unity3d.com>
parents: 23398
diff changeset
1883 if ancestor is not None:
21081
ffd7b6ce46ff merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents: 21080
diff changeset
1884 pas = [repo[ancestor]]
42429
a5b5ecff5f37 merge: simplify initialization of "pas"
Martin von Zweigbergk <martinvonz@google.com>
parents: 42428
diff changeset
1885 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1886 if repo.ui.configlist(b'merge', b'preferancestor') == [b'*']:
21128
f4014f646f71 merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21082
diff changeset
1887 cahs = repo.changelog.commonancestorsheads(p1.node(), p2.node())
f4014f646f71 merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21082
diff changeset
1888 pas = [repo[anc] for anc in (sorted(cahs) or [nullid])]
f4014f646f71 merge: with merge.preferancestor=*, run an auction with bids from ancestors
Mads Kiilerich <madski@unity3d.com>
parents: 21082
diff changeset
1889 else:
22179
46308fadaa15 merge: show the scary multiple ancestor hint for merges only, not for updates
Mads Kiilerich <madski@unity3d.com>
parents: 21551
diff changeset
1890 pas = [p1.ancestor(p2, warn=branchmerge)]
13874
9d67277c9204 merge: add ancestor to the update function
Matt Mackall <mpm@selenic.com>
parents: 13728
diff changeset
1891
36215
187f2474bc11 merge: coerce nodes to bytes, not str
Augie Fackler <augie@google.com>
parents: 36180
diff changeset
1892 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), bytes(p1), bytes(p2)
3314
b16456909a0a merge: various tidying
Matt Mackall <mpm@selenic.com>
parents: 3312
diff changeset
1893
42428
72522fe7fb95 merge: reorder some initialization to make more sense
Martin von Zweigbergk <martinvonz@google.com>
parents: 42205
diff changeset
1894 overwrite = force and not branchmerge
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
1895 ### check phase
27316
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
1896 if not overwrite:
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
1897 if len(pl) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1898 raise error.Abort(_(b"outstanding uncommitted merge"))
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1899 ms = mergestatemod.mergestate.read(repo)
27316
777f668eca70 merge: refuse update/merge if there are unresolved conflicts (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27267
diff changeset
1900 if list(ms.unresolved()):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1901 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1902 _(b"outstanding merge conflicts"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1903 hint=_(b"use 'hg resolve' to resolve"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1904 )
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
1905 if branchmerge:
21081
ffd7b6ce46ff merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents: 21080
diff changeset
1906 if pas == [p2]:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1907 raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1908 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1909 b"merging with a working directory ancestor"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1910 b" has no effect"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1911 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1912 )
21081
ffd7b6ce46ff merge: pass merge ancestor to calculateupdates as a list
Mads Kiilerich <madski@unity3d.com>
parents: 21080
diff changeset
1913 elif pas == [p1]:
31388
b6a6df38a802 merge: check current wc branch for 'nothing to merge', not its p1
Mads Kiilerich <mads@kiilerich.com>
parents: 31332
diff changeset
1914 if not mergeancestor and wc.branch() == p2.branch():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1915 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1916 _(b"nothing to merge"),
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
1917 hint=_(b"use 'hg update' or check 'hg heads'"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1918 )
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
1919 if not force and (wc.files() or wc.deleted()):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1920 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1921 _(b"uncommitted changes"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1922 hint=_(b"use 'hg status' to list changes"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1923 )
35293
1b03407e808d merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents: 35292
diff changeset
1924 if not wc.isinmemory():
1b03407e808d merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents: 35292
diff changeset
1925 for s in sorted(wc.substate):
1b03407e808d merge: skip subrepo state, update hooks, and updating the dirstate in IMM
Phil Cohen <phillco@fb.com>
parents: 35292
diff changeset
1926 wc.sub(s).bailifchanged()
13437
6169493ac3f9 Do not allow merging with uncommitted changes in a subrepo
Oleg Stepanov <oleg.stepanov@jetbrains.com>
parents: 13400
diff changeset
1927
6375
cdc458b12f0f update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents: 6350
diff changeset
1928 elif not overwrite:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1929 if p1 == p2: # no-op update
19929
ab2362e1672e merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 19803
diff changeset
1930 # call the hooks and exit early
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1931 repo.hook(b'preupdate', throw=True, parent1=xp2, parent2=b'')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1932 repo.hook(b'update', parent1=xp2, parent2=b'', error=0)
37110
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37090
diff changeset
1933 return updateresult(0, 0, 0, 0)
19929
ab2362e1672e merge: exit early during a no-op update (BC)
Siddharth Agarwal <sid0@fb.com>
parents: 19803
diff changeset
1934
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1935 if updatecheck == UPDATECHECK_LINEAR and pas not in (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1936 [p1],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1937 [p2],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1938 ): # nonlinear
18985
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
1939 dirty = wc.dirty(missing=True)
30931
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30930
diff changeset
1940 if dirty:
18985
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
1941 # Branching is a bit strange to ensure we do the minimal
33152
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33107
diff changeset
1942 # amount of call to obsutil.foreground.
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33107
diff changeset
1943 foreground = obsutil.foreground(repo, [p1.node()])
18985
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
1944 # note: the <node> variable contains a random identifier
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
1945 if repo[node].node() in foreground:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1946 pass # allow updating to successors
30931
e6932e9a262a merge: remove unused handling of default destination in merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30930
diff changeset
1947 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1948 msg = _(b"uncommitted changes")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1949 hint = _(b"commit or update --clean to discard changes")
30981
330fbd515512 destutil: remove duplicate check and leave it to merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30932
diff changeset
1950 raise error.UpdateAbort(msg, hint=hint)
18985
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
1951 else:
a59e575c6ff8 update: allow dirty update to foreground (successors)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18895
diff changeset
1952 # Allow jumping branches if clean and specific rev given
30930
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
1953 pass
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
1954
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
1955 if overwrite:
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
1956 pas = [wc]
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
1957 elif not branchmerge:
47278970fc8c update: localize logic around which ancestor to use
Martin von Zweigbergk <martinvonz@google.com>
parents: 30859
diff changeset
1958 pas = [p1]
2814
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
1959
25843
bf9ea348b487 merge: mark ancient debugging option
Matt Mackall <mpm@selenic.com>
parents: 25754
diff changeset
1960 # deprecated config: merge.followcopies
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1961 followcopies = repo.ui.configbool(b'merge', b'followcopies')
21080
04540a8499a3 merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents: 21024
diff changeset
1962 if overwrite:
30200
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
1963 followcopies = False
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
1964 elif not pas[0]:
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
1965 followcopies = False
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
1966 if not branchmerge and not wc.dirty(missing=True):
a2804ddcf9ae update: enable copy tracing for backwards and non-linear updates
G?bor Stefanik <gabor.stefanik@nng.com>
parents: 30172
diff changeset
1967 followcopies = False
21080
04540a8499a3 merge: move ancestor selection tweaking from manifestmerge to update function
Mads Kiilerich <madski@unity3d.com>
parents: 21024
diff changeset
1968
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
1969 ### calculate phase
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
1970 mresult = calculateupdates(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1971 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1972 wc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1973 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1974 pas,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1975 branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1976 force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1977 mergeancestor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1978 followcopies,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1979 matcher=matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1980 mergeforce=mergeforce,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
1981 )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
1982
42972
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42961
diff changeset
1983 if updatecheck == UPDATECHECK_NO_CONFLICT:
45299
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45298
diff changeset
1984 if mresult.hasconflicts():
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45298
diff changeset
1985 msg = _(b"conflicting changes")
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45298
diff changeset
1986 hint = _(b"commit or update --clean to discard changes")
0c849f0166c2 merge: introduce hasconflicts() on mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45298
diff changeset
1987 raise error.Abort(msg, hint=hint)
31178
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31176
diff changeset
1988
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
1989 # Prompt and create actions. Most of this is in the resolve phase
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
1990 # already, but we can't handle .hgsubstate in filemerge or
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
1991 # subrepoutil.submerge yet so we have to keep prompting for it.
45365
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45364
diff changeset
1992 vals = mresult.getfile(b'.hgsubstate')
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45364
diff changeset
1993 if vals:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1994 f = b'.hgsubstate'
45365
4c6004afd836 mergeresult: introduce getfile() and use it where required
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45364
diff changeset
1995 m, args, msg = vals
29785
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29629
diff changeset
1996 prompts = filemerge.partextras(labels)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1997 prompts[b'f'] = f
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
1998 if m == mergestatemod.ACTION_CHANGED_DELETED:
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
1999 if repo.ui.promptchoice(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2000 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2001 b"local%(l)s changed %(f)s which other%(o)s deleted\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2002 b"use (c)hanged version or (d)elete?"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2003 b"$$ &Changed $$ &Delete"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2004 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2005 % prompts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2006 0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2007 ):
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
2008 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
2009 f, mergestatemod.ACTION_REMOVE, None, b'prompt delete',
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
2010 )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
2011 elif f in p1:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
2012 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
2013 f,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
2014 mergestatemod.ACTION_ADD_MODIFIED,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2015 None,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2016 b'prompt keep',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2017 )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
2018 else:
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
2019 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
2020 f, mergestatemod.ACTION_ADD, None, b'prompt keep',
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
2021 )
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
2022 elif m == mergestatemod.ACTION_DELETED_CHANGED:
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
2023 f1, f2, fa, move, anc = args
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
2024 flags = p2[f2].flags()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2025 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2026 repo.ui.promptchoice(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2027 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2028 b"other%(o)s changed %(f)s which local%(l)s deleted\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2029 b"use (c)hanged version or leave (d)eleted?"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2030 b"$$ &Changed $$ &Deleted"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2031 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2032 % prompts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2033 0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2034 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2035 == 0
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2036 ):
45303
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
2037 mresult.addfile(
b442920ab1de merge: introduce mergeresult.addfile() and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
2038 f,
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
2039 mergestatemod.ACTION_GET,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2040 (flags, False),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2041 b'prompt recreating',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2042 )
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
2043 else:
45304
f1fb9a079131 merge: add removefile() to mergeresult object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45303
diff changeset
2044 mresult.removefile(f)
27951
6bce6d925e45 merge: don't try to merge subrepos twice (issue4988)
Siddharth Agarwal <sid0@fb.com>
parents: 27852
diff changeset
2045
29893
6f447b9ec263 util: rename checkcase() to fscasesensitive() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 29842
diff changeset
2046 if not util.fscasesensitive(repo.path):
23544
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
2047 # check collision between files only in p2 for clean update
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2048 if not branchmerge and (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2049 force or not wc.dirty(missing=True, branch=False)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2050 ):
23544
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
2051 _checkcollision(repo, p2.manifest(), None)
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
2052 else:
45354
f569ca3eb430 merge: pass mergeresult obj instead of actions in _checkcollision() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45320
diff changeset
2053 _checkcollision(repo, wc.manifest(), mresult)
23544
7cc0fb0080b6 merge: perform case-collision checking on final set of actions
Martin von Zweigbergk <martinvonz@google.com>
parents: 23541
diff changeset
2054
23525
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
2055 # divergent renames
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
2056 for f, fl in sorted(pycompat.iteritems(mresult.diverge)):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2057 repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2058 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2059 b"note: possible conflict - %s was renamed "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2060 b"multiple times to:\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2061 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2062 % f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2063 )
42110
3a7efcbdf288 copies: print list of divergent renames in sorted order
Martin von Zweigbergk <martinvonz@google.com>
parents: 42057
diff changeset
2064 for nf in sorted(fl):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2065 repo.ui.warn(b" %s\n" % nf)
23525
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
2066
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
2067 # rename and delete
45295
0e18861f96ab merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45168
diff changeset
2068 for f, fl in sorted(pycompat.iteritems(mresult.renamedelete)):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2069 repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2070 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2071 b"note: possible conflict - %s was deleted "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2072 b"and renamed to:\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2073 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2074 % f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2075 )
42110
3a7efcbdf288 copies: print list of divergent renames in sorted order
Martin von Zweigbergk <martinvonz@google.com>
parents: 42057
diff changeset
2076 for nf in sorted(fl):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2077 repo.ui.warn(b" %s\n" % nf)
23525
5126d7718d7c merge: move dr/rd warning messages out of applyupdates()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23524
diff changeset
2078
26957
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
2079 ### apply phase
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2080 if not branchmerge: # just jump to the new rev
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2081 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, b''
44245
ae9310709c13 merge: move definition of `partial` closer to where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 44236
diff changeset
2082 # If we're doing a partial update, we need to skip updating
44246
faec51c76b7b merge: avoid a negation in the definition of updatedirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44245
diff changeset
2083 # the dirstate.
faec51c76b7b merge: avoid a negation in the definition of updatedirstate
Martin von Zweigbergk <martinvonz@google.com>
parents: 44245
diff changeset
2084 always = matcher is None or matcher.always()
44318
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2085 updatedirstate = updatedirstate and always and not wc.isinmemory()
44236
d1c0f239193f merge: define updatedirstate a little earlier and reuse it
Martin von Zweigbergk <martinvonz@google.com>
parents: 44235
diff changeset
2086 if updatedirstate:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2087 repo.hook(b'preupdate', throw=True, parent1=xp1, parent2=xp2)
26957
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
2088 # note that we're in the middle of an update
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2089 repo.vfs.write(b'updatestate', p2.hex())
26957
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
2090
45167
796b63b0f0dd merge: refactor code to advise fsmonitor in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45159
diff changeset
2091 _advertisefsmonitor(
45359
72b8c082676b mergeresult: implement a len() function and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45358
diff changeset
2092 repo, mresult.len((mergestatemod.ACTION_GET,)), p1.node()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2093 )
34885
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34787
diff changeset
2094
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
2095 wantfiledata = updatedirstate and not branchmerge
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2096 stats, getfiledata = applyupdates(
45370
442823f66889 merge: drop commitinfo argument to applyupdates (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45369
diff changeset
2097 repo, mresult, wc, p2, overwrite, wantfiledata, labels=labels,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2098 )
26957
d16d73173fdd merge: move messages about possible conflicts a litte earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 26949
diff changeset
2099
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42431
diff changeset
2100 if updatedirstate:
32390
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32286
diff changeset
2101 with repo.dirstate.parentchange():
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32286
diff changeset
2102 repo.setparents(fp1, fp2)
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
2103 mergestatemod.recordupdates(
45355
b9b055f15035 merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45354
diff changeset
2104 repo, mresult.actionsdict, branchmerge, getfiledata
44915
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44688
diff changeset
2105 )
32390
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32286
diff changeset
2106 # update completed, clear state
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2107 util.unlink(repo.vfs.join(b'updatestate'))
19482
499fc471296b update: add tracking of interrupted updates (issue3113)
Matt Mackall <mpm@selenic.com>
parents: 19285
diff changeset
2108
32390
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32286
diff changeset
2109 if not branchmerge:
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32286
diff changeset
2110 repo.dirstate.setbranch(p2.branch())
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10431
diff changeset
2111
33321
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
2112 # If we're updating to a location, clean up any stale temporary includes
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
2113 # (ex: this happens during hg rebase --abort).
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
2114 if not branchmerge:
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
2115 sparse.prunetemporaryincludes(repo)
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33311
diff changeset
2116
44235
ff22c76825b9 merge: don't call update hook when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 44092
diff changeset
2117 if updatedirstate:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2118 repo.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2119 b'update', parent1=xp1, parent2=xp2, error=stats.unresolvedcount
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2120 )
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10431
diff changeset
2121 return stats
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
2122
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2123
44430
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2124 def merge(ctx, labels=None, force=False, wc=None):
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2125 """Merge another topological branch into the working copy.
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2126
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2127 force = whether the merge was run with 'merge --force' (deprecated)
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2128 """
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2129
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2130 return update(
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2131 ctx.repo(),
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2132 ctx.rev(),
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2133 labels=labels,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2134 branchmerge=True,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2135 force=force,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2136 mergeforce=force,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2137 wc=wc,
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2138 )
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2139
a45ffad9ae98 merge: introduce a merge() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44425
diff changeset
2140
44317
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
2141 def clean_update(ctx, wc=None):
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
2142 """Do a clean update to the given commit.
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
2143
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
2144 This involves updating to the commit and discarding any changes in the
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
2145 working copy.
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
2146 """
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
2147 return update(ctx.repo(), ctx.rev(), branchmerge=False, force=True, wc=wc)
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
2148
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44289
diff changeset
2149
44318
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2150 def revert_to(ctx, matcher=None, wc=None):
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2151 """Revert the working copy to the given commit.
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2152
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2153 The working copy will keep its current parent(s) but its content will
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2154 be the same as in the given commit.
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2155 """
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2156
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2157 return update(
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2158 ctx.repo(),
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2159 ctx.rev(),
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2160 branchmerge=False,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2161 force=True,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2162 updatedirstate=False,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2163 matcher=matcher,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2164 wc=wc,
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2165 )
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2166
c791ed6a2154 merge: introduce a revert_to() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44317
diff changeset
2167
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2168 def graft(
44285
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2169 repo,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2170 ctx,
44286
cb8b67016110 graft: default `base` argument to common case of `ctx.p1()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44285
diff changeset
2171 base=None,
44285
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2172 labels=None,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2173 keepparent=False,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2174 keepconflictparent=False,
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2175 wctx=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2176 ):
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
2177 """Do a graft-like merge.
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
2178
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
2179 This is a merge where the merge ancestor is chosen such that one
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
2180 or more changesets are grafted onto the current changeset. In
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
2181 addition to the merge, this fixes up the dirstate to include only
27267
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
2182 a single parent (if keepparent is False) and tries to duplicate any
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
2183 renames/copies appropriately.
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
2184
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
2185 ctx - changeset to rebase
44286
cb8b67016110 graft: default `base` argument to common case of `ctx.p1()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44285
diff changeset
2186 base - merge base, or ctx.p1() if not specified
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
2187 labels - merge labels eg ['local', 'graft']
27267
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
2188 keepparent - keep second parent if any
42431
127937874395 merge: correct argument name in docstring
Anton Shestakov <av6@dwimlabs.net>
parents: 42429
diff changeset
2189 keepconflictparent - if unresolved, keep parent used for the merge
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
2190
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
2191 """
24643
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
2192 # If we're grafting a descendant onto an ancestor, be sure to pass
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
2193 # mergeancestor=True to update. This does two things: 1) allows the merge if
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
2194 # the destination is the same as the parent of the ctx (so we can use graft
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
2195 # to copy commits), and 2) informs update that the incoming changes are
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
2196 # newer than the destination so it doesn't prompt about "remote changed foo
a8e6897dffbe graft: allow creating sibling grafts
Durham Goode <durham@fb.com>
parents: 24471
diff changeset
2197 # which local deleted".
44414
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44335
diff changeset
2198 # We also pass mergeancestor=True when base is the same revision as p1. 2)
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44335
diff changeset
2199 # doesn't matter as there can't possibly be conflicts, but 1) is necessary.
44285
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2200 wctx = wctx or repo[None]
44089
bd22e90c54b3 graft: extract repo[None] to a variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 44060
diff changeset
2201 pctx = wctx.p1()
44286
cb8b67016110 graft: default `base` argument to common case of `ctx.p1()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44285
diff changeset
2202 base = base or ctx.p1()
44414
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44335
diff changeset
2203 mergeancestor = (
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44335
diff changeset
2204 repo.changelog.isancestor(pctx.node(), ctx.node())
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44335
diff changeset
2205 or pctx.rev() == base.rev()
218feb1a7e00 graft: always allow hg graft --base . (issue6248)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44335
diff changeset
2206 )
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
2207
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2208 stats = update(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2209 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2210 ctx.node(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2211 True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2212 True,
43814
ebfd349eac46 graft: rename `pctx` argument to `base` since that's what it is
Martin von Zweigbergk <martinvonz@google.com>
parents: 43807
diff changeset
2213 base.node(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2214 mergeancestor=mergeancestor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2215 labels=labels,
44285
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2216 wc=wctx,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2217 )
38498
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38431
diff changeset
2218
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38431
diff changeset
2219 if keepconflictparent and stats.unresolvedcount:
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38431
diff changeset
2220 pother = ctx.node()
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38431
diff changeset
2221 else:
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38431
diff changeset
2222 pother = nullid
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38431
diff changeset
2223 parents = ctx.parents()
43814
ebfd349eac46 graft: rename `pctx` argument to `base` since that's what it is
Martin von Zweigbergk <martinvonz@google.com>
parents: 43807
diff changeset
2224 if keepparent and len(parents) == 2 and base in parents:
ebfd349eac46 graft: rename `pctx` argument to `base` since that's what it is
Martin von Zweigbergk <martinvonz@google.com>
parents: 43807
diff changeset
2225 parents.remove(base)
38498
d4be8ea8f22d merge: add a 'keepconflictparent' argument to graft
Boris Feld <boris.feld@octobus.net>
parents: 38431
diff changeset
2226 pother = parents[0].node()
43816
32d11a23c9cf graft: never set both parents equal in the dirstate (issue6098)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43815
diff changeset
2227 # Never set both parents equal to each other
32d11a23c9cf graft: never set both parents equal in the dirstate (issue6098)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43815
diff changeset
2228 if pother == pctx.node():
32d11a23c9cf graft: never set both parents equal in the dirstate (issue6098)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43815
diff changeset
2229 pother = nullid
27267
d6859d86a5d5 merge.graft: add option to keep second parent
Andrew Halberstadt <ahalberstadt@mozilla.com>
parents: 27137
diff changeset
2230
44285
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2231 if wctx.isinmemory():
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2232 wctx.setparents(pctx.node(), pother)
32390
c568c187102f merge: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32286
diff changeset
2233 # fix up dirstate for copies and renames
44092
833210fbd900 graftcopies: remove `skip` and `repo` arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 44090
diff changeset
2234 copies.graftcopies(wctx, ctx, base)
44285
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2235 else:
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2236 with repo.dirstate.parentchange():
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2237 repo.setparents(pctx.node(), pother)
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2238 repo.dirstate.write(repo.currenttransaction())
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2239 # fix up dirstate for copies and renames
fc7175df6359 graft: let caller pass in overlayworkingctx to merge.graft()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44275
diff changeset
2240 copies.graftcopies(wctx, ctx, base)
22902
ce0592328d68 merge: add merge.graft helper
Matt Mackall <mpm@selenic.com>
parents: 22841
diff changeset
2241 return stats
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2242
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2243
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2244 def purge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2245 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2246 matcher,
44335
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44333
diff changeset
2247 unknown=True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2248 ignored=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2249 removeemptydirs=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2250 removefiles=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2251 abortonerror=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2252 noop=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42974
diff changeset
2253 ):
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2254 """Purge the working directory of untracked files.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2255
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2256 ``matcher`` is a matcher configured to scan the working directory -
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2257 potentially a subset.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2258
44335
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44333
diff changeset
2259 ``unknown`` controls whether unknown files should be purged.
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44333
diff changeset
2260
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44333
diff changeset
2261 ``ignored`` controls whether ignored files should be purged.
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2262
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2263 ``removeemptydirs`` controls whether empty directories should be removed.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2264
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2265 ``removefiles`` controls whether files are removed.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2266
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2267 ``abortonerror`` causes an exception to be raised if an error occurs
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2268 deleting a file or directory.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2269
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2270 ``noop`` controls whether to actually remove files. If not defined, actions
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2271 will be taken.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2272
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2273 Returns an iterable of relative paths in the working directory that were
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2274 or would be removed.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2275 """
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2276
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2277 def remove(removefn, path):
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2278 try:
39481
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39480
diff changeset
2279 removefn(path)
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2280 except OSError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2281 m = _(b'%s cannot be removed') % path
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2282 if abortonerror:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2283 raise error.Abort(m)
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2284 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2285 repo.ui.warn(_(b'warning: %s\n') % m)
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2286
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2287 # There's no API to copy a matcher. So mutate the passed matcher and
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2288 # restore it when we're done.
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2289 oldtraversedir = matcher.traversedir
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2290
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2291 res = []
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2292
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2293 try:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2294 if removeemptydirs:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2295 directories = []
43752
95d2eab0a7b9 dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents: 43677
diff changeset
2296 matcher.traversedir = directories.append
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2297
44335
9f8eddd2723f purge: add -i flag to delete ignored files instead of untracked files
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44333
diff changeset
2298 status = repo.status(match=matcher, ignored=ignored, unknown=unknown)
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2299
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2300 if removefiles:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2301 for f in sorted(status.unknown + status.ignored):
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2302 if not noop:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2303 repo.ui.note(_(b'removing file %s\n') % f)
39481
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39480
diff changeset
2304 remove(repo.wvfs.unlink, f)
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2305 res.append(f)
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2306
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2307 if removeemptydirs:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2308 for f in sorted(directories, reverse=True):
39481
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39480
diff changeset
2309 if matcher(f) and not repo.wvfs.listdir(f):
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2310 if not noop:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2311 repo.ui.note(_(b'removing directory %s\n') % f)
39481
3dd34b401bc2 merge: use vfs methods for I/O
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39480
diff changeset
2312 remove(repo.wvfs.rmdir, f)
39480
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2313 res.append(f)
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2314
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2315 return res
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2316
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2317 finally:
7fea205fd5dc merge: move purge logic from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38757
diff changeset
2318 matcher.traversedir = oldtraversedir