Mercurial > public > mercurial-scm > hg
comparison mercurial/merge.py @ 45293:4e6a2889dd1d
merge: use the new action based mapping introduced in mergeresult obj
Before this patch, we have good number of instances of following types:
```
for f, (m, args, msg) in mresult.actions:
if m == ACTION_X:
do_something
```
We iterate over the whole list and then filter for a certain action. Previous
patch introduced a action based mapping in mergeresult object. The above code
now looks like:
```
for f, args, msg in mresult.getactions([ACTION_X, ...]):
do_something
```
Differential Revision: https://phab.mercurial-scm.org/D8831
author | Pulkit Goyal <7895pulkit@gmail.com> |
---|---|
date | Sun, 02 Aug 2020 10:24:28 -0700 |
parents | 69691c5b8ce4 |
children | cb0cd87e16b4 |
comparison
equal
deleted
inserted
replaced
45292:69691c5b8ce4 | 45293:4e6a2889dd1d |
---|---|
149 abortconflicts.update(conflicts) | 149 abortconflicts.update(conflicts) |
150 elif config == b'warn': | 150 elif config == b'warn': |
151 warnconflicts.update(conflicts) | 151 warnconflicts.update(conflicts) |
152 | 152 |
153 checkunknowndirs = _unknowndirschecker() | 153 checkunknowndirs = _unknowndirschecker() |
154 for f, (m, args, msg) in pycompat.iteritems(mresult.actions): | 154 for f, args, msg in mresult.getactions( |
155 if m in ( | 155 [ |
156 mergestatemod.ACTION_CREATED, | 156 mergestatemod.ACTION_CREATED, |
157 mergestatemod.ACTION_DELETED_CHANGED, | 157 mergestatemod.ACTION_DELETED_CHANGED, |
158 ): | 158 ] |
159 if _checkunknownfile(repo, wctx, mctx, f): | 159 ): |
160 fileconflicts.add(f) | 160 if _checkunknownfile(repo, wctx, mctx, f): |
161 elif pathconfig and f not in wctx: | 161 fileconflicts.add(f) |
162 path = checkunknowndirs(repo, wctx, f) | 162 elif pathconfig and f not in wctx: |
163 if path is not None: | 163 path = checkunknowndirs(repo, wctx, f) |
164 pathconflicts.add(path) | 164 if path is not None: |
165 elif m == mergestatemod.ACTION_LOCAL_DIR_RENAME_GET: | 165 pathconflicts.add(path) |
166 if _checkunknownfile(repo, wctx, mctx, f, args[0]): | 166 for f, args, msg in mresult.getactions( |
167 fileconflicts.add(f) | 167 [mergestatemod.ACTION_LOCAL_DIR_RENAME_GET] |
168 ): | |
169 if _checkunknownfile(repo, wctx, mctx, f, args[0]): | |
170 fileconflicts.add(f) | |
168 | 171 |
169 allconflicts = fileconflicts | pathconflicts | 172 allconflicts = fileconflicts | pathconflicts |
170 ignoredconflicts = {c for c in allconflicts if repo.dirstate._ignore(c)} | 173 ignoredconflicts = {c for c in allconflicts if repo.dirstate._ignore(c)} |
171 unknownconflicts = allconflicts - ignoredconflicts | 174 unknownconflicts = allconflicts - ignoredconflicts |
172 collectconflicts(ignoredconflicts, ignoredconfig) | 175 collectconflicts(ignoredconflicts, ignoredconfig) |
173 collectconflicts(unknownconflicts, unknownconfig) | 176 collectconflicts(unknownconflicts, unknownconfig) |
174 else: | 177 else: |
175 for f, (m, args, msg) in pycompat.iteritems(mresult.actions): | 178 for f, args, msg in mresult.getactions( |
176 if m == mergestatemod.ACTION_CREATED_MERGE: | 179 [mergestatemod.ACTION_CREATED_MERGE] |
177 fl2, anc = args | 180 ): |
178 different = _checkunknownfile(repo, wctx, mctx, f) | 181 fl2, anc = args |
179 if repo.dirstate._ignore(f): | 182 different = _checkunknownfile(repo, wctx, mctx, f) |
180 config = ignoredconfig | 183 if repo.dirstate._ignore(f): |
181 else: | 184 config = ignoredconfig |
182 config = unknownconfig | 185 else: |
183 | 186 config = unknownconfig |
184 # The behavior when force is True is described by this table: | 187 |
185 # config different mergeforce | action backup | 188 # The behavior when force is True is described by this table: |
186 # * n * | get n | 189 # config different mergeforce | action backup |
187 # * y y | merge - | 190 # * n * | get n |
188 # abort y n | merge - (1) | 191 # * y y | merge - |
189 # warn y n | warn + get y | 192 # abort y n | merge - (1) |
190 # ignore y n | get y | 193 # warn y n | warn + get y |
191 # | 194 # ignore y n | get y |
192 # (1) this is probably the wrong behavior here -- we should | 195 # |
193 # probably abort, but some actions like rebases currently | 196 # (1) this is probably the wrong behavior here -- we should |
194 # don't like an abort happening in the middle of | 197 # probably abort, but some actions like rebases currently |
195 # merge.update. | 198 # don't like an abort happening in the middle of |
196 if not different: | 199 # merge.update. |
197 mresult.addfile( | 200 if not different: |
198 f, | 201 mresult.addfile( |
199 mergestatemod.ACTION_GET, | 202 f, |
200 (fl2, False), | 203 mergestatemod.ACTION_GET, |
201 b'remote created', | 204 (fl2, False), |
202 ) | 205 b'remote created', |
203 elif mergeforce or config == b'abort': | 206 ) |
204 mresult.addfile( | 207 elif mergeforce or config == b'abort': |
205 f, | 208 mresult.addfile( |
206 mergestatemod.ACTION_MERGE, | 209 f, |
207 (f, f, None, False, anc), | 210 mergestatemod.ACTION_MERGE, |
208 b'remote differs from untracked local', | 211 (f, f, None, False, anc), |
209 ) | 212 b'remote differs from untracked local', |
210 elif config == b'abort': | 213 ) |
211 abortconflicts.add(f) | 214 elif config == b'abort': |
212 else: | 215 abortconflicts.add(f) |
213 if config == b'warn': | 216 else: |
214 warnconflicts.add(f) | 217 if config == b'warn': |
215 mresult.addfile( | 218 warnconflicts.add(f) |
216 f, | 219 mresult.addfile( |
217 mergestatemod.ACTION_GET, | 220 f, mergestatemod.ACTION_GET, (fl2, True), b'remote created', |
218 (fl2, True), | 221 ) |
219 b'remote created', | |
220 ) | |
221 | 222 |
222 for f in sorted(abortconflicts): | 223 for f in sorted(abortconflicts): |
223 warn = repo.ui.warn | 224 warn = repo.ui.warn |
224 if f in pathconflicts: | 225 if f in pathconflicts: |
225 if repo.wvfs.isfileorlink(f): | 226 if repo.wvfs.isfileorlink(f): |
240 if repo.wvfs.isfileorlink(f): | 241 if repo.wvfs.isfileorlink(f): |
241 repo.ui.warn(_(b"%s: replacing untracked file\n") % f) | 242 repo.ui.warn(_(b"%s: replacing untracked file\n") % f) |
242 else: | 243 else: |
243 repo.ui.warn(_(b"%s: replacing untracked files in directory\n") % f) | 244 repo.ui.warn(_(b"%s: replacing untracked files in directory\n") % f) |
244 | 245 |
245 for f, (m, args, msg) in pycompat.iteritems(mresult.actions): | 246 for f, args, msg in mresult.getactions([mergestatemod.ACTION_CREATED]): |
246 if m == mergestatemod.ACTION_CREATED: | 247 backup = ( |
247 backup = ( | 248 f in fileconflicts |
248 f in fileconflicts | 249 or f in pathconflicts |
249 or f in pathconflicts | 250 or any(p in pathconflicts for p in pathutil.finddirs(f)) |
250 or any(p in pathconflicts for p in pathutil.finddirs(f)) | 251 ) |
251 ) | 252 (flags,) = args |
252 (flags,) = args | 253 mresult.addfile(f, mergestatemod.ACTION_GET, (flags, backup), msg) |
253 mresult.addfile(f, mergestatemod.ACTION_GET, (flags, backup), msg) | |
254 | 254 |
255 | 255 |
256 def _forgetremoved(wctx, mctx, branchmerge): | 256 def _forgetremoved(wctx, mctx, branchmerge): |
257 """ | 257 """ |
258 Forget removed files | 258 Forget removed files |
648 self.addfile(f, a, data, msg) | 648 self.addfile(f, a, data, msg) |
649 | 649 |
650 def hasconflicts(self): | 650 def hasconflicts(self): |
651 """ tells whether this merge resulted in some actions which can | 651 """ tells whether this merge resulted in some actions which can |
652 result in conflicts or not """ | 652 result in conflicts or not """ |
653 for _f, (m, _unused, _unused) in pycompat.iteritems(self._filemapping): | 653 for a in self._actionmapping.keys(): |
654 if m not in ( | 654 if ( |
655 mergestatemod.ACTION_GET, | 655 a |
656 mergestatemod.ACTION_KEEP, | 656 not in ( |
657 mergestatemod.ACTION_EXEC, | 657 mergestatemod.ACTION_GET, |
658 mergestatemod.ACTION_REMOVE, | 658 mergestatemod.ACTION_KEEP, |
659 mergestatemod.ACTION_PATH_CONFLICT_RESOLVE, | 659 mergestatemod.ACTION_EXEC, |
660 mergestatemod.ACTION_REMOVE, | |
661 mergestatemod.ACTION_PATH_CONFLICT_RESOLVE, | |
662 ) | |
663 and self._actionmapping[a] | |
660 ): | 664 ): |
661 return True | 665 return True |
662 | 666 |
663 return False | 667 return False |
664 | 668 |
990 def _resolvetrivial(repo, wctx, mctx, ancestor, mresult): | 994 def _resolvetrivial(repo, wctx, mctx, ancestor, mresult): |
991 """Resolves false conflicts where the nodeid changed but the content | 995 """Resolves false conflicts where the nodeid changed but the content |
992 remained the same.""" | 996 remained the same.""" |
993 # We force a copy of actions.items() because we're going to mutate | 997 # We force a copy of actions.items() because we're going to mutate |
994 # actions as we resolve trivial conflicts. | 998 # actions as we resolve trivial conflicts. |
995 for f, (m, args, msg) in list(mresult.actions.items()): | 999 for f, args, msg in mresult.getactions( |
996 if ( | 1000 [mergestatemod.ACTION_CHANGED_DELETED] |
997 m == mergestatemod.ACTION_CHANGED_DELETED | 1001 ): |
998 and f in ancestor | 1002 if f in ancestor and not wctx[f].cmp(ancestor[f]): |
999 and not wctx[f].cmp(ancestor[f]) | |
1000 ): | |
1001 # local did change but ended up with same content | 1003 # local did change but ended up with same content |
1002 mresult.addfile( | 1004 mresult.addfile( |
1003 f, mergestatemod.ACTION_REMOVE, None, b'prompt same' | 1005 f, mergestatemod.ACTION_REMOVE, None, b'prompt same' |
1004 ) | 1006 ) |
1005 elif ( | 1007 |
1006 m == mergestatemod.ACTION_DELETED_CHANGED | 1008 for f, args, msg in list( |
1007 and f in ancestor | 1009 mresult.getactions([mergestatemod.ACTION_DELETED_CHANGED]) |
1008 and not mctx[f].cmp(ancestor[f]) | 1010 ): |
1009 ): | 1011 if f in ancestor and not mctx[f].cmp(ancestor[f]): |
1010 # remote did change but ended up with same content | 1012 # remote did change but ended up with same content |
1011 mresult.removefile(f) # don't get = keep local deleted | 1013 mresult.removefile(f) # don't get = keep local deleted |
1012 | 1014 |
1013 | 1015 |
1014 def calculateupdates( | 1016 def calculateupdates( |